From ac99a2774ae160c3450d00e944afb675096c5c60 Mon Sep 17 00:00:00 2001 From: MMS Date: Thu, 8 Feb 2024 21:09:29 -0500 Subject: [PATCH] 7.3.3 --- .gitmodules | 3 + 3rd_party | 2 +- examples | 1 + examples/arm-cm/README.md | 146 - .../arm-cm/blinky_ek-tm4c123gxl/README.md | 81 - .../arm-cm/blinky_ek-tm4c123gxl/blinky.cpp | 123 - .../arm-cm/blinky_ek-tm4c123gxl/blinky.hpp | 53 - examples/arm-cm/blinky_ek-tm4c123gxl/bsp.hpp | 50 - .../blinky_ek-tm4c123gxl/ek-tm4c123gxl.jpg | Bin 50478 -> 0 bytes examples/arm-cm/blinky_ek-tm4c123gxl/main.cpp | 44 - .../qk/armclang/README.txt | 61 - .../qk/armclang/blinky-qk.sct | 23 - .../qk/armclang/blinky-qk.uvoptx | 1004 -- .../qk/armclang/blinky-qk.uvprojx | 1792 --- .../arm-cm/blinky_ek-tm4c123gxl/qk/bsp.cpp | 252 - .../blinky_ek-tm4c123gxl/qk/gnu/Makefile | 309 - .../blinky_ek-tm4c123gxl/qk/gnu/README.txt | 71 - .../blinky_ek-tm4c123gxl/qk/gnu/blinky-qk.ld | 139 - .../blinky_ek-tm4c123gxl/qk/gnu/flash.bat | 33 - .../blinky_ek-tm4c123gxl/qk/iar/README.txt | 53 - .../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd | 4654 ------ .../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp | 3347 ----- .../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww | 10 - .../blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf | 29 - .../qv/armclang/README.txt | 61 - .../qv/armclang/blinky-qv.sct | 23 - .../qv/armclang/blinky-qv.uvoptx | 976 -- .../qv/armclang/blinky-qv.uvprojx | 1792 --- .../arm-cm/blinky_ek-tm4c123gxl/qv/bsp.cpp | 252 - .../blinky_ek-tm4c123gxl/qv/gnu/Makefile | 309 - .../blinky_ek-tm4c123gxl/qv/gnu/README.txt | 71 - .../blinky_ek-tm4c123gxl/qv/gnu/blinky-qv.ld | 139 - .../blinky_ek-tm4c123gxl/qv/gnu/flash.bat | 33 - .../blinky_ek-tm4c123gxl/qv/iar/README.txt | 53 - .../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd | 4654 ------ .../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp | 3341 ----- .../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww | 10 - .../blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf | 29 - .../arm-cm/blinky_nucleo-c031c6/README.md | 80 - .../arm-cm/blinky_nucleo-c031c6/blinky.cpp | 123 - .../arm-cm/blinky_nucleo-c031c6/blinky.hpp | 53 - examples/arm-cm/blinky_nucleo-c031c6/bsp.hpp | 50 - examples/arm-cm/blinky_nucleo-c031c6/main.cpp | 44 - .../qk/armclang/blinky-qk.sct | 23 - .../qk/armclang/blinky-qk.uvoptx | 1024 -- .../qk/armclang/blinky-qk.uvprojx | 1823 --- .../arm-cm/blinky_nucleo-c031c6/qk/bsp.cpp | 248 - .../blinky_nucleo-c031c6/qk/gnu/Makefile | 311 - .../blinky_nucleo-c031c6/qk/gnu/blinky-qk.ld | 139 - .../blinky_nucleo-c031c6/qk/iar/blinky-qk.ewd | 4654 ------ .../blinky_nucleo-c031c6/qk/iar/blinky-qk.ewp | 3349 ----- .../blinky_nucleo-c031c6/qk/iar/blinky-qk.eww | 10 - .../blinky_nucleo-c031c6/qk/iar/blinky-qk.icf | 165 - .../qv/armclang/blinky-qv.sct | 23 - .../qv/armclang/blinky-qv.uvoptx | 1024 -- .../qv/armclang/blinky-qv.uvprojx | 1823 --- .../arm-cm/blinky_nucleo-c031c6/qv/bsp.cpp | 255 - .../blinky_nucleo-c031c6/qv/gnu/Makefile | 309 - .../blinky_nucleo-c031c6/qv/gnu/blinky-qv.ld | 135 - .../blinky_nucleo-c031c6/qv/iar/blinky-qv.ewd | 4654 ------ .../blinky_nucleo-c031c6/qv/iar/blinky-qv.ewp | 3349 ----- .../blinky_nucleo-c031c6/qv/iar/blinky-qv.eww | 10 - .../blinky_nucleo-c031c6/qv/iar/blinky-qv.icf | 165 - .../stm32-nucleo-c031c6.jpg | Bin 43475 -> 0 bytes .../arm-cm/dpp_efm32-slstk3401a/README.md | 5 - examples/arm-cm/dpp_efm32-slstk3401a/bsp.hpp | 59 - examples/arm-cm/dpp_efm32-slstk3401a/dpp.hpp | 111 - examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm | 528 - examples/arm-cm/dpp_efm32-slstk3401a/main.cpp | 44 - .../arm-cm/dpp_efm32-slstk3401a/philo.cpp | 264 - .../qk/armclang/README.txt | 50 - .../qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 1074 -- .../qk/armclang/dpp-qk.uvprojx | 1826 --- .../arm-cm/dpp_efm32-slstk3401a/qk/bsp.cpp | 559 - .../dpp_efm32-slstk3401a/qk/gnu/Makefile | 316 - .../dpp_efm32-slstk3401a/qk/gnu/README.txt | 71 - .../dpp_efm32-slstk3401a/qk/gnu/dpp-qk.ld | 139 - .../dpp_efm32-slstk3401a/qk/gnu/flash.bat | 49 - .../dpp_efm32-slstk3401a/qk/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp | 3358 ----- .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww | 10 - .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf | 29 - .../arm-cm/dpp_efm32-slstk3401a/qp_config.hpp | 59 - .../qv/armclang/README.txt | 50 - .../qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 1047 -- .../qv/armclang/dpp-qv.uvprojx | 1823 --- .../arm-cm/dpp_efm32-slstk3401a/qv/bsp.cpp | 555 - .../dpp_efm32-slstk3401a/qv/gnu/Makefile | 316 - .../dpp_efm32-slstk3401a/qv/gnu/README.txt | 71 - .../dpp_efm32-slstk3401a/qv/gnu/dpp-qv.ld | 139 - .../dpp_efm32-slstk3401a/qv/gnu/flash.bat | 49 - .../dpp_efm32-slstk3401a/qv/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp | 3358 ----- .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww | 10 - .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf | 29 - .../arm-cm/dpp_efm32-slstk3401a/qview/dpp.py | 103 - .../arm-cm/dpp_efm32-slstk3401a/qview/dpp1.py | 147 - .../qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_efm32-slstk3401a/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_efm32-slstk3401a/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_efm32-slstk3401a/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_efm32-slstk3401a/qview/qview-dpp.bat | 8 - .../dpp_efm32-slstk3401a/qview/qview-dpp1.bat | 8 - .../qxk/armclang/README.txt | 50 - .../qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1031 -- .../qxk/armclang/dpp-qxk.uvprojx | 1898 --- .../arm-cm/dpp_efm32-slstk3401a/qxk/bsp.cpp | 574 - .../dpp_efm32-slstk3401a/qxk/gnu/Makefile | 325 - .../dpp_efm32-slstk3401a/qxk/gnu/README.txt | 72 - .../dpp_efm32-slstk3401a/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_efm32-slstk3401a/qxk/gnu/flash.bat | 49 - .../dpp_efm32-slstk3401a/qxk/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp | 3376 ----- .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww | 10 - .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf | 29 - .../dpp_efm32-slstk3401a/qxk/xthread1.cpp | 103 - .../dpp_efm32-slstk3401a/qxk/xthread2.cpp | 110 - .../arm-cm/dpp_efm32-slstk3401a/table.cpp | 348 - examples/arm-cm/dpp_ek-tm4c123gxl/README.md | 5 - examples/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp | 58 - examples/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp | 111 - examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 528 - .../dpp_ek-tm4c123gxl/lint-plus/README.txt | 30 - .../dpp_ek-tm4c123gxl/lint-plus/lin.bat | 73 - .../dpp_ek-tm4c123gxl/lint-plus/options.lnt | 64 - examples/arm-cm/dpp_ek-tm4c123gxl/main.cpp | 44 - examples/arm-cm/dpp_ek-tm4c123gxl/philo.cpp | 264 - .../dpp_ek-tm4c123gxl/qk/armclang/README.txt | 60 - .../dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 994 -- .../qk/armclang/dpp-qk.uvprojx | 1823 --- examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.cpp | 544 - .../dpp_ek-tm4c123gxl/qk/gnu/.ccsproject | 5 - .../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.cproject | 318 - .../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.project | 100 - .../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile | 310 - .../dpp_ek-tm4c123gxl/qk/gnu/README.txt | 79 - .../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/dpp-qk.ld | 139 - .../arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl/qk/iar/README.txt | 53 - .../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp | 3347 ----- .../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww | 10 - .../dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf | 29 - .../arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp | 271 - .../dpp_ek-tm4c123gxl/qv/armclang/README.txt | 60 - .../dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 994 -- .../qv/armclang/dpp-qv.uvprojx | 1823 --- examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.cpp | 537 - .../dpp_ek-tm4c123gxl/qv/gnu/.ccsproject | 5 - .../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.cproject | 318 - .../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.project | 100 - .../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile | 310 - .../dpp_ek-tm4c123gxl/qv/gnu/README.txt | 79 - .../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/dpp-qv.ld | 139 - .../arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl/qv/iar/README.txt | 53 - .../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp | 3347 ----- .../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww | 10 - .../dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf | 29 - .../arm-cm/dpp_ek-tm4c123gxl/qview/dpp.py | 103 - .../arm-cm/dpp_ek-tm4c123gxl/qview/dpp1.py | 147 - .../dpp_ek-tm4c123gxl/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_ek-tm4c123gxl/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_ek-tm4c123gxl/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_ek-tm4c123gxl/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_ek-tm4c123gxl/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_ek-tm4c123gxl/qview/qview-dpp.bat | 8 - .../dpp_ek-tm4c123gxl/qview/qview-dpp1.bat | 8 - .../dpp_ek-tm4c123gxl/qxk/armclang/README.txt | 60 - .../qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1118 -- .../qxk/armclang/dpp-qxk.uvprojx | 1931 --- examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.cpp | 556 - .../dpp_ek-tm4c123gxl/qxk/gnu/.ccsproject | 5 - .../dpp_ek-tm4c123gxl/qxk/gnu/.cproject | 318 - .../arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.project | 110 - .../arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile | 315 - .../dpp_ek-tm4c123gxl/qxk/gnu/README.txt | 79 - .../dpp_ek-tm4c123gxl/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_ek-tm4c123gxl/qxk/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl/qxk/iar/README.txt | 53 - .../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp | 3362 ----- .../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww | 10 - .../dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf | 29 - .../arm-cm/dpp_ek-tm4c123gxl/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_ek-tm4c123gxl/qxk/xthread2.cpp | 110 - examples/arm-cm/dpp_ek-tm4c123gxl/table.cpp | 348 - examples/arm-cm/dpp_ek-tm4c123gxl_mpu/bsp.hpp | 61 - examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp.hpp | 152 - .../arm-cm/dpp_ek-tm4c123gxl_mpu/dpp_mpu.qm | 728 - .../lint-plus/README.txt | 30 - .../dpp_ek-tm4c123gxl_mpu/lint-plus/lin.bat | 73 - .../lint-plus/options.lnt | 64 - .../arm-cm/dpp_ek-tm4c123gxl_mpu/main.cpp | 44 - .../arm-cm/dpp_ek-tm4c123gxl_mpu/philo.cpp | 266 - .../qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 994 -- .../qk/armclang/dpp-qk.uvprojx | 1826 --- .../arm-cm/dpp_ek-tm4c123gxl_mpu/qk/bsp.cpp | 874 -- .../dpp_ek-tm4c123gxl_mpu/qk/gnu/Makefile | 310 - .../dpp_ek-tm4c123gxl_mpu/qk/gnu/dpp-qk.ld | 139 - .../dpp_ek-tm4c123gxl_mpu/qk/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewp | 3349 ----- .../dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.eww | 10 - .../dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.icf | 29 - .../dpp_ek-tm4c123gxl_mpu/qp_config.hpp | 57 - .../qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 1107 -- .../qv/armclang/dpp-qv.uvprojx | 1793 --- .../arm-cm/dpp_ek-tm4c123gxl_mpu/qv/bsp.cpp | 869 -- .../dpp_ek-tm4c123gxl_mpu/qv/gnu/Makefile | 310 - .../dpp_ek-tm4c123gxl_mpu/qv/gnu/README.txt | 71 - .../dpp_ek-tm4c123gxl_mpu/qv/gnu/dpp-qv.ld | 139 - .../dpp_ek-tm4c123gxl_mpu/qv/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewp | 3352 ----- .../dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.eww | 10 - .../dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.icf | 29 - .../arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp.py | 103 - .../dpp_ek-tm4c123gxl_mpu/qview/dpp1.py | 147 - .../qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../qview/img/eating.gif | Bin 3169 -> 0 bytes .../qview/img/hungry.gif | Bin 2428 -> 0 bytes .../qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_ek-tm4c123gxl_mpu/qview/qview-dpp.bat | 8 - .../qview/qview-dpp1.bat | 8 - .../qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1130 -- .../qxk/armclang/dpp-qxk.uvprojx | 1931 --- .../arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/bsp.cpp | 976 -- .../dpp_ek-tm4c123gxl_mpu/qxk/gnu/Makefile | 315 - .../dpp_ek-tm4c123gxl_mpu/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_ek-tm4c123gxl_mpu/qxk/gnu/flash.bat | 33 - .../dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewp | 3367 ----- .../dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.eww | 10 - .../dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.icf | 29 - .../dpp_ek-tm4c123gxl_mpu/qxk/xthread1.cpp | 162 - .../dpp_ek-tm4c123gxl_mpu/qxk/xthread2.cpp | 128 - .../arm-cm/dpp_ek-tm4c123gxl_mpu/table.cpp | 360 - examples/arm-cm/dpp_mbed-lpc1768/bsp.hpp | 58 - examples/arm-cm/dpp_mbed-lpc1768/dpp.hpp | 111 - examples/arm-cm/dpp_mbed-lpc1768/dpp.qm | 528 - examples/arm-cm/dpp_mbed-lpc1768/main.cpp | 44 - .../arm-cm/dpp_mbed-lpc1768/mbed-lpc1768.jpeg | Bin 30025 -> 0 bytes examples/arm-cm/dpp_mbed-lpc1768/philo.cpp | 264 - .../dpp_mbed-lpc1768/qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 962 -- .../qk/armclang/dpp-qk.uvprojx | 1748 --- examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.cpp | 647 - .../arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile | 310 - .../arm-cm/dpp_mbed-lpc1768/qk/gnu/dpp-qk.ld | 142 - .../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd | 4654 ------ .../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp | 3344 ----- .../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww | 10 - .../arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf | 39 - .../dpp_mbed-lpc1768/qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 938 -- .../qv/armclang/dpp-qv.uvprojx | 1718 --- examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.cpp | 643 - .../arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile | 310 - .../arm-cm/dpp_mbed-lpc1768/qv/gnu/dpp-qv.ld | 142 - .../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd | 4654 ------ .../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp | 3344 ----- .../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww | 10 - .../arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf | 39 - .../dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1022 -- .../qxk/armclang/dpp-qxk.uvprojx | 1823 --- examples/arm-cm/dpp_mbed-lpc1768/qxk/bsp.cpp | 661 - .../arm-cm/dpp_mbed-lpc1768/qxk/gnu/Makefile | 314 - .../dpp_mbed-lpc1768/qxk/gnu/dpp-qxk.ld | 142 - .../dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewp | 3359 ----- .../dpp_mbed-lpc1768/qxk/iar/dpp-qxk.eww | 10 - .../dpp_mbed-lpc1768/qxk/iar/dpp-qxk.icf | 39 - .../arm-cm/dpp_mbed-lpc1768/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_mbed-lpc1768/qxk/xthread2.cpp | 110 - examples/arm-cm/dpp_mbed-lpc1768/table.cpp | 348 - examples/arm-cm/dpp_nucleo-c031c6/README.md | 149 - examples/arm-cm/dpp_nucleo-c031c6/bsp.hpp | 55 - examples/arm-cm/dpp_nucleo-c031c6/dpp.hpp | 111 - examples/arm-cm/dpp_nucleo-c031c6/dpp.qm | 528 - examples/arm-cm/dpp_nucleo-c031c6/main.cpp | 44 - examples/arm-cm/dpp_nucleo-c031c6/philo.cpp | 264 - .../dpp_nucleo-c031c6/qk/armclang/README.txt | 74 - .../dpp_nucleo-c031c6/qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 1036 -- .../qk/armclang/dpp-qk.uvprojx | 1838 --- examples/arm-cm/dpp_nucleo-c031c6/qk/bsp.cpp | 539 - .../arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile | 311 - .../dpp_nucleo-c031c6/qk/gnu/Makefile-cpp20 | 311 - .../dpp_nucleo-c031c6/qk/gnu/README.txt | 92 - .../arm-cm/dpp_nucleo-c031c6/qk/gnu/dpp-qk.ld | 135 - .../dpp_nucleo-c031c6/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-c031c6/qk/iar/dpp-qk.ewp | 3349 ----- .../dpp_nucleo-c031c6/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-c031c6/qk/iar/dpp-qk.icf | 165 - .../arm-cm/dpp_nucleo-c031c6/qp_config.hpp | 54 - .../arm-cm/dpp_nucleo-c031c6/qspy-output.png | Bin 30404 -> 0 bytes .../dpp_nucleo-c031c6/qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 1036 -- .../qv/armclang/dpp-qv.uvprojx | 1841 --- examples/arm-cm/dpp_nucleo-c031c6/qv/bsp.cpp | 528 - .../arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile | 311 - .../dpp_nucleo-c031c6/qv/gnu/Makefile-cpp20 | 311 - .../arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.ld | 135 - .../dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvoptx | 984 -- .../dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvprojx | 1473 -- .../dpp_nucleo-c031c6/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-c031c6/qv/iar/dpp-qv.ewp | 3349 ----- .../dpp_nucleo-c031c6/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-c031c6/qv/iar/dpp-qv.icf | 165 - .../arm-cm/dpp_nucleo-c031c6/qview/dpp.py | 103 - .../arm-cm/dpp_nucleo-c031c6/qview/dpp1.py | 147 - .../dpp_nucleo-c031c6/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_nucleo-c031c6/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_nucleo-c031c6/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_nucleo-c031c6/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_nucleo-c031c6/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-c031c6/qview/qview-dpp.bat | 8 - .../dpp_nucleo-c031c6/qview/qview-dpp.lnk | Bin 2485 -> 0 bytes .../dpp_nucleo-c031c6/qview/qview-dpp1.bat | 8 - .../dpp_nucleo-c031c6/qview/qview-dpp1.lnk | Bin 2487 -> 0 bytes .../RTE/_dpp-dbg/Pre_Include_Utility_QS.h | 16 - .../arm-pack/RTE/_dpp-dbg/RTE_Components.h | 27 - .../qxk/arm-pack/dpp-qxk.sct | 23 - .../qxk/arm-pack/dpp-qxk.uvoptx | 792 - .../qxk/arm-pack/dpp-qxk.uvprojx | 1415 -- .../qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1096 -- .../qxk/armclang/dpp-qxk.uvprojx | 1913 --- examples/arm-cm/dpp_nucleo-c031c6/qxk/bsp.cpp | 557 - .../arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile | 316 - .../dpp_nucleo-c031c6/qxk/gnu/Makefile-cpp20 | 316 - .../dpp_nucleo-c031c6/qxk/gnu/README.txt | 92 - .../dpp_nucleo-c031c6/qxk/gnu/dpp-qxk.ld | 135 - .../dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewp | 3364 ----- .../dpp_nucleo-c031c6/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-c031c6/qxk/iar/dpp-qxk.icf | 165 - .../arm-cm/dpp_nucleo-c031c6/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_nucleo-c031c6/qxk/xthread2.cpp | 110 - .../dpp_nucleo-c031c6/stm32-nucleo-c031c6.jpg | Bin 43475 -> 0 bytes examples/arm-cm/dpp_nucleo-c031c6/table.cpp | 348 - .../arm-cm/dpp_nucleo-c031c6_mpu/README.md | 131 - examples/arm-cm/dpp_nucleo-c031c6_mpu/bsp.hpp | 61 - examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp.hpp | 152 - .../arm-cm/dpp_nucleo-c031c6_mpu/dpp_mpu.qm | 728 - .../arm-cm/dpp_nucleo-c031c6_mpu/main.cpp | 44 - .../arm-cm/dpp_nucleo-c031c6_mpu/philo.cpp | 266 - .../qk/armclang/README.txt | 74 - .../qk/armclang/dpp-qk.sct | 23 - .../qk/armclang/dpp-qk.uvoptx | 1036 -- .../qk/armclang/dpp-qk.uvprojx | 1838 --- .../arm-cm/dpp_nucleo-c031c6_mpu/qk/bsp.cpp | 873 -- .../dpp_nucleo-c031c6_mpu/qk/gnu/Makefile | 311 - .../dpp_nucleo-c031c6_mpu/qk/gnu/README.txt | 92 - .../dpp_nucleo-c031c6_mpu/qk/gnu/dpp-qk.ld | 135 - .../dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewp | 3352 ----- .../dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.icf | 165 - .../dpp_nucleo-c031c6_mpu/qp_config.hpp | 57 - .../qv/armclang/dpp-qv.sct | 23 - .../qv/armclang/dpp-qv.uvoptx | 1036 -- .../qv/armclang/dpp-qv.uvprojx | 1838 --- .../arm-cm/dpp_nucleo-c031c6_mpu/qv/bsp.cpp | 871 -- .../dpp_nucleo-c031c6_mpu/qv/gnu/Makefile | 311 - .../dpp_nucleo-c031c6_mpu/qv/gnu/dpp-qv.ld | 135 - .../dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewp | 3352 ----- .../dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.icf | 165 - .../arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp.py | 103 - .../dpp_nucleo-c031c6_mpu/qview/dpp1.py | 147 - .../qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../qview/img/eating.gif | Bin 3169 -> 0 bytes .../qview/img/hungry.gif | Bin 2428 -> 0 bytes .../qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-c031c6_mpu/qview/qview-dpp.bat | 8 - .../dpp_nucleo-c031c6_mpu/qview/qview-dpp.lnk | Bin 2485 -> 0 bytes .../qview/qview-dpp1.bat | 8 - .../qview/qview-dpp1.lnk | Bin 2487 -> 0 bytes .../qxk/armclang/dpp-qxk.sct | 23 - .../qxk/armclang/dpp-qxk.uvoptx | 1113 -- .../qxk/armclang/dpp-qxk.uvprojx | 1916 --- .../arm-cm/dpp_nucleo-c031c6_mpu/qxk/bsp.cpp | 965 -- .../dpp_nucleo-c031c6_mpu/qxk/gnu/Makefile | 321 - .../dpp_nucleo-c031c6_mpu/qxk/gnu/README.txt | 92 - .../dpp_nucleo-c031c6_mpu/qxk/gnu/dpp-qxk.ld | 135 - .../dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewp | 3364 ----- .../dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.icf | 165 - .../dpp_nucleo-c031c6_mpu/qxk/xthread1.cpp | 162 - .../dpp_nucleo-c031c6_mpu/qxk/xthread2.cpp | 128 - .../stm32-nucleo-c031c6.jpg | Bin 43475 -> 0 bytes .../arm-cm/dpp_nucleo-c031c6_mpu/table.cpp | 360 - examples/arm-cm/dpp_nucleo-h743zi/README.md | 5 - examples/arm-cm/dpp_nucleo-h743zi/bsp.hpp | 55 - examples/arm-cm/dpp_nucleo-h743zi/dpp.hpp | 111 - examples/arm-cm/dpp_nucleo-h743zi/dpp.qm | 528 - examples/arm-cm/dpp_nucleo-h743zi/main.cpp | 44 - examples/arm-cm/dpp_nucleo-h743zi/philo.cpp | 264 - .../dpp_nucleo-h743zi/qk/armclang/README.txt | 50 - .../dpp_nucleo-h743zi/qk/armclang/dpp-qk.sct | 26 - .../qk/armclang/dpp-qk.uvoptx | 1140 -- .../qk/armclang/dpp-qk.uvprojx | 2024 --- examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.cpp | 516 - .../arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile | 326 - .../dpp_nucleo-h743zi/qk/gnu/README.txt | 71 - .../arm-cm/dpp_nucleo-h743zi/qk/gnu/dpp-qk.ld | 139 - .../dpp_nucleo-h743zi/qk/iar/README.txt | 53 - .../dpp_nucleo-h743zi/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp | 3391 ----- .../dpp_nucleo-h743zi/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-h743zi/qk/iar/dpp-qk.icf | 84 - .../dpp_nucleo-h743zi/qv/armclang/README.txt | 50 - .../dpp_nucleo-h743zi/qv/armclang/dpp-qv.sct | 26 - .../qv/armclang/dpp-qv.uvoptx | 1116 -- .../qv/armclang/dpp-qv.uvprojx | 2021 --- examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.cpp | 506 - .../arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile | 328 - .../arm-cm/dpp_nucleo-h743zi/qv/gnu/dpp-qv.ld | 139 - .../dpp_nucleo-h743zi/qv/iar/README.txt | 53 - .../dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp | 3391 ----- .../dpp_nucleo-h743zi/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-h743zi/qv/iar/dpp-qv.icf | 84 - .../arm-cm/dpp_nucleo-h743zi/qview/dpp.py | 112 - .../arm-cm/dpp_nucleo-h743zi/qview/dpp1.py | 155 - .../dpp_nucleo-h743zi/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_nucleo-h743zi/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_nucleo-h743zi/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_nucleo-h743zi/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_nucleo-h743zi/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-h743zi/qview/qview-dpp.bat | 8 - .../dpp_nucleo-h743zi/qview/qview-dpp1.bat | 8 - .../dpp_nucleo-h743zi/qxk/armclang/README.txt | 50 - .../qxk/armclang/dpp-qxk.sct | 26 - .../qxk/armclang/dpp-qxk.uvoptx | 1205 -- .../qxk/armclang/dpp-qxk.uvprojx | 2099 --- examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.cpp | 524 - .../arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile | 331 - .../dpp_nucleo-h743zi/qxk/gnu/README.txt | 71 - .../dpp_nucleo-h743zi/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_nucleo-h743zi/qxk/iar/README.txt | 53 - .../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp | 3406 ----- .../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf | 84 - .../arm-cm/dpp_nucleo-h743zi/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_nucleo-h743zi/qxk/xthread2.cpp | 110 - .../dpp_nucleo-h743zi/stm32h7xx_hal_conf.h | 432 - .../dpp_nucleo-h743zi/stm32h7xx_hal_msp.c | 194 - examples/arm-cm/dpp_nucleo-h743zi/table.cpp | 348 - examples/arm-cm/dpp_nucleo-l053r8/README.md | 5 - examples/arm-cm/dpp_nucleo-l053r8/bsp.hpp | 55 - examples/arm-cm/dpp_nucleo-l053r8/dpp.hpp | 111 - examples/arm-cm/dpp_nucleo-l053r8/dpp.qm | 528 - examples/arm-cm/dpp_nucleo-l053r8/main.cpp | 44 - examples/arm-cm/dpp_nucleo-l053r8/philo.cpp | 264 - .../dpp_nucleo-l053r8/qk/armclang/README.txt | 77 - .../dpp_nucleo-l053r8/qk/armclang/dpp-qk.sct | 20 - .../qk/armclang/dpp-qk.uvoptx | 1009 -- .../qk/armclang/dpp-qk.uvprojx | 1763 --- examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.cpp | 537 - .../arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile | 310 - .../dpp_nucleo-l053r8/qk/gnu/README.txt | 94 - .../arm-cm/dpp_nucleo-l053r8/qk/gnu/dpp-qk.ld | 139 - .../dpp_nucleo-l053r8/qk/iar/README.txt | 72 - .../dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp | 3607 ----- .../dpp_nucleo-l053r8/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-l053r8/qk/iar/dpp-qk.icf | 37 - .../dpp_nucleo-l053r8/qv/armclang/README.txt | 77 - .../dpp_nucleo-l053r8/qv/armclang/dpp-qv.sct | 20 - .../qv/armclang/dpp-qv.uvoptx | 976 -- .../qv/armclang/dpp-qv.uvprojx | 1766 --- examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.cpp | 524 - .../arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile | 310 - .../dpp_nucleo-l053r8/qv/gnu/README.txt | 94 - .../arm-cm/dpp_nucleo-l053r8/qv/gnu/dpp-qv.ld | 139 - .../dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp | 3355 ----- .../dpp_nucleo-l053r8/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-l053r8/qv/iar/dpp-qv.icf | 37 - .../arm-cm/dpp_nucleo-l053r8/qview/dpp.py | 112 - .../arm-cm/dpp_nucleo-l053r8/qview/dpp1.py | 155 - .../dpp_nucleo-l053r8/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_nucleo-l053r8/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_nucleo-l053r8/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_nucleo-l053r8/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_nucleo-l053r8/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-l053r8/qview/qview-dpp.bat | 8 - .../dpp_nucleo-l053r8/qview/qview-dpp1.bat | 8 - .../dpp_nucleo-l053r8/qxk/armclang/README.txt | 93 - .../qxk/armclang/dpp-qxk.sct | 20 - .../qxk/armclang/dpp-qxk.uvoptx | 1060 -- .../qxk/armclang/dpp-qxk.uvprojx | 1868 --- examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.cpp | 547 - .../arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile | 315 - .../dpp_nucleo-l053r8/qxk/gnu/README.txt | 94 - .../dpp_nucleo-l053r8/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_nucleo-l053r8/qxk/iar/README.txt | 72 - .../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp | 3619 ----- .../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf | 37 - .../arm-cm/dpp_nucleo-l053r8/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_nucleo-l053r8/qxk/xthread2.cpp | 110 - examples/arm-cm/dpp_nucleo-l053r8/table.cpp | 348 - examples/arm-cm/dpp_nucleo-l152re/README.md | 5 - examples/arm-cm/dpp_nucleo-l152re/bsp.hpp | 55 - examples/arm-cm/dpp_nucleo-l152re/dpp.hpp | 111 - examples/arm-cm/dpp_nucleo-l152re/dpp.qm | 528 - examples/arm-cm/dpp_nucleo-l152re/main.cpp | 44 - examples/arm-cm/dpp_nucleo-l152re/philo.cpp | 264 - .../dpp_nucleo-l152re/qk/armclang/README.txt | 77 - .../dpp_nucleo-l152re/qk/armclang/dpp-qk.sct | 22 - .../qk/armclang/dpp-qk.uvoptx | 1051 -- .../qk/armclang/dpp-qk.uvprojx | 1793 --- examples/arm-cm/dpp_nucleo-l152re/qk/bsp.cpp | 539 - .../arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile | 309 - .../arm-cm/dpp_nucleo-l152re/qk/gnu/dpp-qk.ld | 139 - .../dpp_nucleo-l152re/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-l152re/qk/iar/dpp-qk.ewp | 3344 ----- .../dpp_nucleo-l152re/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-l152re/qk/iar/dpp-qk.icf | 36 - .../dpp_nucleo-l152re/qv/armclang/README.txt | 77 - .../dpp_nucleo-l152re/qv/armclang/dpp-qv.sct | 22 - .../qv/armclang/dpp-qv.uvoptx | 1000 -- .../qv/armclang/dpp-qv.uvprojx | 1793 --- examples/arm-cm/dpp_nucleo-l152re/qv/bsp.cpp | 526 - .../arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile | 309 - .../arm-cm/dpp_nucleo-l152re/qv/gnu/dpp-qv.ld | 139 - .../dpp_nucleo-l152re/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-l152re/qv/iar/dpp-qv.ewp | 3344 ----- .../dpp_nucleo-l152re/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-l152re/qv/iar/dpp-qv.icf | 36 - .../arm-cm/dpp_nucleo-l152re/qview/dpp.py | 112 - .../arm-cm/dpp_nucleo-l152re/qview/dpp1.py | 155 - .../dpp_nucleo-l152re/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_nucleo-l152re/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_nucleo-l152re/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_nucleo-l152re/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_nucleo-l152re/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-l152re/qview/qview-dpp.bat | 8 - .../dpp_nucleo-l152re/qview/qview-dpp1.bat | 8 - .../dpp_nucleo-l152re/qxk/armclang/README.txt | 77 - .../qxk/armclang/dpp-qxk.sct | 22 - .../qxk/armclang/dpp-qxk.uvoptx | 1094 -- .../qxk/armclang/dpp-qxk.uvprojx | 1868 --- examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.cpp | 553 - .../arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile | 314 - .../dpp_nucleo-l152re/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp | 3359 ----- .../dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf | 36 - .../arm-cm/dpp_nucleo-l152re/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_nucleo-l152re/qxk/xthread2.cpp | 110 - examples/arm-cm/dpp_nucleo-l152re/table.cpp | 348 - examples/arm-cm/dpp_nucleo-l552ze/README.md | 5 - examples/arm-cm/dpp_nucleo-l552ze/bsp.hpp | 55 - examples/arm-cm/dpp_nucleo-l552ze/dpp.hpp | 111 - examples/arm-cm/dpp_nucleo-l552ze/dpp.qm | 528 - examples/arm-cm/dpp_nucleo-l552ze/main.cpp | 44 - examples/arm-cm/dpp_nucleo-l552ze/philo.cpp | 264 - .../dpp_nucleo-l552ze/qk/armclang/dpp-qk.sct | 16 - .../qk/armclang/dpp-qk.uvoptx | 1162 -- .../qk/armclang/dpp-qk.uvprojx | 2099 --- examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.cpp | 546 - .../arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile | 333 - .../arm-cm/dpp_nucleo-l552ze/qk/gnu/dpp-qk.ld | 139 - .../dpp_nucleo-l552ze/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp | 3406 ----- .../dpp_nucleo-l552ze/qk/iar/dpp-qk.eww | 10 - .../dpp_nucleo-l552ze/qk/iar/dpp-qk.icf | 164 - .../dpp_nucleo-l552ze/qv/armclang/dpp-qv.sct | 16 - .../qv/armclang/dpp-qv.uvoptx | 1162 -- .../qv/armclang/dpp-qv.uvprojx | 2096 --- examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.cpp | 530 - .../arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile | 335 - .../arm-cm/dpp_nucleo-l552ze/qv/gnu/dpp-qv.ld | 139 - .../dpp_nucleo-l552ze/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp | 3406 ----- .../dpp_nucleo-l552ze/qv/iar/dpp-qv.eww | 10 - .../dpp_nucleo-l552ze/qv/iar/dpp-qv.icf | 164 - .../arm-cm/dpp_nucleo-l552ze/qview/dpp.py | 112 - .../arm-cm/dpp_nucleo-l552ze/qview/dpp1.py | 155 - .../dpp_nucleo-l552ze/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../dpp_nucleo-l552ze/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../dpp_nucleo-l552ze/qview/img/eating.gif | Bin 3169 -> 0 bytes .../dpp_nucleo-l552ze/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../dpp_nucleo-l552ze/qview/img/thinking.gif | Bin 2378 -> 0 bytes .../dpp_nucleo-l552ze/qview/qview-dpp.bat | 8 - .../dpp_nucleo-l552ze/qview/qview-dpp1.bat | 8 - .../qxk/armclang/dpp-qxk.sct | 16 - .../qxk/armclang/dpp-qxk.uvoptx | 1222 -- .../qxk/armclang/dpp-qxk.uvprojx | 2174 --- examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.cpp | 560 - .../arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile | 338 - .../dpp_nucleo-l552ze/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp | 3421 ----- .../dpp_nucleo-l552ze/qxk/iar/dpp-qxk.eww | 10 - .../dpp_nucleo-l552ze/qxk/iar/dpp-qxk.icf | 164 - .../arm-cm/dpp_nucleo-l552ze/qxk/xthread1.cpp | 103 - .../arm-cm/dpp_nucleo-l552ze/qxk/xthread2.cpp | 110 - .../dpp_nucleo-l552ze/stm32-nucleo-l552ze.jpg | Bin 39333 -> 0 bytes .../dpp_nucleo-l552ze/stm32l5xx_hal_conf.h | 435 - .../dpp_nucleo-l552ze/stm32l5xx_hal_msp.c | 182 - .../dpp_nucleo-l552ze/stm32l5xx_nucleo_conf.h | 49 - examples/arm-cm/dpp_nucleo-l552ze/table.cpp | 348 - .../arm-cm/dpp_stm32f4-discovery/README.md | 5 - examples/arm-cm/dpp_stm32f4-discovery/bsp.hpp | 55 - examples/arm-cm/dpp_stm32f4-discovery/dpp.hpp | 111 - examples/arm-cm/dpp_stm32f4-discovery/dpp.qm | 528 - .../arm-cm/dpp_stm32f4-discovery/main.cpp | 44 - .../arm-cm/dpp_stm32f4-discovery/philo.cpp | 264 - .../qk/armclang/README.txt | 24 - .../qk/armclang/dpp-qk.sct | 22 - .../qk/armclang/dpp-qk.uvoptx | 1024 -- .../qk/armclang/dpp-qk.uvprojx | 1823 --- .../arm-cm/dpp_stm32f4-discovery/qk/bsp.cpp | 569 - .../dpp_stm32f4-discovery/qk/gnu/Makefile | 314 - .../dpp_stm32f4-discovery/qk/gnu/README.txt | 71 - .../dpp_stm32f4-discovery/qk/gnu/dpp-qk.ld | 139 - .../dpp_stm32f4-discovery/qk/gnu/flash.bat | 23 - .../dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp | 3368 ----- .../dpp_stm32f4-discovery/qk/iar/dpp-qk.eww | 10 - .../dpp_stm32f4-discovery/qk/iar/dpp-qk.icf | 35 - .../qv/armclang/README.txt | 24 - .../qv/armclang/dpp-qv.sct | 22 - .../qv/armclang/dpp-qv.uvoptx | 1024 -- .../qv/armclang/dpp-qv.uvprojx | 1823 --- .../arm-cm/dpp_stm32f4-discovery/qv/bsp.cpp | 570 - .../dpp_stm32f4-discovery/qv/gnu/Makefile | 314 - .../dpp_stm32f4-discovery/qv/gnu/README.txt | 71 - .../dpp_stm32f4-discovery/qv/gnu/dpp-qv.ld | 139 - .../dpp_stm32f4-discovery/qv/gnu/flash.bat | 23 - .../dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp | 3362 ----- .../dpp_stm32f4-discovery/qv/iar/dpp-qv.eww | 10 - .../dpp_stm32f4-discovery/qv/iar/dpp-qv.icf | 35 - .../qxk/armclang/README.txt | 24 - .../qxk/armclang/dpp-qxk.sct | 22 - .../qxk/armclang/dpp-qxk.uvoptx | 1279 -- .../qxk/armclang/dpp-qxk.uvprojx | 1898 --- .../arm-cm/dpp_stm32f4-discovery/qxk/bsp.cpp | 583 - .../dpp_stm32f4-discovery/qxk/gnu/Makefile | 319 - .../dpp_stm32f4-discovery/qxk/gnu/README.txt | 71 - .../dpp_stm32f4-discovery/qxk/gnu/dpp-qxk.ld | 139 - .../dpp_stm32f4-discovery/qxk/gnu/flash.bat | 23 - .../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp | 3383 ----- .../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww | 10 - .../dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf | 35 - .../dpp_stm32f4-discovery/qxk/xthread1.cpp | 103 - .../dpp_stm32f4-discovery/qxk/xthread2.cpp | 110 - .../arm-cm/dpp_stm32f4-discovery/table.cpp | 348 - .../arm-cm/game_efm32-slstk3401a/README.md | 72 - examples/arm-cm/game_efm32-slstk3401a/bsp.hpp | 69 - .../arm-cm/game_efm32-slstk3401a/game.hpp | 171 - examples/arm-cm/game_efm32-slstk3401a/game.qm | 1448 -- .../arm-cm/game_efm32-slstk3401a/main.cpp | 88 - .../arm-cm/game_efm32-slstk3401a/mine1.cpp | 289 - .../arm-cm/game_efm32-slstk3401a/mine2.cpp | 288 - .../arm-cm/game_efm32-slstk3401a/missile.cpp | 212 - .../qk/armclang/README.txt | 50 - .../qk/armclang/game-qk.uvoptx | 1159 -- .../qk/armclang/game-qk.uvprojx | 1958 --- .../arm-cm/game_efm32-slstk3401a/qk/bsp.cpp | 920 -- .../game_efm32-slstk3401a/qk/gnu/Makefile | 324 - .../game_efm32-slstk3401a/qk/gnu/README.txt | 71 - .../game_efm32-slstk3401a/qk/gnu/flash.bat | 49 - .../game_efm32-slstk3401a/qk/gnu/game-qk.ld | 139 - .../game_efm32-slstk3401a/qk/iar/README.txt | 53 - .../game_efm32-slstk3401a/qk/iar/game-qk.ewd | 4654 ------ .../game_efm32-slstk3401a/qk/iar/game-qk.ewp | 3382 ----- .../game_efm32-slstk3401a/qk/iar/game-qk.eww | 10 - .../game_efm32-slstk3401a/qk/iar/game-qk.icf | 29 - .../qv/armclang/README.txt | 50 - .../qv/armclang/game-qv.uvoptx | 1121 -- .../qv/armclang/game-qv.uvprojx | 1958 --- .../arm-cm/game_efm32-slstk3401a/qv/bsp.cpp | 924 -- .../game_efm32-slstk3401a/qv/gnu/Makefile | 324 - .../game_efm32-slstk3401a/qv/gnu/README.txt | 71 - .../game_efm32-slstk3401a/qv/gnu/flash.bat | 49 - .../game_efm32-slstk3401a/qv/gnu/game-qv.ld | 139 - .../game_efm32-slstk3401a/qv/iar/game-qv.ewd | 4654 ------ .../game_efm32-slstk3401a/qv/iar/game-qv.ewp | 3382 ----- .../game_efm32-slstk3401a/qv/iar/game-qv.eww | 10 - .../game_efm32-slstk3401a/qv/iar/game-qv.icf | 29 - .../arm-cm/game_efm32-slstk3401a/ship.cpp | 279 - .../arm-cm/game_efm32-slstk3401a/tunnel.cpp | 674 - .../arm-cm/low-power_ek-tm4c123gxl/README.md | 5 - .../low-power_ek-tm4c123gxl/blinky0.cpp | 202 - .../low-power_ek-tm4c123gxl/blinky1.cpp | 200 - .../arm-cm/low-power_ek-tm4c123gxl/bsp.hpp | 64 - .../low-power_ek-tm4c123gxl/low-power.qm | 274 - .../low-power_ek-tm4c123gxl/low_power.hpp | 65 - .../arm-cm/low-power_ek-tm4c123gxl/main.cpp | 79 - .../qk/armclang/README.txt | 60 - .../qk/armclang/low-power-qk.uvoptx | 982 -- .../qk/armclang/low-power-qk.uvprojx | 1817 --- .../arm-cm/low-power_ek-tm4c123gxl/qk/bsp.cpp | 263 - .../low-power_ek-tm4c123gxl/qk/gnu/Makefile | 310 - .../low-power_ek-tm4c123gxl/qk/gnu/README.txt | 71 - .../low-power_ek-tm4c123gxl/qk/gnu/flash.bat | 33 - .../qk/gnu/low-power-qk.ld | 139 - .../qk/iar/low-power-qk.ewd | 4654 ------ .../qk/iar/low-power-qk.ewp | 3352 ----- .../qk/iar/low-power-qk.eww | 10 - .../qk/iar/low-power-qk.icf | 29 - .../low-power_ek-tm4c123gxl/qp_config.hpp | 42 - .../qv/armclang/README.txt | 60 - .../qv/armclang/low-power-qv.uvoptx | 982 -- .../qv/armclang/low-power-qv.uvprojx | 1808 --- .../arm-cm/low-power_ek-tm4c123gxl/qv/bsp.cpp | 254 - .../low-power_ek-tm4c123gxl/qv/gnu/Makefile | 310 - .../low-power_ek-tm4c123gxl/qv/gnu/README.txt | 71 - .../low-power_ek-tm4c123gxl/qv/gnu/flash.bat | 33 - .../qv/gnu/low-power-qv.ld | 139 - .../low-power_ek-tm4c123gxl/qv/iar/README.txt | 53 - .../qv/iar/low-power-qv.ewd | 4654 ------ .../qv/iar/low-power-qv.ewp | 3349 ----- .../qv/iar/low-power-qv.eww | 10 - .../qv/iar/low-power-qv.icf | 29 - .../qxk/armclang/README.txt | 60 - .../qxk/armclang/low-power-qxk.uvoptx | 1018 -- .../qxk/armclang/low-power-qxk.uvprojx | 1862 --- .../low-power_ek-tm4c123gxl/qxk/bsp.cpp | 264 - .../low-power_ek-tm4c123gxl/qxk/gnu/Makefile | 313 - .../qxk/gnu/README.txt | 71 - .../low-power_ek-tm4c123gxl/qxk/gnu/flash.bat | 33 - .../qxk/gnu/low-power-qxk.ld | 139 - .../qxk/iar/low-power-qxk.ewd | 4654 ------ .../qxk/iar/low-power-qxk.ewp | 3367 ----- .../qxk/iar/low-power-qxk.eww | 10 - .../qxk/iar/low-power-qxk.icf | 29 - .../low-power_ek-tm4c123gxl/qxk/xblinky1.cpp | 68 - examples/arm-cm/qp_arm-cm.jpg | Bin 19322 -> 0 bytes examples/arm-cm/qspy-output.png | Bin 30404 -> 0 bytes .../arm-cm/real-time_nucleo-l053r8/README.md | 64 - .../arm-cm/real-time_nucleo-l053r8/qk/app.hpp | 97 - .../qk/armclang/rt-qk.sct | 20 - .../qk/armclang/rt-qk.uvoptx | 1048 -- .../qk/armclang/rt-qk.uvprojx | 1841 --- .../arm-cm/real-time_nucleo-l053r8/qk/bsp.cpp | 294 - .../arm-cm/real-time_nucleo-l053r8/qk/bsp.hpp | 69 - .../real-time_nucleo-l053r8/qk/main.cpp | 44 - .../real-time_nucleo-l053r8/qk/periodic1.cpp | 150 - .../real-time_nucleo-l053r8/qk/periodic4.cpp | 150 - .../real-time_nucleo-l053r8/qk/real-time.qm | 288 - .../real-time_nucleo-l053r8/qk/sporadic2.cpp | 143 - .../real-time_nucleo-l053r8/qk/sporadic3.cpp | 136 - .../qk/traces/rt-qk.png | Bin 16722 -> 0 bytes .../qk/traces/rt-qk.pvs | 77 - .../qk/traces/rt-qk.sr | Bin 4855 -> 0 bytes .../real-time_nucleo-l053r8/qv-ms-tt/app.hpp | 106 - .../qv-ms-tt/armclang/rt-qv-tt.sct | 20 - .../qv-ms-tt/armclang/rt-qv-tt.uvoptx | 1093 -- .../qv-ms-tt/armclang/rt-qv-tt.uvprojx | 1856 --- .../real-time_nucleo-l053r8/qv-ms-tt/bsp.cpp | 296 - .../real-time_nucleo-l053r8/qv-ms-tt/bsp.hpp | 69 - .../real-time_nucleo-l053r8/qv-ms-tt/main.cpp | 44 - .../qv-ms-tt/periodic1.cpp | 143 - .../qv-ms-tt/periodic4.cpp | 143 - .../qv-ms-tt/real-time-ms-tt.qm | 507 - .../qv-ms-tt/sporadic2.cpp | 228 - .../qv-ms-tt/sporadic3.cpp | 220 - .../qv-ms-tt/traces/rt-qv-tt.png | Bin 15769 -> 0 bytes .../qv-ms-tt/traces/rt-qv-tt.sr | Bin 4267 -> 0 bytes .../qv-ms-tt/ttsched.cpp | 493 - .../real-time_nucleo-l053r8/qv-ms/app.hpp | 97 - .../qv-ms/armclang/rt-qv.sct | 20 - .../qv-ms/armclang/rt-qv.uvoptx | 1048 -- .../qv-ms/armclang/rt-qv.uvprojx | 1841 --- .../real-time_nucleo-l053r8/qv-ms/bsp.cpp | 297 - .../real-time_nucleo-l053r8/qv-ms/bsp.hpp | 69 - .../real-time_nucleo-l053r8/qv-ms/main.cpp | 44 - .../qv-ms/periodic1.cpp | 154 - .../qv-ms/periodic4.cpp | 150 - .../qv-ms/real-time-ms.qm | 379 - .../qv-ms/sporadic2.cpp | 232 - .../qv-ms/sporadic3.cpp | 224 - .../qv-ms/traces/rt-qv-ms.png | Bin 17287 -> 0 bytes .../qv-ms/traces/rt-qv-ms.pvs | 83 - .../qv-ms/traces/rt-qv-ms.sr | Bin 4054 -> 0 bytes .../arm-cm/real-time_nucleo-l053r8/qv/app.hpp | 97 - .../qv/armclang/rt-qv.sct | 20 - .../qv/armclang/rt-qv.uvoptx | 1048 -- .../qv/armclang/rt-qv.uvprojx | 1841 --- .../arm-cm/real-time_nucleo-l053r8/qv/bsp.cpp | 294 - .../arm-cm/real-time_nucleo-l053r8/qv/bsp.hpp | 69 - .../real-time_nucleo-l053r8/qv/main.cpp | 44 - .../real-time_nucleo-l053r8/qv/periodic1.cpp | 150 - .../real-time_nucleo-l053r8/qv/periodic4.cpp | 150 - .../real-time_nucleo-l053r8/qv/real-time.qm | 288 - .../real-time_nucleo-l053r8/qv/sporadic2.cpp | 143 - .../real-time_nucleo-l053r8/qv/sporadic3.cpp | 136 - .../qv/traces/rt-qv.png | Bin 15256 -> 0 bytes .../qv/traces/rt-qv.pvs | 77 - .../qv/traces/rt-qv.sr | Bin 4083 -> 0 bytes .../real-time_trace.png | Bin 11808 -> 0 bytes .../stm32-nucleo-l053r8.jpg | Bin 56638 -> 0 bytes .../stm32-nucleo-l053r8_conn.png | Bin 35803 -> 0 bytes .../blinky_launchxl2-tms57012/README.md | 61 - .../blinky_launchxl2-tms57012/blinky.cpp | 115 - .../blinky_launchxl2-tms57012/blinky.hpp | 49 - .../arm-cr/blinky_launchxl2-tms57012/bsp.hpp | 43 - .../launchxl2-tms57012.png | Bin 136290 -> 0 bytes .../arm-cr/blinky_launchxl2-tms57012/main.cpp | 53 - .../blinky_launchxl2-tms57012/qk/bsp.cpp | 166 - .../qk/iar/blinky-qk.ewd | 4654 ------ .../qk/iar/blinky-qk.ewp | 3394 ----- .../qk/iar/blinky-qk.eww | 10 - .../qk/iar/blinky-qk.icf | 46 - .../qk/ti/.ccsproject | 14 - .../blinky_launchxl2-tms57012/qk/ti/.cproject | 291 - .../blinky_launchxl2-tms57012/qk/ti/.project | 74 - .../blinky_launchxl2-tms57012/qv/bsp.cpp | 180 - .../qv/iar/blinky-qv.ewd | 4654 ------ .../qv/iar/blinky-qv.ewp | 3388 ----- .../qv/iar/blinky-qv.eww | 10 - .../qv/iar/blinky-qv.icf | 46 - .../qv/ti/.ccsproject | 14 - .../blinky_launchxl2-tms57012/qv/ti/.cproject | 292 - .../blinky_launchxl2-tms57012/qv/ti/.project | 74 - .../arm-cr/dpp_launchxl2-tms57012/README.md | 88 - .../arm-cr/dpp_launchxl2-tms57012/bsp.hpp | 59 - .../arm-cr/dpp_launchxl2-tms57012/dpp.hpp | 111 - examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm | 528 - .../launchxl2-tms57012.png | Bin 136290 -> 0 bytes .../arm-cr/dpp_launchxl2-tms57012/main.cpp | 44 - .../arm-cr/dpp_launchxl2-tms57012/philo.cpp | 264 - .../arm-cr/dpp_launchxl2-tms57012/qk/bsp.cpp | 458 - .../dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp | 3379 ----- .../dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww | 10 - .../dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf | 46 - .../dpp_launchxl2-tms57012/qk/ti/.ccsproject | 14 - .../dpp_launchxl2-tms57012/qk/ti/.cproject | 297 - .../dpp_launchxl2-tms57012/qk/ti/.project | 79 - .../dpp_launchxl2-tms57012/qspy-output.png | Bin 30404 -> 0 bytes .../arm-cr/dpp_launchxl2-tms57012/qv/bsp.cpp | 446 - .../dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp | 3388 ----- .../dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww | 10 - .../dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf | 46 - .../dpp_launchxl2-tms57012/qv/ti/.ccsproject | 14 - .../dpp_launchxl2-tms57012/qv/ti/.cproject | 296 - .../dpp_launchxl2-tms57012/qv/ti/.project | 79 - .../dpp_launchxl2-tms57012/qview/dpp.py | 112 - .../dpp_launchxl2-tms57012/qview/dpp1.py | 155 - .../qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes .../qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes .../qview/img/eating.gif | Bin 3169 -> 0 bytes .../qview/img/hungry.gif | Bin 2428 -> 0 bytes .../qview/img/thinking.gif | Bin 2378 -> 0 bytes .../qview/qview-dpp.bat | 8 - .../qview/qview-dpp1.bat | 8 - .../arm-cr/dpp_launchxl2-tms57012/table.cpp | 348 - .../embos/arm-cm/dpp_nucleo-h743zi/bsp.cpp | 481 - .../embos/arm-cm/dpp_nucleo-h743zi/bsp.hpp | 58 - .../embos/arm-cm/dpp_nucleo-h743zi/dpp.hpp | 111 - .../embos/arm-cm/dpp_nucleo-h743zi/dpp.qm | 528 - .../arm-cm/dpp_nucleo-h743zi/gnu/Makefile | 329 - .../dpp_nucleo-h743zi/gnu/SEGGER/SEGGER.h | 231 - .../dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.c | 2068 --- .../dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.h | 472 - .../gnu/SEGGER/SEGGER_RTT_ASM_ARMv7M.S | 263 - .../gnu/SEGGER/SEGGER_RTT_Conf.h | 408 - .../gnu/SEGGER/SEGGER_RTT_Syscalls_GCC.c | 104 - .../gnu/SEGGER/SEGGER_RTT_printf.c | 484 - .../gnu/SEGGER/SEGGER_SYSVIEW.c | 3043 ---- .../gnu/SEGGER/SEGGER_SYSVIEW.h | 350 - .../gnu/SEGGER/SEGGER_SYSVIEW_Conf.h | 69 - .../gnu/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h | 533 - .../gnu/SEGGER/SEGGER_SYSVIEW_Config_embOS.c | 124 - .../gnu/SEGGER/SEGGER_SYSVIEW_Int.h | 79 - .../gnu/SEGGER/SEGGER_SYSVIEW_embOS.c | 227 - .../gnu/SEGGER/SEGGER_SYSVIEW_embOS.h | 49 - .../arm-cm/dpp_nucleo-h743zi/gnu/Setup/BSP.c | 140 - .../gnu/Setup/HardFaultHandler.S | 172 - .../dpp_nucleo-h743zi/gnu/Setup/OS_Error.c | 274 - .../gnu/Setup/OS_MallocLock.c | 86 - .../dpp_nucleo-h743zi/gnu/Setup/OS_Syscalls.c | 393 - .../gnu/Setup/RTOSInit_STM32H7xx.c | 292 - .../gnu/Setup/SEGGER_HardFaultHandler.c | 267 - .../gnu/Setup/STM32H743XIHx_FLASH.ld | 196 - .../embos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld | 139 - .../dpp_nucleo-h743zi/iar/SEGGER/SEGGER.h | 231 - .../dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.c | 2057 --- .../dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.h | 398 - .../iar/SEGGER/SEGGER_RTT_ASM_ARMv7M.S | 263 - .../iar/SEGGER/SEGGER_RTT_Conf.h | 408 - .../iar/SEGGER/SEGGER_RTT_Syscalls_IAR.c | 99 - .../iar/SEGGER/SEGGER_RTT_printf.c | 484 - .../iar/SEGGER/SEGGER_SYSVIEW.c | 3043 ---- .../iar/SEGGER/SEGGER_SYSVIEW.h | 350 - .../iar/SEGGER/SEGGER_SYSVIEW_Conf.h | 67 - .../iar/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h | 533 - .../iar/SEGGER/SEGGER_SYSVIEW_Config_embOS.c | 124 - .../iar/SEGGER/SEGGER_SYSVIEW_Int.h | 79 - .../iar/SEGGER/SEGGER_SYSVIEW_embOS.c | 227 - .../iar/SEGGER/SEGGER_SYSVIEW_embOS.h | 49 - .../arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP.c | 148 - .../dpp_nucleo-h743zi/iar/Setup/BSP_UART.c | 387 - .../iar/Setup/HardFaultHandler.S | 172 - .../dpp_nucleo-h743zi/iar/Setup/OS_Error.c | 274 - .../iar/Setup/RTOSInit_STM32H7xx.c | 292 - .../iar/Setup/SEGGER_HardFaultHandler.c | 267 - .../iar/Setup/stm32h743xx_flash_rw_sram1.icf | 34 - .../arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx.c | 79 - .../dpp_nucleo-h743zi/iar/Setup/xmtx2.c | 79 - .../dpp_nucleo-h743zi/iar/Setup/xmtx3.c | 79 - .../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd | 4654 ------ .../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp | 3410 ----- .../arm-cm/dpp_nucleo-h743zi/iar/dpp.eww | 7 - .../arm-cm/dpp_nucleo-h743zi/iar/dpp.icf | 84 - .../embos/arm-cm/dpp_nucleo-h743zi/main.cpp | 44 - .../embos/arm-cm/dpp_nucleo-h743zi/philo.cpp | 264 - .../dpp_nucleo-h743zi/stm32h7xx_hal_conf.h | 432 - .../dpp_nucleo-h743zi/stm32h7xx_hal_msp.c | 194 - .../embos/arm-cm/dpp_nucleo-h743zi/table.cpp | 348 - examples/emwin/demo_no_wm/Config/GUIConf.c | 61 - examples/emwin/demo_no_wm/Config/GUIConf.h | 61 - examples/emwin/demo_no_wm/Config/LCDConf.c | 199 - examples/emwin/demo_no_wm/Config/LCDConf.h | 28 - examples/emwin/demo_no_wm/Config/SIMConf.c | 55 - examples/emwin/demo_no_wm/bsp.cpp | 138 - examples/emwin/demo_no_wm/bsp.hpp | 41 - examples/emwin/demo_no_wm/demo_no_wm.sln | 24 - examples/emwin/demo_no_wm/demo_no_wm.vcxproj | 269 - .../demo_no_wm/demo_no_wm.vcxproj.filters | 139 - examples/emwin/demo_no_wm/dpp.hpp | 80 - examples/emwin/demo_no_wm/main.cpp | 74 - examples/emwin/demo_no_wm/philo.cpp | 154 - examples/emwin/demo_no_wm/sim_x.cpp | 51 - examples/emwin/demo_no_wm/simulation.res | Bin 1043100 -> 0 bytes examples/emwin/demo_no_wm/table.cpp | 312 - examples/emwin/demo_no_wm/winmain.cpp | 42 - examples/emwin/demo_with_wm/Config/GUIConf.c | 61 - examples/emwin/demo_with_wm/Config/GUIConf.h | 61 - examples/emwin/demo_with_wm/Config/LCDConf.c | 199 - examples/emwin/demo_with_wm/Config/LCDConf.h | 28 - examples/emwin/demo_with_wm/Config/SIMConf.c | 55 - examples/emwin/demo_with_wm/bsp.cpp | 138 - examples/emwin/demo_with_wm/bsp.hpp | 41 - examples/emwin/demo_with_wm/demo_with_wm.sln | 24 - .../emwin/demo_with_wm/demo_with_wm.vcxproj | 269 - .../demo_with_wm/demo_with_wm.vcxproj.filters | 139 - examples/emwin/demo_with_wm/dpp.hpp | 80 - examples/emwin/demo_with_wm/main.cpp | 74 - examples/emwin/demo_with_wm/philo.cpp | 154 - examples/emwin/demo_with_wm/sim_x.cpp | 51 - examples/emwin/demo_with_wm/simulation.res | Bin 1043100 -> 0 bytes examples/emwin/demo_with_wm/table.cpp | 351 - examples/emwin/demo_with_wm/winmain.cpp | 42 - .../arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h | 116 - .../arm-cm/dpp_ek-tm4c123gxl/README.md | 5 - .../dpp_ek-tm4c123gxl/armclang/dpp.uvoptx | 1047 -- .../dpp_ek-tm4c123gxl/armclang/dpp.uvprojx | 1898 --- .../freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp | 583 - .../freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp | 57 - .../freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp | 111 - .../freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 528 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile | 320 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt | 71 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld | 135 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat | 33 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd | 4654 ------ .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 3385 ----- .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww | 10 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf | 29 - .../arm-cm/dpp_ek-tm4c123gxl/main.cpp | 44 - .../arm-cm/dpp_ek-tm4c123gxl/philo.cpp | 264 - .../arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp | 41 - .../arm-cm/dpp_ek-tm4c123gxl/table.cpp | 348 - .../arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h | 135 - .../dpp_nucleo-h743zi/armclang/dpp.uvoptx | 1180 -- .../dpp_nucleo-h743zi/armclang/dpp.uvprojx | 2114 --- .../freertos/arm-cm/dpp_nucleo-h743zi/bsp.cpp | 571 - .../freertos/arm-cm/dpp_nucleo-h743zi/bsp.hpp | 57 - .../freertos/arm-cm/dpp_nucleo-h743zi/dpp.hpp | 111 - .../freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm | 528 - .../arm-cm/dpp_nucleo-h743zi/gnu/Makefile | 336 - .../arm-cm/dpp_nucleo-h743zi/gnu/README.txt | 84 - .../arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld | 139 - .../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd | 4654 ------ .../arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp | 3424 ----- .../arm-cm/dpp_nucleo-h743zi/iar/dpp.eww | 10 - .../arm-cm/dpp_nucleo-h743zi/iar/dpp.icf | 84 - .../arm-cm/dpp_nucleo-h743zi/main.cpp | 44 - .../arm-cm/dpp_nucleo-h743zi/philo.cpp | 264 - .../arm-cm/dpp_nucleo-h743zi/qp_config.hpp | 41 - .../dpp_nucleo-h743zi/stm32h7xx_hal_conf.h | 432 - .../dpp_nucleo-h743zi/stm32h7xx_hal_msp.c | 194 - .../arm-cm/dpp_nucleo-h743zi/table.cpp | 348 - .../lwip/arm-cm/lwip_ek-lm3s6965/README.txt | 232 - examples/lwip/arm-cm/lwip_ek-lm3s6965/bsp.hpp | 57 - examples/lwip/arm-cm/lwip_ek-lm3s6965/dpp.hpp | 74 - .../lwip/arm-cm/lwip_ek-lm3s6965/fsdata.h | 7491 ---------- examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.c | 116 - examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.h | 75 - .../lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.cpp | 345 - .../lwip/arm-cm/lwip_ek-lm3s6965/lwipopts.h | 489 - .../lwip/arm-cm/lwip_ek-lm3s6965/main.cpp | 74 - .../lwip/arm-cm/lwip_ek-lm3s6965/philo.cpp | 177 - .../lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.cpp | 360 - .../arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile | 319 - .../arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat | 33 - .../arm-cm/lwip_ek-lm3s6965/qk/gnu/lwip-qk.ld | 139 - .../arm-cm/lwip_ek-lm3s6965/qk/iar/README.txt | 55 - .../lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd | 4654 ------ .../lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp | 3407 ----- .../lwip_ek-lm3s6965/qk/iar/lwip-qk.eww | 10 - .../lwip_ek-lm3s6965/qk/iar/lwip-qk.icf | 29 - .../lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.cpp | 363 - .../arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile | 319 - .../arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat | 33 - .../arm-cm/lwip_ek-lm3s6965/qv/gnu/lwip-qv.ld | 139 - .../arm-cm/lwip_ek-lm3s6965/qv/iar/README.txt | 55 - .../lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd | 4654 ------ .../lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp | 3413 ----- .../lwip_ek-lm3s6965/qv/iar/lwip-qv.eww | 10 - .../lwip_ek-lm3s6965/qv/iar/lwip-qv.icf | 29 - .../lwip/arm-cm/lwip_ek-lm3s6965/table.cpp | 304 - .../lwip/arm-cm/lwip_ek-lm3s6965/website.bat | 8 - .../arm-cm/lwip_ek-lm3s6965/website/404.htm | 10 - .../lwip_ek-lm3s6965/website/bg_footer.gif | Bin 886 -> 0 bytes .../lwip_ek-lm3s6965/website/cgi_demo.htm | 85 - .../website/img/AN_QP_and_lwIP.jpg | Bin 7562 -> 0 bytes .../lwip_ek-lm3s6965/website/img/PSiCC2.gif | Bin 6515 -> 0 bytes .../website/img/QP_datasheet.gif | Bin 8696 -> 0 bytes .../lwip_ek-lm3s6965/website/img/arrow.gif | Bin 53 -> 0 bytes .../lwip_ek-lm3s6965/website/img/favicon.ico | Bin 1406 -> 0 bytes .../lwip_ek-lm3s6965/website/img/footer.jpg | Bin 374 -> 0 bytes .../website/img/logo_lwip_qp.jpg | Bin 4902 -> 0 bytes .../lwip_ek-lm3s6965/website/img/logo_ql.jpg | Bin 9661 -> 0 bytes .../website/img/logo_sics.gif | Bin 2152 -> 0 bytes .../arm-cm/lwip_ek-lm3s6965/website/index.htm | 112 - .../lwip_ek-lm3s6965/website/ssi_demo.shtm | 98 - .../arm-cm/lwip_ek-lm3s6965/website/style.css | 27 - .../lwip_ek-lm3s6965/website/thank_you.htm | 52 - .../lwip_ek-lm3s6965/website/udp_demo.htm | 78 - .../blinky_msp-exp430f5529lp/blinky.cpp | 115 - .../blinky_msp-exp430f5529lp/blinky.hpp | 49 - .../msp430/blinky_msp-exp430f5529lp/bsp.hpp | 51 - .../msp430/blinky_msp-exp430f5529lp/main.cpp | 44 - .../blinky_msp-exp430f5529lp/qk/bsp.cpp | 213 - .../qk/ccs-gnu/.ccsproject | 5 - .../qk/ccs-gnu/.cproject | 289 - .../qk/ccs-gnu/.project | 91 - .../qk/ccs-gnu/msp430f5529.ld | 460 - .../qk/ccs-ti/.ccsproject | 14 - .../qk/ccs-ti/.cproject | 332 - .../qk/ccs-ti/.project | 69 - .../qk/ccs-ti/lnk_msp430f5529.cmd | 241 - .../blinky_msp-exp430f5529lp/qp_config.hpp | 50 - .../blinky_msp-exp430f5529lp/qv/bsp.cpp | 211 - .../qv/ccs-gnu/.ccsproject | 5 - .../qv/ccs-gnu/.cproject | 286 - .../qv/ccs-gnu/.project | 91 - .../qv/ccs-gnu/msp430f5529.ld | 460 - .../qv/ccs-ti/.ccsproject | 14 - .../qv/ccs-ti/.cproject | 329 - .../qv/ccs-ti/.project | 74 - .../qv/ccs-ti/lnk_msp430f5529.cmd | 241 - examples/msp430/dpp_msp-exp430f5529lp/bsp.hpp | 56 - examples/msp430/dpp_msp-exp430f5529lp/dpp.hpp | 111 - examples/msp430/dpp_msp-exp430f5529lp/dpp.qm | 528 - .../msp430/dpp_msp-exp430f5529lp/main.cpp | 44 - .../msp430/dpp_msp-exp430f5529lp/philo.cpp | 264 - .../msp430/dpp_msp-exp430f5529lp/qk/bsp.cpp | 431 - .../qk/ccs-gnu/.ccsproject | 14 - .../qk/ccs-gnu/.cproject | 295 - .../dpp_msp-exp430f5529lp/qk/ccs-gnu/.project | 79 - .../qk/ccs-gnu/msp430f5529.ld | 460 - .../qk/ccs-ti/.ccsproject | 14 - .../dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject | 322 - .../dpp_msp-exp430f5529lp/qk/ccs-ti/.project | 79 - .../qk/ccs-ti/lnk_msp430f5529.cmd | 241 - .../dpp_msp-exp430f5529lp/qp_config.hpp | 50 - .../msp430/dpp_msp-exp430f5529lp/qv/bsp.cpp | 431 - .../qv/ccs-gnu/.ccsproject | 14 - .../qv/ccs-gnu/.cproject | 295 - .../dpp_msp-exp430f5529lp/qv/ccs-gnu/.project | 69 - .../qv/ccs-gnu/msp430f5529.ld | 460 - .../qv/ccs-ti/.ccsproject | 14 - .../dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject | 320 - .../dpp_msp-exp430f5529lp/qv/ccs-ti/.project | 79 - .../qv/ccs-ti/lnk_msp430f5529.cmd | 241 - .../msp430/dpp_msp-exp430f5529lp/table.cpp | 348 - .../dpp_efm32-slstk3401a/README.txt | 40 - .../performance/dpp_efm32-slstk3401a/bsp.hpp | 59 - .../performance/dpp_efm32-slstk3401a/dpp.hpp | 102 - .../dpp_efm32-slstk3401a/dpp_qhsm.qm | 501 - .../dpp_efm32-slstk3401a/dpp_qmsm.qm | 506 - .../dpp_efm32-slstk3401a/philo.cpp | 342 - .../dpp_efm32-slstk3401a/qk/bsp.cpp | 480 - .../dpp_efm32-slstk3401a/qk/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp | 3355 ----- .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww | 10 - .../dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf | 29 - .../dpp_efm32-slstk3401a/qk/main.cpp | 68 - .../dpp_efm32-slstk3401a/qv/bsp.cpp | 477 - .../dpp_efm32-slstk3401a/qv/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp | 3361 ----- .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww | 10 - .../dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf | 29 - .../dpp_efm32-slstk3401a/qv/main.cpp | 69 - .../dpp_efm32-slstk3401a/qxk/bsp.cpp | 501 - .../dpp_efm32-slstk3401a/qxk/iar/README.txt | 53 - .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd | 4654 ------ .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp | 3370 ----- .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww | 10 - .../dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf | 29 - .../dpp_efm32-slstk3401a/qxk/main.cpp | 88 - .../dpp_efm32-slstk3401a/qxk/test.cpp | 60 - .../dpp_efm32-slstk3401a/qxk/test.hpp | 44 - .../dpp_efm32-slstk3401a/table.cpp | 389 - .../dpp_efm32-slstk3401a/uc-os2/app_cfg.h | 113 - .../dpp_efm32-slstk3401a/uc-os2/bsp.cpp | 494 - .../uc-os2/iar/dpp-ucos2.ewd | 4654 ------ .../uc-os2/iar/dpp-ucos2.ewp | 3431 ----- .../uc-os2/iar/dpp-ucos2.eww | 10 - .../uc-os2/iar/dpp-ucos2.icf | 29 - .../dpp_efm32-slstk3401a/uc-os2/main.cpp | 103 - .../dpp_efm32-slstk3401a/uc-os2/os_cfg.h | 157 - .../dpp_efm32-slstk3401a/uc-os2/test.cpp | 60 - .../dpp_efm32-slstk3401a/uc-os2/test.h | 43 - examples/pic32/dpp_microstick2-pic32/bsp.hpp | 56 - examples/pic32/dpp_microstick2-pic32/dpp.hpp | 111 - examples/pic32/dpp_microstick2-pic32/dpp.qm | 528 - examples/pic32/dpp_microstick2-pic32/main.cpp | 44 - .../pic32/dpp_microstick2-pic32/philo.cpp | 264 - .../dpp_microstick2-pic32/qk/xc32/Makefile | 108 - .../dpp_microstick2-pic32/qk/xc32/bsp.cpp | 399 - .../qk/xc32/nbproject/Makefile-dbg.mk | 374 - .../nbproject/Makefile-genesis.properties | 23 - .../qk/xc32/nbproject/Makefile-impl.mk | 73 - .../qk/xc32/nbproject/Makefile-local-dbg.mk | 36 - .../qk/xc32/nbproject/Makefile-local-rel.mk | 37 - .../qk/xc32/nbproject/Makefile-local-spy.mk | 37 - .../qk/xc32/nbproject/Makefile-rel.mk | 367 - .../qk/xc32/nbproject/Makefile-spy.mk | 427 - .../qk/xc32/nbproject/Makefile-variables.mk | 18 - .../qk/xc32/nbproject/Package-dbg.bash | 73 - .../qk/xc32/nbproject/Package-rel.bash | 73 - .../qk/xc32/nbproject/Package-spy.bash | 73 - .../qk/xc32/nbproject/configurations.xml | 868 -- .../xc32/nbproject/private/configurations.xml | 61 - .../xc32/nbproject/private/private.properties | 0 .../qk/xc32/nbproject/private/private.xml | 10 - .../qk/xc32/nbproject/project.properties | 0 .../qk/xc32/nbproject/project.xml | 43 - .../dpp_microstick2-pic32/qv/xc32/Makefile | 108 - .../dpp_microstick2-pic32/qv/xc32/bsp.cpp | 395 - .../qv/xc32/nbproject/Makefile-dbg.mk | 367 - .../nbproject/Makefile-genesis.properties | 15 - .../qv/xc32/nbproject/Makefile-impl.mk | 73 - .../qv/xc32/nbproject/Makefile-local-dbg.mk | 37 - .../qv/xc32/nbproject/Makefile-local-rel.mk | 37 - .../qv/xc32/nbproject/Makefile-local-spy.mk | 37 - .../qv/xc32/nbproject/Makefile-rel.mk | 367 - .../qv/xc32/nbproject/Makefile-spy.mk | 415 - .../qv/xc32/nbproject/Makefile-variables.mk | 27 - .../qv/xc32/nbproject/Package-dbg.bash | 73 - .../qv/xc32/nbproject/Package-rel.bash | 73 - .../qv/xc32/nbproject/Package-spy.bash | 73 - .../qv/xc32/nbproject/configurations.xml | 759 - .../xc32/nbproject/private/configurations.xml | 61 - .../xc32/nbproject/private/private.properties | 0 .../qv/xc32/nbproject/private/private.xml | 8 - .../qv/xc32/nbproject/project.properties | 0 .../qv/xc32/nbproject/project.xml | 43 - .../pic32/dpp_microstick2-pic32/table.cpp | 348 - examples/posix-win32/README.md | 114 - examples/posix-win32/blinky/Makefile | 295 - examples/posix-win32/blinky/README.md | 16 - examples/posix-win32/blinky/blinky.cpp | 222 - examples/posix-win32/blinky/blinky.qm | 116 - examples/posix-win32/blinky/blinky_win.png | Bin 9718 -> 0 bytes examples/posix-win32/calc/Makefile | 291 - examples/posix-win32/calc/bsp.cpp | 125 - examples/posix-win32/calc/bsp.hpp | 48 - examples/posix-win32/calc/calc.cpp | 930 -- examples/posix-win32/calc/calc.hpp | 68 - examples/posix-win32/calc/calc.qm | 739 - examples/posix-win32/calc/main.cpp | 140 - examples/posix-win32/calc2/Makefile | 291 - examples/posix-win32/calc2/bsp.cpp | 125 - examples/posix-win32/calc2/bsp.hpp | 48 - examples/posix-win32/calc2/calc2.cpp | 711 - examples/posix-win32/calc2/calc2.hpp | 69 - examples/posix-win32/calc2/calc2.qm | 587 - examples/posix-win32/calc2/main.cpp | 140 - examples/posix-win32/calc_sub/Makefile | 292 - examples/posix-win32/calc_sub/bsp.cpp | 125 - examples/posix-win32/calc_sub/bsp.hpp | 48 - examples/posix-win32/calc_sub/calc_sub.cpp | 1332 -- examples/posix-win32/calc_sub/calc_sub.hpp | 68 - examples/posix-win32/calc_sub/calc_sub.qm | 656 - .../posix-win32/calc_sub/lint-plus/README.txt | 30 - .../posix-win32/calc_sub/lint-plus/lin.bat | 73 - .../calc_sub/lint-plus/options.lnt | 67 - examples/posix-win32/calc_sub/main.cpp | 140 - examples/posix-win32/comp/Makefile | 292 - examples/posix-win32/comp/alarm.cpp | 162 - examples/posix-win32/comp/alarm.hpp | 51 - examples/posix-win32/comp/bsp.cpp | 132 - examples/posix-win32/comp/bsp.hpp | 46 - examples/posix-win32/comp/clock.cpp | 253 - examples/posix-win32/comp/clock.hpp | 80 - examples/posix-win32/comp/comp.qm | 350 - examples/posix-win32/comp/main.cpp | 70 - examples/posix-win32/defer/Makefile | 291 - examples/posix-win32/defer/bsp.cpp | 124 - examples/posix-win32/defer/bsp.hpp | 43 - examples/posix-win32/defer/defer.cpp | 370 - examples/posix-win32/defer/defer.qm | 282 - examples/posix-win32/defer/defer.sln | 42 - examples/posix-win32/defer/defer.vcxproj | 426 - .../posix-win32/defer/defer.vcxproj.filters | 86 - .../posix-win32/defer/qspy200823_204112.seq | 87 - examples/posix-win32/dpp-posix/Makefile | 289 - examples/posix-win32/dpp-posix/bsp.cpp | 252 - examples/posix-win32/dpp-posix/bsp.hpp | 58 - examples/posix-win32/dpp-posix/dpp.hpp | 111 - examples/posix-win32/dpp-posix/dpp.qm | 528 - examples/posix-win32/dpp-posix/main.cpp | 44 - examples/posix-win32/dpp-posix/philo.cpp | 264 - examples/posix-win32/dpp-posix/qp_config.hpp | 54 - examples/posix-win32/dpp-posix/table.cpp | 348 - examples/posix-win32/dpp/Makefile | 299 - examples/posix-win32/dpp/Makefile_t | 299 - examples/posix-win32/dpp/bsp.cpp | 238 - examples/posix-win32/dpp/bsp.hpp | 58 - examples/posix-win32/dpp/dpp.hpp | 111 - examples/posix-win32/dpp/dpp.qm | 528 - examples/posix-win32/dpp/dpp.sln | 42 - examples/posix-win32/dpp/dpp.vcxproj | 429 - examples/posix-win32/dpp/dpp.vcxproj.filters | 89 - examples/posix-win32/dpp/main.cpp | 44 - examples/posix-win32/dpp/philo.cpp | 264 - examples/posix-win32/dpp/qp_config.hpp | 54 - examples/posix-win32/dpp/qview/dpp.py | 112 - examples/posix-win32/dpp/qview/dpp1.py | 155 - .../posix-win32/dpp/qview/img/BTN_DWN.gif | Bin 2071 -> 0 bytes examples/posix-win32/dpp/qview/img/BTN_UP.gif | Bin 1987 -> 0 bytes examples/posix-win32/dpp/qview/img/eating.gif | Bin 3169 -> 0 bytes examples/posix-win32/dpp/qview/img/hungry.gif | Bin 2428 -> 0 bytes .../posix-win32/dpp/qview/img/thinking.gif | Bin 2378 -> 0 bytes examples/posix-win32/dpp/qview/qview-dpp.bat | 8 - examples/posix-win32/dpp/qview/qview-dpp1.bat | 8 - examples/posix-win32/dpp/table.cpp | 348 - examples/posix-win32/dpp_comp/Makefile | 299 - examples/posix-win32/dpp_comp/bsp.cpp | 229 - examples/posix-win32/dpp_comp/bsp.hpp | 58 - examples/posix-win32/dpp_comp/dpp-comp.qm | 532 - examples/posix-win32/dpp_comp/dpp.hpp | 122 - examples/posix-win32/dpp_comp/main.cpp | 44 - examples/posix-win32/dpp_comp/philo.cpp | 248 - examples/posix-win32/dpp_comp/qp_config.hpp | 54 - examples/posix-win32/dpp_comp/table.cpp | 346 - examples/posix-win32/history_qhsm/Makefile | 290 - examples/posix-win32/history_qhsm/history.cpp | 292 - examples/posix-win32/history_qhsm/history.hpp | 45 - examples/posix-win32/history_qhsm/history.qm | 183 - examples/posix-win32/history_qhsm/main.cpp | 105 - examples/posix-win32/history_qmsm/Makefile | 290 - examples/posix-win32/history_qmsm/history.cpp | 465 - examples/posix-win32/history_qmsm/history.hpp | 45 - examples/posix-win32/history_qmsm/history.qm | 182 - examples/posix-win32/history_qmsm/main.cpp | 105 - examples/posix-win32/qhsmtst/Makefile | 233 - examples/posix-win32/qhsmtst/log.txt | 23 - examples/posix-win32/qhsmtst/main.cpp | 145 - examples/posix-win32/qhsmtst/qhsmtst.cpp | 429 - examples/posix-win32/qhsmtst/qhsmtst.hpp | 65 - examples/posix-win32/qhsmtst/qhsmtst.qm | 358 - examples/posix-win32/qmsmtst/Makefile | 233 - examples/posix-win32/qmsmtst/log.txt | 23 - examples/posix-win32/qmsmtst/main.cpp | 145 - examples/posix-win32/qmsmtst/qmsmtst.cpp | 744 - examples/posix-win32/qmsmtst/qmsmtst.hpp | 65 - examples/posix-win32/qmsmtst/qmsmtst.qm | 358 - examples/posix-win32/reminder/Makefile | 290 - examples/posix-win32/reminder/bsp.cpp | 69 - examples/posix-win32/reminder/bsp.hpp | 42 - examples/posix-win32/reminder/reminder.cpp | 207 - examples/posix-win32/reminder2/Makefile | 291 - examples/posix-win32/reminder2/bsp.cpp | 69 - examples/posix-win32/reminder2/bsp.hpp | 42 - examples/posix-win32/reminder2/reminder2.cpp | 256 - examples/posix-win32/reminder2/reminder2.qm | 216 - examples/qutest/blinky/src/blinky.cpp | 148 - examples/qutest/blinky/src/blinky.hpp | 50 - examples/qutest/blinky/src/blinky.qm | 117 - examples/qutest/blinky/src/bsp.cpp | 63 - examples/qutest/blinky/src/bsp.hpp | 49 - examples/qutest/blinky/test/Makefile | 273 - examples/qutest/blinky/test/make_efm32 | 320 - .../qutest/blinky/test/make_nucleo-h743zi | 334 - .../qutest/blinky/test/make_nucleo-l053r8 | 319 - examples/qutest/blinky/test/make_tm4c123 | 322 - examples/qutest/blinky/test/test_blinky.cpp | 108 - examples/qutest/blinky/test/test_blinky.py | 64 - examples/qutest/blinky/test/test_vc.sln | 18 - examples/qutest/blinky/test/test_vc.vcxproj | 186 - .../blinky/test/test_vc.vcxproj.filters | 97 - examples/qutest/dpp-comp/src/bsp.cpp | 126 - examples/qutest/dpp-comp/src/bsp.hpp | 58 - examples/qutest/dpp-comp/src/dpp-comp.qm | 532 - examples/qutest/dpp-comp/src/dpp.hpp | 122 - examples/qutest/dpp-comp/src/philo.cpp | 248 - examples/qutest/dpp-comp/src/table.cpp | 346 - examples/qutest/dpp-comp/test_dpp/Makefile | 274 - examples/qutest/dpp-comp/test_dpp/README.txt | 141 - .../dpp-comp/test_dpp/lnk_msp430f5529.cmd | 251 - examples/qutest/dpp-comp/test_dpp/make_efm32 | 322 - .../dpp-comp/test_dpp/make_nucleo-l053r8 | 321 - examples/qutest/dpp-comp/test_dpp/make_posix | 250 - .../qutest/dpp-comp/test_dpp/make_tm4c123 | 324 - .../qutest/dpp-comp/test_dpp/test_dpp.cpp | 135 - .../qutest/dpp-comp/test_dpp/test_init.py | 47 - .../qutest/dpp-comp/test_dpp/test_tick.py | 44 - examples/qutest/dpp-comp/test_philo/Makefile | 273 - .../qutest/dpp-comp/test_philo/test_init.py | 38 - .../qutest/dpp-comp/test_philo/test_philo.cpp | 137 - .../qutest/dpp-comp/test_philo/test_philo.py | 85 - examples/qutest/dpp-comp/test_table/Makefile | 273 - .../qutest/dpp-comp/test_table/test_init.py | 25 - .../qutest/dpp-comp/test_table/test_table.cpp | 141 - .../qutest/dpp-comp/test_table/test_table.py | 58 - examples/qutest/dpp/src/bsp.cpp | 126 - examples/qutest/dpp/src/bsp.hpp | 58 - examples/qutest/dpp/src/dpp.hpp | 111 - examples/qutest/dpp/src/dpp.qm | 528 - examples/qutest/dpp/src/philo.cpp | 264 - examples/qutest/dpp/src/table.cpp | 348 - examples/qutest/dpp/test_dpp/Makefile | 274 - examples/qutest/dpp/test_dpp/README.txt | 141 - .../qutest/dpp/test_dpp/lnk_msp430f5529.cmd | 251 - examples/qutest/dpp/test_dpp/make_efm32 | 321 - .../qutest/dpp/test_dpp/make_nucleo-l053r8 | 320 - examples/qutest/dpp/test_dpp/make_posix | 249 - examples/qutest/dpp/test_dpp/make_tm4c123 | 323 - examples/qutest/dpp/test_dpp/test_dpp.cpp | 145 - examples/qutest/dpp/test_dpp/test_init.py | 58 - examples/qutest/dpp/test_dpp/test_tick.py | 75 - examples/qutest/dpp/test_philo/Makefile | 273 - examples/qutest/dpp/test_philo/test_init.py | 20 - examples/qutest/dpp/test_philo/test_philo.cpp | 139 - examples/qutest/dpp/test_philo/test_philo.py | 89 - examples/qutest/dpp/test_table/Makefile | 273 - examples/qutest/dpp/test_table/test_init.py | 35 - examples/qutest/dpp/test_table/test_table.cpp | 156 - examples/qutest/dpp/test_table/test_table.py | 85 - examples/qutest/evt_par/src/my_ao.cpp | 63 - examples/qutest/evt_par/src/my_app.hpp | 33 - examples/qutest/evt_par/test/Makefile | 272 - examples/qutest/evt_par/test/make_tm4c123 | 321 - examples/qutest/evt_par/test/test_evt_par.cpp | 151 - examples/qutest/evt_par/test/test_evt_par.py | 32 - examples/qutest/qhsmtst/src/qhsmtst.cpp | 456 - examples/qutest/qhsmtst/src/qhsmtst.hpp | 61 - examples/qutest/qhsmtst/src/qhsmtst.qm | 387 - examples/qutest/qhsmtst/test/Makefile | 272 - .../qutest/qhsmtst/test/make_nucleo-l053r8 | 318 - examples/qutest/qhsmtst/test/make_tm4c123 | 321 - .../qutest/qhsmtst/test/test_qhsm-funct.py | 200 - .../qutest/qhsmtst/test/test_qhsm-struct.py | 213 - examples/qutest/qhsmtst/test/test_qhsm.cpp | 140 - examples/qutest/qmsmtst/src/qmsmtst.cpp | 772 - examples/qutest/qmsmtst/src/qmsmtst.hpp | 61 - examples/qutest/qmsmtst/src/qmsmtst.qm | 388 - examples/qutest/qmsmtst/test/Makefile | 272 - .../qutest/qmsmtst/test/make_nucleo-l053r8 | 318 - examples/qutest/qmsmtst/test/make_tm4c123 | 321 - .../qutest/qmsmtst/test/test_qmsm-funct.py | 200 - .../qutest/qmsmtst/test/test_qmsm-struct.py | 213 - examples/qutest/qmsmtst/test/test_qmsm.cpp | 140 - examples/qutest/self_test/src/README.txt | 2 - examples/qutest/self_test/test/Makefile | 271 - examples/qutest/self_test/test/make_efm32 | 318 - .../qutest/self_test/test/make_nucleo-l053r8 | 317 - examples/qutest/self_test/test/make_posix | 237 - examples/qutest/self_test/test/make_tm4c123 | 320 - examples/qutest/self_test/test/test_assert.py | 37 - .../qutest/self_test/test/test_command.py | 23 - examples/qutest/self_test/test/test_fp.py | 13 - .../qutest/self_test/test/test_include.pyi | 16 - .../qutest/self_test/test/test_last-rec.py | 26 - .../qutest/self_test/test/test_mem-str.py | 21 - .../qutest/self_test/test/test_peek-poke.py | 54 - examples/qutest/self_test/test/test_probe.py | 33 - .../qutest/self_test/test/test_qutest.cpp | 219 - examples/qutest/start_seq/gizmo.qm | 112 - examples/qutest/start_seq/src/bsp.cpp | 61 - examples/qutest/start_seq/src/bsp.hpp | 46 - examples/qutest/start_seq/src/gizmo.cpp | 146 - examples/qutest/start_seq/src/gizmo.hpp | 52 - examples/qutest/start_seq/test/Makefile | 273 - .../qutest/start_seq/test/test_fixture.cpp | 102 - .../qutest/start_seq/test/test_start_seq.py | 53 - examples/qwin-gui/README.md | 82 - examples/qwin-gui/dpp-gui/Res/BTN_DWN.bmp | Bin 5994 -> 0 bytes examples/qwin-gui/dpp-gui/Res/BTN_UP.bmp | Bin 5994 -> 0 bytes examples/qwin-gui/dpp-gui/Res/eating.bmp | Bin 17814 -> 0 bytes examples/qwin-gui/dpp-gui/Res/hungry.bmp | Bin 17814 -> 0 bytes examples/qwin-gui/dpp-gui/Res/qp.ico | Bin 10134 -> 0 bytes examples/qwin-gui/dpp-gui/Res/thinking.bmp | Bin 17814 -> 0 bytes examples/qwin-gui/dpp-gui/Resource.rc | Bin 7354 -> 0 bytes examples/qwin-gui/dpp-gui/bsp.cpp | 377 - examples/qwin-gui/dpp-gui/bsp.hpp | 59 - examples/qwin-gui/dpp-gui/dpp-gui.sln | 23 - examples/qwin-gui/dpp-gui/dpp-gui.vcxproj | 320 - .../qwin-gui/dpp-gui/dpp-gui.vcxproj.filters | 122 - examples/qwin-gui/dpp-gui/dpp.hpp | 111 - examples/qwin-gui/dpp-gui/dpp.qm | 528 - examples/qwin-gui/dpp-gui/main.cpp | 89 - examples/qwin-gui/dpp-gui/philo.cpp | 264 - examples/qwin-gui/dpp-gui/resource.h | 35 - examples/qwin-gui/dpp-gui/table.cpp | 348 - examples/qwin-gui/game-gui/Res/BOARD.bmp | Bin 1659366 -> 0 bytes examples/qwin-gui/game-gui/Res/BTN_DWN.bmp | Bin 14132 -> 0 bytes examples/qwin-gui/game-gui/Res/BTN_UP.bmp | Bin 14132 -> 0 bytes examples/qwin-gui/game-gui/Res/LCD.bmp | Bin 196662 -> 0 bytes examples/qwin-gui/game-gui/Res/LED_OFF.bmp | Bin 784 -> 0 bytes examples/qwin-gui/game-gui/Res/LED_ON.bmp | Bin 784 -> 0 bytes examples/qwin-gui/game-gui/Res/qp.ico | Bin 10134 -> 0 bytes examples/qwin-gui/game-gui/Res/seg.bmp | Bin 38334 -> 0 bytes examples/qwin-gui/game-gui/Res/seg0.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg1.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg2.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg3.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg4.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg5.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg6.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg7.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg8.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Res/seg9.bmp | Bin 4926 -> 0 bytes examples/qwin-gui/game-gui/Resource.rc | Bin 8826 -> 0 bytes examples/qwin-gui/game-gui/bsp.cpp | 898 -- examples/qwin-gui/game-gui/bsp.hpp | 69 - examples/qwin-gui/game-gui/game-gui.sln | 23 - examples/qwin-gui/game-gui/game-gui.vcxproj | 332 - .../game-gui/game-gui.vcxproj.filters | 131 - examples/qwin-gui/game-gui/game.hpp | 171 - examples/qwin-gui/game-gui/game.qm | 1448 -- examples/qwin-gui/game-gui/main.cpp | 120 - examples/qwin-gui/game-gui/make.bat | 24 - examples/qwin-gui/game-gui/mine1.cpp | 289 - examples/qwin-gui/game-gui/mine2.cpp | 288 - examples/qwin-gui/game-gui/missile.cpp | 212 - examples/qwin-gui/game-gui/resource.h | 43 - examples/qwin-gui/game-gui/ship.cpp | 279 - examples/qwin-gui/game-gui/tunnel.cpp | 674 - .../threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp | 451 - .../threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp | 58 - .../threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp | 111 - .../threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 528 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd | 4654 ------ .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 3836 ----- .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww | 10 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf | 29 - .../threadx/arm-cm/dpp_ek-tm4c123gxl/main.cpp | 77 - .../arm-cm/dpp_ek-tm4c123gxl/philo.cpp | 264 - .../arm-cm/dpp_ek-tm4c123gxl/table.cpp | 348 - .../arm-cm/dpp_stm32f429-discovery/bsp.cpp | 485 - .../arm-cm/dpp_stm32f429-discovery/bsp.hpp | 58 - .../arm-cm/dpp_stm32f429-discovery/dpp.hpp | 111 - .../arm-cm/dpp_stm32f429-discovery/dpp.qm | 528 - .../dpp_stm32f429-discovery/iar/dpp.ewd | 4654 ------ .../dpp_stm32f429-discovery/iar/dpp.ewp | 3857 ----- .../dpp_stm32f429-discovery/iar/dpp.eww | 10 - .../dpp_stm32f429-discovery/iar/dpp.icf | 31 - .../arm-cm/dpp_stm32f429-discovery/main.cpp | 77 - .../arm-cm/dpp_stm32f429-discovery/philo.cpp | 264 - .../arm-cm/dpp_stm32f429-discovery/table.cpp | 348 - examples/uc-os2/arm-cm/README.txt | 31 - .../arm-cm/dpp_ek-tm4c123gxl/README.txt | 36 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/app_cfg.h | 113 - .../dpp_ek-tm4c123gxl/armclang/dpp.uvoptx | 1191 -- .../dpp_ek-tm4c123gxl/armclang/dpp.uvprojx | 2078 --- .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp | 498 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp | 58 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp | 111 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm | 528 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile | 326 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt | 71 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld | 139 - .../arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat | 33 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd | 4654 ------ .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp | 3422 ----- .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww | 10 - .../arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf | 29 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/main.cpp | 44 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/os_cfg.h | 154 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.cpp | 264 - .../uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.cpp | 348 - examples/zephyr/blinky/CMakeLists.txt | 64 - examples/zephyr/blinky/README.md | 51 - examples/zephyr/blinky/prj.conf | 12 - examples/zephyr/blinky/src/blinky.cpp | 123 - examples/zephyr/blinky/src/blinky.hpp | 53 - examples/zephyr/blinky/src/bsp.cpp | 153 - examples/zephyr/blinky/src/bsp.hpp | 50 - examples/zephyr/blinky/src/main.cpp | 44 - examples/zephyr/blinky/src/qp_config.hpp | 41 - examples/zephyr/dpp/CMakeLists.txt | 65 - examples/zephyr/dpp/README.md | 52 - examples/zephyr/dpp/prj.conf | 12 - examples/zephyr/dpp/src/bsp.cpp | 341 - examples/zephyr/dpp/src/bsp.hpp | 58 - examples/zephyr/dpp/src/dpp.hpp | 111 - examples/zephyr/dpp/src/dpp.qm | 528 - examples/zephyr/dpp/src/main.cpp | 44 - examples/zephyr/dpp/src/philo.cpp | 264 - examples/zephyr/dpp/src/qp_config.hpp | 41 - examples/zephyr/dpp/src/table.cpp | 348 - include/qp.hpp | 4 +- include/qs.hpp | 5 + ports/posix-qutest/qutest_port.cpp | 28 +- ports/posix-qv/qf_port.cpp | 33 +- ports/posix-qv/qp_port.hpp | 24 +- ports/posix/qf_port.cpp | 40 +- ports/posix/qp_port.hpp | 23 +- ports/win32-qutest/qutest_port.cpp | 19 +- ports/win32-qv/qf_port.cpp | 9 +- ports/win32-qv/qp_port.hpp | 18 +- ports/win32/qf_port.cpp | 7 +- ports/win32/qp_port.hpp | 18 +- qpcpp.md5 | 28 +- qpcpp.qm | 23 +- qpcpp.xml | 12231 ---------------- src/qs/qs_rx.cpp | 17 + 1560 files changed, 176 insertions(+), 850904 deletions(-) create mode 160000 examples delete mode 100644 examples/arm-cm/README.md delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/README.md delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/blinky.cpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/blinky.hpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/ek-tm4c123gxl.jpg delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/main.cpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.sct delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvoptx delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvprojx delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/bsp.cpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/Makefile delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/blinky-qk.ld delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.sct delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvoptx delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvprojx delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/bsp.cpp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/Makefile delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/blinky-qv.ld delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/README.txt delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww delete mode 100644 examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/README.md delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/blinky.cpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/blinky.hpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/bsp.hpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/main.cpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.sct delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvoptx delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvprojx delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/bsp.cpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/Makefile delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/blinky-qk.ld delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewd delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.eww delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.icf delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.sct delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvoptx delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvprojx delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/bsp.cpp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/Makefile delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/blinky-qv.ld delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewd delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewp delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.eww delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.icf delete mode 100644 examples/arm-cm/blinky_nucleo-c031c6/stm32-nucleo-c031c6.jpg delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/README.md delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/bsp.hpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/dpp.hpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/main.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/philo.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qp_config.hpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_efm32-slstk3401a/table.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/README.md delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/lin.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/options.lnt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/main.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/philo.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.ccsproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.cproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.project delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.ccsproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.cproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.project delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.ccsproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.cproject delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.project delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl/table.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/bsp.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp_mpu.qm delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/lin.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/options.lnt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/main.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/philo.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qp_config.hpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_ek-tm4c123gxl_mpu/table.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/bsp.hpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/dpp.hpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/dpp.qm delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/main.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/mbed-lpc1768.jpeg delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/philo.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_mbed-lpc1768/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/dpp.qm delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile-cpp20 delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qp_config.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qspy-output.png delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile-cpp20 delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp.lnk delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.lnk delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/RTE/_dpp-dbg/Pre_Include_Utility_QS.h delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/RTE/_dpp-dbg/RTE_Components.h delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile-cpp20 delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/stm32-nucleo-c031c6.jpg delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp_mpu.qm delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qp_config.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp.lnk delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.lnk delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/stm32-nucleo-c031c6.jpg delete mode 100644 examples/arm-cm/dpp_nucleo-c031c6_mpu/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/dpp.qm delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/iar/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c delete mode 100644 examples/arm-cm/dpp_nucleo-h743zi/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/dpp.qm delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l053r8/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/dpp.qm delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l152re/table.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/README.md delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/bsp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/dpp.hpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/dpp.qm delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/main.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/philo.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/dpp.py delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/dpp1.py delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/img/eating.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/img/hungry.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/img/thinking.gif delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/qview-dpp.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qview/qview-dpp1.bat delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/stm32-nucleo-l552ze.jpg delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_conf.h delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_msp.c delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_nucleo_conf.h delete mode 100644 examples/arm-cm/dpp_nucleo-l552ze/table.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/README.md delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/bsp.hpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/dpp.hpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/dpp.qm delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/main.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/philo.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.sct delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvoptx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvprojx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/dpp-qk.ld delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.sct delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvoptx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvprojx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/bsp.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/dpp-qv.ld delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.sct delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvoptx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvprojx delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/bsp.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/dpp-qxk.ld delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/flash.bat delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread1.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread2.cpp delete mode 100644 examples/arm-cm/dpp_stm32f4-discovery/table.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/README.md delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/bsp.hpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/game.hpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/game.qm delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/main.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/mine1.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/mine2.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/missile.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/armclang/README.txt delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvoptx delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvprojx delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/bsp.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/gnu/Makefile delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/gnu/README.txt delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/gnu/game-qk.ld delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/iar/README.txt delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewd delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.eww delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.icf delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/armclang/README.txt delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvoptx delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvprojx delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/bsp.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/gnu/Makefile delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/gnu/README.txt delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/gnu/game-qv.ld delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewd delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.eww delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.icf delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/ship.cpp delete mode 100644 examples/arm-cm/game_efm32-slstk3401a/tunnel.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/README.md delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/blinky0.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/blinky1.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/low-power.qm delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/low_power.hpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/main.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvoptx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvprojx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/bsp.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/Makefile delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/flash.bat delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/low-power-qk.ld delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewd delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.eww delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.icf delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qp_config.hpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvoptx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvprojx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/bsp.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/Makefile delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/flash.bat delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/low-power-qv.ld delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewd delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.eww delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.icf delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvoptx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvprojx delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/bsp.cpp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/Makefile delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/README.txt delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/flash.bat delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/low-power-qxk.ld delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewd delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewp delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.eww delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.icf delete mode 100644 examples/arm-cm/low-power_ek-tm4c123gxl/qxk/xblinky1.cpp delete mode 100644 examples/arm-cm/qp_arm-cm.jpg delete mode 100644 examples/arm-cm/qspy-output.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/README.md delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/app.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.sct delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvoptx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvprojx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/main.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/periodic1.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/periodic4.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/real-time.qm delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic2.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic3.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.pvs delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.sr delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/app.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.sct delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvoptx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvprojx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/main.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic1.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic4.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/real-time-ms-tt.qm delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/sporadic2.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/sporadic3.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/traces/rt-qv-tt.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/traces/rt-qv-tt.sr delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/ttsched.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/app.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.sct delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvoptx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvprojx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/main.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic1.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic4.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/real-time-ms.qm delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/sporadic2.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/sporadic3.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.pvs delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.sr delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/app.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.sct delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvoptx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvprojx delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.hpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/main.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/periodic1.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/periodic4.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/real-time.qm delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic2.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic3.cpp delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.pvs delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.sr delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/real-time_trace.png delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/stm32-nucleo-l053r8.jpg delete mode 100644 examples/arm-cm/real-time_nucleo-l053r8/stm32-nucleo-l053r8_conn.png delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/README.md delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/blinky.cpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/blinky.hpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/bsp.hpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/launchxl2-tms57012.png delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/main.cpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/bsp.cpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewd delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.eww delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.icf delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.ccsproject delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.cproject delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.project delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/bsp.cpp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewd delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewp delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.eww delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.icf delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.ccsproject delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.cproject delete mode 100644 examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.project delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/README.md delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/bsp.hpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/dpp.hpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/launchxl2-tms57012.png delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/main.cpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/philo.cpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/bsp.cpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.ccsproject delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.cproject delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.project delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qspy-output.png delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/bsp.cpp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.ccsproject delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.cproject delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.project delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp.py delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp1.py delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_DWN.gif delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_UP.gif delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/img/eating.gif delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/img/hungry.gif delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/img/thinking.gif delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/qview-dpp.bat delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/qview/qview-dpp1.bat delete mode 100644 examples/arm-cr/dpp_launchxl2-tms57012/table.cpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.cpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.hpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.hpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.qm delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_ASM_ARMv7M.S delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Conf.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Syscalls_GCC.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_printf.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Conf.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Config_embOS.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Int.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/BSP.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/HardFaultHandler.S delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Error.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_MallocLock.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Syscalls.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/RTOSInit_STM32H7xx.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/SEGGER_HardFaultHandler.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/STM32H743XIHx_FLASH.ld delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_ASM_ARMv7M.S delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Conf.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Syscalls_IAR.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_printf.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Conf.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Config_embOS.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Int.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP_UART.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/HardFaultHandler.S delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/OS_Error.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/RTOSInit_STM32H7xx.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/SEGGER_HardFaultHandler.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/stm32h743xx_flash_rw_sram1.icf delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx2.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx3.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/main.cpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/philo.cpp delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c delete mode 100644 examples/embos/arm-cm/dpp_nucleo-h743zi/table.cpp delete mode 100644 examples/emwin/demo_no_wm/Config/GUIConf.c delete mode 100644 examples/emwin/demo_no_wm/Config/GUIConf.h delete mode 100644 examples/emwin/demo_no_wm/Config/LCDConf.c delete mode 100644 examples/emwin/demo_no_wm/Config/LCDConf.h delete mode 100644 examples/emwin/demo_no_wm/Config/SIMConf.c delete mode 100644 examples/emwin/demo_no_wm/bsp.cpp delete mode 100644 examples/emwin/demo_no_wm/bsp.hpp delete mode 100644 examples/emwin/demo_no_wm/demo_no_wm.sln delete mode 100644 examples/emwin/demo_no_wm/demo_no_wm.vcxproj delete mode 100644 examples/emwin/demo_no_wm/demo_no_wm.vcxproj.filters delete mode 100644 examples/emwin/demo_no_wm/dpp.hpp delete mode 100644 examples/emwin/demo_no_wm/main.cpp delete mode 100644 examples/emwin/demo_no_wm/philo.cpp delete mode 100644 examples/emwin/demo_no_wm/sim_x.cpp delete mode 100644 examples/emwin/demo_no_wm/simulation.res delete mode 100644 examples/emwin/demo_no_wm/table.cpp delete mode 100644 examples/emwin/demo_no_wm/winmain.cpp delete mode 100644 examples/emwin/demo_with_wm/Config/GUIConf.c delete mode 100644 examples/emwin/demo_with_wm/Config/GUIConf.h delete mode 100644 examples/emwin/demo_with_wm/Config/LCDConf.c delete mode 100644 examples/emwin/demo_with_wm/Config/LCDConf.h delete mode 100644 examples/emwin/demo_with_wm/Config/SIMConf.c delete mode 100644 examples/emwin/demo_with_wm/bsp.cpp delete mode 100644 examples/emwin/demo_with_wm/bsp.hpp delete mode 100644 examples/emwin/demo_with_wm/demo_with_wm.sln delete mode 100644 examples/emwin/demo_with_wm/demo_with_wm.vcxproj delete mode 100644 examples/emwin/demo_with_wm/demo_with_wm.vcxproj.filters delete mode 100644 examples/emwin/demo_with_wm/dpp.hpp delete mode 100644 examples/emwin/demo_with_wm/main.cpp delete mode 100644 examples/emwin/demo_with_wm/philo.cpp delete mode 100644 examples/emwin/demo_with_wm/sim_x.cpp delete mode 100644 examples/emwin/demo_with_wm/simulation.res delete mode 100644 examples/emwin/demo_with_wm/table.cpp delete mode 100644 examples/emwin/demo_with_wm/winmain.cpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/README.md delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/main.cpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/philo.cpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp delete mode 100644 examples/freertos/arm-cm/dpp_ek-tm4c123gxl/table.cpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvoptx delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvprojx delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.cpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.hpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.hpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/README.txt delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/main.cpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/philo.cpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/qp_config.hpp delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c delete mode 100644 examples/freertos/arm-cm/dpp_nucleo-h743zi/table.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/README.txt delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/bsp.hpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/dpp.hpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/fsdata.h delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.c delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.h delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipopts.h delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/main.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/philo.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/lwip-qk.ld delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/README.txt delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.eww delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.icf delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/lwip-qv.ld delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/README.txt delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.eww delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.icf delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/table.cpp delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website.bat delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/404.htm delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/bg_footer.gif delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/cgi_demo.htm delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/AN_QP_and_lwIP.jpg delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/PSiCC2.gif delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/QP_datasheet.gif delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/arrow.gif delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/favicon.ico delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/footer.jpg delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_lwip_qp.jpg delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_ql.jpg delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_sics.gif delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/index.htm delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/ssi_demo.shtm delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/style.css delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/thank_you.htm delete mode 100644 examples/lwip/arm-cm/lwip_ek-lm3s6965/website/udp_demo.htm delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/blinky.cpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/blinky.hpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/bsp.hpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/main.cpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/bsp.cpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.cproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.project delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.ccsproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.cproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.project delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qp_config.hpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/bsp.cpp delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.cproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.project delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.ccsproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.cproject delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.project delete mode 100644 examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/bsp.hpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/dpp.hpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/dpp.qm delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/main.cpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/philo.cpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/bsp.cpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.cproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.project delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.ccsproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.project delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qp_config.hpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/bsp.cpp delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.cproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.project delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.ccsproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.project delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd delete mode 100644 examples/msp430/dpp_msp-exp430f5529lp/table.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/README.txt delete mode 100644 examples/performance/dpp_efm32-slstk3401a/bsp.hpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/dpp.hpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/dpp_qhsm.qm delete mode 100644 examples/performance/dpp_efm32-slstk3401a/dpp_qmsm.qm delete mode 100644 examples/performance/dpp_efm32-slstk3401a/philo.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/bsp.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/iar/README.txt delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qk/main.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/bsp.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/iar/README.txt delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qv/main.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/bsp.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/iar/README.txt delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/main.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/test.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/qxk/test.hpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/table.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/app_cfg.h delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/bsp.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewd delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.eww delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.icf delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/main.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/os_cfg.h delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/test.cpp delete mode 100644 examples/performance/dpp_efm32-slstk3401a/uc-os2/test.h delete mode 100644 examples/pic32/dpp_microstick2-pic32/bsp.hpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/dpp.hpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/dpp.qm delete mode 100644 examples/pic32/dpp_microstick2-pic32/main.cpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/philo.cpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/Makefile delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/bsp.cpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-dbg.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-genesis.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-impl.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-dbg.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-rel.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-spy.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-rel.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-spy.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-variables.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-dbg.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-rel.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-spy.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/configurations.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/configurations.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/Makefile delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/bsp.cpp delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-dbg.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-genesis.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-impl.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-dbg.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-rel.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-spy.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-rel.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-spy.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-variables.mk delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-dbg.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-rel.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-spy.bash delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/configurations.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/configurations.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.properties delete mode 100644 examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.xml delete mode 100644 examples/pic32/dpp_microstick2-pic32/table.cpp delete mode 100644 examples/posix-win32/README.md delete mode 100644 examples/posix-win32/blinky/Makefile delete mode 100644 examples/posix-win32/blinky/README.md delete mode 100644 examples/posix-win32/blinky/blinky.cpp delete mode 100644 examples/posix-win32/blinky/blinky.qm delete mode 100644 examples/posix-win32/blinky/blinky_win.png delete mode 100644 examples/posix-win32/calc/Makefile delete mode 100644 examples/posix-win32/calc/bsp.cpp delete mode 100644 examples/posix-win32/calc/bsp.hpp delete mode 100644 examples/posix-win32/calc/calc.cpp delete mode 100644 examples/posix-win32/calc/calc.hpp delete mode 100644 examples/posix-win32/calc/calc.qm delete mode 100644 examples/posix-win32/calc/main.cpp delete mode 100644 examples/posix-win32/calc2/Makefile delete mode 100644 examples/posix-win32/calc2/bsp.cpp delete mode 100644 examples/posix-win32/calc2/bsp.hpp delete mode 100644 examples/posix-win32/calc2/calc2.cpp delete mode 100644 examples/posix-win32/calc2/calc2.hpp delete mode 100644 examples/posix-win32/calc2/calc2.qm delete mode 100644 examples/posix-win32/calc2/main.cpp delete mode 100644 examples/posix-win32/calc_sub/Makefile delete mode 100644 examples/posix-win32/calc_sub/bsp.cpp delete mode 100644 examples/posix-win32/calc_sub/bsp.hpp delete mode 100644 examples/posix-win32/calc_sub/calc_sub.cpp delete mode 100644 examples/posix-win32/calc_sub/calc_sub.hpp delete mode 100644 examples/posix-win32/calc_sub/calc_sub.qm delete mode 100644 examples/posix-win32/calc_sub/lint-plus/README.txt delete mode 100644 examples/posix-win32/calc_sub/lint-plus/lin.bat delete mode 100644 examples/posix-win32/calc_sub/lint-plus/options.lnt delete mode 100644 examples/posix-win32/calc_sub/main.cpp delete mode 100644 examples/posix-win32/comp/Makefile delete mode 100644 examples/posix-win32/comp/alarm.cpp delete mode 100644 examples/posix-win32/comp/alarm.hpp delete mode 100644 examples/posix-win32/comp/bsp.cpp delete mode 100644 examples/posix-win32/comp/bsp.hpp delete mode 100644 examples/posix-win32/comp/clock.cpp delete mode 100644 examples/posix-win32/comp/clock.hpp delete mode 100644 examples/posix-win32/comp/comp.qm delete mode 100644 examples/posix-win32/comp/main.cpp delete mode 100644 examples/posix-win32/defer/Makefile delete mode 100644 examples/posix-win32/defer/bsp.cpp delete mode 100644 examples/posix-win32/defer/bsp.hpp delete mode 100644 examples/posix-win32/defer/defer.cpp delete mode 100644 examples/posix-win32/defer/defer.qm delete mode 100644 examples/posix-win32/defer/defer.sln delete mode 100644 examples/posix-win32/defer/defer.vcxproj delete mode 100644 examples/posix-win32/defer/defer.vcxproj.filters delete mode 100644 examples/posix-win32/defer/qspy200823_204112.seq delete mode 100644 examples/posix-win32/dpp-posix/Makefile delete mode 100644 examples/posix-win32/dpp-posix/bsp.cpp delete mode 100644 examples/posix-win32/dpp-posix/bsp.hpp delete mode 100644 examples/posix-win32/dpp-posix/dpp.hpp delete mode 100644 examples/posix-win32/dpp-posix/dpp.qm delete mode 100644 examples/posix-win32/dpp-posix/main.cpp delete mode 100644 examples/posix-win32/dpp-posix/philo.cpp delete mode 100644 examples/posix-win32/dpp-posix/qp_config.hpp delete mode 100644 examples/posix-win32/dpp-posix/table.cpp delete mode 100644 examples/posix-win32/dpp/Makefile delete mode 100644 examples/posix-win32/dpp/Makefile_t delete mode 100644 examples/posix-win32/dpp/bsp.cpp delete mode 100644 examples/posix-win32/dpp/bsp.hpp delete mode 100644 examples/posix-win32/dpp/dpp.hpp delete mode 100644 examples/posix-win32/dpp/dpp.qm delete mode 100644 examples/posix-win32/dpp/dpp.sln delete mode 100644 examples/posix-win32/dpp/dpp.vcxproj delete mode 100644 examples/posix-win32/dpp/dpp.vcxproj.filters delete mode 100644 examples/posix-win32/dpp/main.cpp delete mode 100644 examples/posix-win32/dpp/philo.cpp delete mode 100644 examples/posix-win32/dpp/qp_config.hpp delete mode 100644 examples/posix-win32/dpp/qview/dpp.py delete mode 100644 examples/posix-win32/dpp/qview/dpp1.py delete mode 100644 examples/posix-win32/dpp/qview/img/BTN_DWN.gif delete mode 100644 examples/posix-win32/dpp/qview/img/BTN_UP.gif delete mode 100644 examples/posix-win32/dpp/qview/img/eating.gif delete mode 100644 examples/posix-win32/dpp/qview/img/hungry.gif delete mode 100644 examples/posix-win32/dpp/qview/img/thinking.gif delete mode 100644 examples/posix-win32/dpp/qview/qview-dpp.bat delete mode 100644 examples/posix-win32/dpp/qview/qview-dpp1.bat delete mode 100644 examples/posix-win32/dpp/table.cpp delete mode 100644 examples/posix-win32/dpp_comp/Makefile delete mode 100644 examples/posix-win32/dpp_comp/bsp.cpp delete mode 100644 examples/posix-win32/dpp_comp/bsp.hpp delete mode 100644 examples/posix-win32/dpp_comp/dpp-comp.qm delete mode 100644 examples/posix-win32/dpp_comp/dpp.hpp delete mode 100644 examples/posix-win32/dpp_comp/main.cpp delete mode 100644 examples/posix-win32/dpp_comp/philo.cpp delete mode 100644 examples/posix-win32/dpp_comp/qp_config.hpp delete mode 100644 examples/posix-win32/dpp_comp/table.cpp delete mode 100644 examples/posix-win32/history_qhsm/Makefile delete mode 100644 examples/posix-win32/history_qhsm/history.cpp delete mode 100644 examples/posix-win32/history_qhsm/history.hpp delete mode 100644 examples/posix-win32/history_qhsm/history.qm delete mode 100644 examples/posix-win32/history_qhsm/main.cpp delete mode 100644 examples/posix-win32/history_qmsm/Makefile delete mode 100644 examples/posix-win32/history_qmsm/history.cpp delete mode 100644 examples/posix-win32/history_qmsm/history.hpp delete mode 100644 examples/posix-win32/history_qmsm/history.qm delete mode 100644 examples/posix-win32/history_qmsm/main.cpp delete mode 100644 examples/posix-win32/qhsmtst/Makefile delete mode 100644 examples/posix-win32/qhsmtst/log.txt delete mode 100644 examples/posix-win32/qhsmtst/main.cpp delete mode 100644 examples/posix-win32/qhsmtst/qhsmtst.cpp delete mode 100644 examples/posix-win32/qhsmtst/qhsmtst.hpp delete mode 100644 examples/posix-win32/qhsmtst/qhsmtst.qm delete mode 100644 examples/posix-win32/qmsmtst/Makefile delete mode 100644 examples/posix-win32/qmsmtst/log.txt delete mode 100644 examples/posix-win32/qmsmtst/main.cpp delete mode 100644 examples/posix-win32/qmsmtst/qmsmtst.cpp delete mode 100644 examples/posix-win32/qmsmtst/qmsmtst.hpp delete mode 100644 examples/posix-win32/qmsmtst/qmsmtst.qm delete mode 100644 examples/posix-win32/reminder/Makefile delete mode 100644 examples/posix-win32/reminder/bsp.cpp delete mode 100644 examples/posix-win32/reminder/bsp.hpp delete mode 100644 examples/posix-win32/reminder/reminder.cpp delete mode 100644 examples/posix-win32/reminder2/Makefile delete mode 100644 examples/posix-win32/reminder2/bsp.cpp delete mode 100644 examples/posix-win32/reminder2/bsp.hpp delete mode 100644 examples/posix-win32/reminder2/reminder2.cpp delete mode 100644 examples/posix-win32/reminder2/reminder2.qm delete mode 100644 examples/qutest/blinky/src/blinky.cpp delete mode 100644 examples/qutest/blinky/src/blinky.hpp delete mode 100644 examples/qutest/blinky/src/blinky.qm delete mode 100644 examples/qutest/blinky/src/bsp.cpp delete mode 100644 examples/qutest/blinky/src/bsp.hpp delete mode 100644 examples/qutest/blinky/test/Makefile delete mode 100644 examples/qutest/blinky/test/make_efm32 delete mode 100644 examples/qutest/blinky/test/make_nucleo-h743zi delete mode 100644 examples/qutest/blinky/test/make_nucleo-l053r8 delete mode 100644 examples/qutest/blinky/test/make_tm4c123 delete mode 100644 examples/qutest/blinky/test/test_blinky.cpp delete mode 100644 examples/qutest/blinky/test/test_blinky.py delete mode 100644 examples/qutest/blinky/test/test_vc.sln delete mode 100644 examples/qutest/blinky/test/test_vc.vcxproj delete mode 100644 examples/qutest/blinky/test/test_vc.vcxproj.filters delete mode 100644 examples/qutest/dpp-comp/src/bsp.cpp delete mode 100644 examples/qutest/dpp-comp/src/bsp.hpp delete mode 100644 examples/qutest/dpp-comp/src/dpp-comp.qm delete mode 100644 examples/qutest/dpp-comp/src/dpp.hpp delete mode 100644 examples/qutest/dpp-comp/src/philo.cpp delete mode 100644 examples/qutest/dpp-comp/src/table.cpp delete mode 100644 examples/qutest/dpp-comp/test_dpp/Makefile delete mode 100644 examples/qutest/dpp-comp/test_dpp/README.txt delete mode 100644 examples/qutest/dpp-comp/test_dpp/lnk_msp430f5529.cmd delete mode 100644 examples/qutest/dpp-comp/test_dpp/make_efm32 delete mode 100644 examples/qutest/dpp-comp/test_dpp/make_nucleo-l053r8 delete mode 100644 examples/qutest/dpp-comp/test_dpp/make_posix delete mode 100644 examples/qutest/dpp-comp/test_dpp/make_tm4c123 delete mode 100644 examples/qutest/dpp-comp/test_dpp/test_dpp.cpp delete mode 100644 examples/qutest/dpp-comp/test_dpp/test_init.py delete mode 100644 examples/qutest/dpp-comp/test_dpp/test_tick.py delete mode 100644 examples/qutest/dpp-comp/test_philo/Makefile delete mode 100644 examples/qutest/dpp-comp/test_philo/test_init.py delete mode 100644 examples/qutest/dpp-comp/test_philo/test_philo.cpp delete mode 100644 examples/qutest/dpp-comp/test_philo/test_philo.py delete mode 100644 examples/qutest/dpp-comp/test_table/Makefile delete mode 100644 examples/qutest/dpp-comp/test_table/test_init.py delete mode 100644 examples/qutest/dpp-comp/test_table/test_table.cpp delete mode 100644 examples/qutest/dpp-comp/test_table/test_table.py delete mode 100644 examples/qutest/dpp/src/bsp.cpp delete mode 100644 examples/qutest/dpp/src/bsp.hpp delete mode 100644 examples/qutest/dpp/src/dpp.hpp delete mode 100644 examples/qutest/dpp/src/dpp.qm delete mode 100644 examples/qutest/dpp/src/philo.cpp delete mode 100644 examples/qutest/dpp/src/table.cpp delete mode 100644 examples/qutest/dpp/test_dpp/Makefile delete mode 100644 examples/qutest/dpp/test_dpp/README.txt delete mode 100644 examples/qutest/dpp/test_dpp/lnk_msp430f5529.cmd delete mode 100644 examples/qutest/dpp/test_dpp/make_efm32 delete mode 100644 examples/qutest/dpp/test_dpp/make_nucleo-l053r8 delete mode 100644 examples/qutest/dpp/test_dpp/make_posix delete mode 100644 examples/qutest/dpp/test_dpp/make_tm4c123 delete mode 100644 examples/qutest/dpp/test_dpp/test_dpp.cpp delete mode 100644 examples/qutest/dpp/test_dpp/test_init.py delete mode 100644 examples/qutest/dpp/test_dpp/test_tick.py delete mode 100644 examples/qutest/dpp/test_philo/Makefile delete mode 100644 examples/qutest/dpp/test_philo/test_init.py delete mode 100644 examples/qutest/dpp/test_philo/test_philo.cpp delete mode 100644 examples/qutest/dpp/test_philo/test_philo.py delete mode 100644 examples/qutest/dpp/test_table/Makefile delete mode 100644 examples/qutest/dpp/test_table/test_init.py delete mode 100644 examples/qutest/dpp/test_table/test_table.cpp delete mode 100644 examples/qutest/dpp/test_table/test_table.py delete mode 100644 examples/qutest/evt_par/src/my_ao.cpp delete mode 100644 examples/qutest/evt_par/src/my_app.hpp delete mode 100644 examples/qutest/evt_par/test/Makefile delete mode 100644 examples/qutest/evt_par/test/make_tm4c123 delete mode 100644 examples/qutest/evt_par/test/test_evt_par.cpp delete mode 100644 examples/qutest/evt_par/test/test_evt_par.py delete mode 100644 examples/qutest/qhsmtst/src/qhsmtst.cpp delete mode 100644 examples/qutest/qhsmtst/src/qhsmtst.hpp delete mode 100644 examples/qutest/qhsmtst/src/qhsmtst.qm delete mode 100644 examples/qutest/qhsmtst/test/Makefile delete mode 100644 examples/qutest/qhsmtst/test/make_nucleo-l053r8 delete mode 100644 examples/qutest/qhsmtst/test/make_tm4c123 delete mode 100644 examples/qutest/qhsmtst/test/test_qhsm-funct.py delete mode 100644 examples/qutest/qhsmtst/test/test_qhsm-struct.py delete mode 100644 examples/qutest/qhsmtst/test/test_qhsm.cpp delete mode 100644 examples/qutest/qmsmtst/src/qmsmtst.cpp delete mode 100644 examples/qutest/qmsmtst/src/qmsmtst.hpp delete mode 100644 examples/qutest/qmsmtst/src/qmsmtst.qm delete mode 100644 examples/qutest/qmsmtst/test/Makefile delete mode 100644 examples/qutest/qmsmtst/test/make_nucleo-l053r8 delete mode 100644 examples/qutest/qmsmtst/test/make_tm4c123 delete mode 100644 examples/qutest/qmsmtst/test/test_qmsm-funct.py delete mode 100644 examples/qutest/qmsmtst/test/test_qmsm-struct.py delete mode 100644 examples/qutest/qmsmtst/test/test_qmsm.cpp delete mode 100644 examples/qutest/self_test/src/README.txt delete mode 100644 examples/qutest/self_test/test/Makefile delete mode 100644 examples/qutest/self_test/test/make_efm32 delete mode 100644 examples/qutest/self_test/test/make_nucleo-l053r8 delete mode 100644 examples/qutest/self_test/test/make_posix delete mode 100644 examples/qutest/self_test/test/make_tm4c123 delete mode 100644 examples/qutest/self_test/test/test_assert.py delete mode 100644 examples/qutest/self_test/test/test_command.py delete mode 100644 examples/qutest/self_test/test/test_fp.py delete mode 100644 examples/qutest/self_test/test/test_include.pyi delete mode 100644 examples/qutest/self_test/test/test_last-rec.py delete mode 100644 examples/qutest/self_test/test/test_mem-str.py delete mode 100644 examples/qutest/self_test/test/test_peek-poke.py delete mode 100644 examples/qutest/self_test/test/test_probe.py delete mode 100644 examples/qutest/self_test/test/test_qutest.cpp delete mode 100644 examples/qutest/start_seq/gizmo.qm delete mode 100644 examples/qutest/start_seq/src/bsp.cpp delete mode 100644 examples/qutest/start_seq/src/bsp.hpp delete mode 100644 examples/qutest/start_seq/src/gizmo.cpp delete mode 100644 examples/qutest/start_seq/src/gizmo.hpp delete mode 100644 examples/qutest/start_seq/test/Makefile delete mode 100644 examples/qutest/start_seq/test/test_fixture.cpp delete mode 100644 examples/qutest/start_seq/test/test_start_seq.py delete mode 100644 examples/qwin-gui/README.md delete mode 100644 examples/qwin-gui/dpp-gui/Res/BTN_DWN.bmp delete mode 100644 examples/qwin-gui/dpp-gui/Res/BTN_UP.bmp delete mode 100644 examples/qwin-gui/dpp-gui/Res/eating.bmp delete mode 100644 examples/qwin-gui/dpp-gui/Res/hungry.bmp delete mode 100644 examples/qwin-gui/dpp-gui/Res/qp.ico delete mode 100644 examples/qwin-gui/dpp-gui/Res/thinking.bmp delete mode 100644 examples/qwin-gui/dpp-gui/Resource.rc delete mode 100644 examples/qwin-gui/dpp-gui/bsp.cpp delete mode 100644 examples/qwin-gui/dpp-gui/bsp.hpp delete mode 100644 examples/qwin-gui/dpp-gui/dpp-gui.sln delete mode 100644 examples/qwin-gui/dpp-gui/dpp-gui.vcxproj delete mode 100644 examples/qwin-gui/dpp-gui/dpp-gui.vcxproj.filters delete mode 100644 examples/qwin-gui/dpp-gui/dpp.hpp delete mode 100644 examples/qwin-gui/dpp-gui/dpp.qm delete mode 100644 examples/qwin-gui/dpp-gui/main.cpp delete mode 100644 examples/qwin-gui/dpp-gui/philo.cpp delete mode 100644 examples/qwin-gui/dpp-gui/resource.h delete mode 100644 examples/qwin-gui/dpp-gui/table.cpp delete mode 100644 examples/qwin-gui/game-gui/Res/BOARD.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/BTN_DWN.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/BTN_UP.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/LCD.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/LED_OFF.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/LED_ON.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/qp.ico delete mode 100644 examples/qwin-gui/game-gui/Res/seg.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg0.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg1.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg2.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg3.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg4.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg5.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg6.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg7.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg8.bmp delete mode 100644 examples/qwin-gui/game-gui/Res/seg9.bmp delete mode 100644 examples/qwin-gui/game-gui/Resource.rc delete mode 100644 examples/qwin-gui/game-gui/bsp.cpp delete mode 100644 examples/qwin-gui/game-gui/bsp.hpp delete mode 100644 examples/qwin-gui/game-gui/game-gui.sln delete mode 100644 examples/qwin-gui/game-gui/game-gui.vcxproj delete mode 100644 examples/qwin-gui/game-gui/game-gui.vcxproj.filters delete mode 100644 examples/qwin-gui/game-gui/game.hpp delete mode 100644 examples/qwin-gui/game-gui/game.qm delete mode 100644 examples/qwin-gui/game-gui/main.cpp delete mode 100644 examples/qwin-gui/game-gui/make.bat delete mode 100644 examples/qwin-gui/game-gui/mine1.cpp delete mode 100644 examples/qwin-gui/game-gui/mine2.cpp delete mode 100644 examples/qwin-gui/game-gui/missile.cpp delete mode 100644 examples/qwin-gui/game-gui/resource.h delete mode 100644 examples/qwin-gui/game-gui/ship.cpp delete mode 100644 examples/qwin-gui/game-gui/tunnel.cpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/main.cpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/philo.cpp delete mode 100644 examples/threadx/arm-cm/dpp_ek-tm4c123gxl/table.cpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.cpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.hpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.hpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.qm delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewd delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.eww delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.icf delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/main.cpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/philo.cpp delete mode 100644 examples/threadx/arm-cm/dpp_stm32f429-discovery/table.cpp delete mode 100644 examples/uc-os2/arm-cm/README.txt delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/README.txt delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/app_cfg.h delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/main.cpp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/os_cfg.h delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.cpp delete mode 100644 examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.cpp delete mode 100644 examples/zephyr/blinky/CMakeLists.txt delete mode 100644 examples/zephyr/blinky/README.md delete mode 100644 examples/zephyr/blinky/prj.conf delete mode 100644 examples/zephyr/blinky/src/blinky.cpp delete mode 100644 examples/zephyr/blinky/src/blinky.hpp delete mode 100644 examples/zephyr/blinky/src/bsp.cpp delete mode 100644 examples/zephyr/blinky/src/bsp.hpp delete mode 100644 examples/zephyr/blinky/src/main.cpp delete mode 100644 examples/zephyr/blinky/src/qp_config.hpp delete mode 100644 examples/zephyr/dpp/CMakeLists.txt delete mode 100644 examples/zephyr/dpp/README.md delete mode 100644 examples/zephyr/dpp/prj.conf delete mode 100644 examples/zephyr/dpp/src/bsp.cpp delete mode 100644 examples/zephyr/dpp/src/bsp.hpp delete mode 100644 examples/zephyr/dpp/src/dpp.hpp delete mode 100644 examples/zephyr/dpp/src/dpp.qm delete mode 100644 examples/zephyr/dpp/src/main.cpp delete mode 100644 examples/zephyr/dpp/src/philo.cpp delete mode 100644 examples/zephyr/dpp/src/qp_config.hpp delete mode 100644 examples/zephyr/dpp/src/table.cpp delete mode 100644 qpcpp.xml diff --git a/.gitmodules b/.gitmodules index 8c45f353d..c7d2d0150 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "3rd_party"] path = 3rd_party url = https://github.com/QuantumLeaps/3rd_party.git +[submodule "examples"] + path = examples + url = https://github.com/QuantumLeaps/qpcpp-examples diff --git a/3rd_party b/3rd_party index 2b7bb752b..025100adc 160000 --- a/3rd_party +++ b/3rd_party @@ -1 +1 @@ -Subproject commit 2b7bb752b7f137dc12138e8461c65994c899e831 +Subproject commit 025100adc4853702cd6ce6fa733b206c6a70ee8a diff --git a/examples b/examples new file mode 160000 index 000000000..9b8141914 --- /dev/null +++ b/examples @@ -0,0 +1 @@ +Subproject commit 9b8141914cce0d7320b1407c0c4c2448f046c271 diff --git a/examples/arm-cm/README.md b/examples/arm-cm/README.md deleted file mode 100644 index cfb91ccde..000000000 --- a/examples/arm-cm/README.md +++ /dev/null @@ -1,146 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# About QP Examples for ARM Cortex-M (arm-cm) -This directory provides QP examples for ARM Cortex-M based MCUs. - -These examples are intended to be used "as-is", or [adapted](#adapting-the-examples) for any ARM Cortex-M MCU that is not directly supported. - -

- -

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

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

diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/README.md b/examples/arm-cm/blinky_ek-tm4c123gxl/README.md deleted file mode 100644 index b8dd279b8..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/README.md +++ /dev/null @@ -1,81 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# Blinky on EK-TM4C123GXL -This example implements the simple [Blinky application](https://www.state-machine.com/qpcpp/tut_blinky.html) on the EK-TM4C123GLX board (ARM Cortex-M4F). The example blinks the LED -on the EK-TM4C123GXL board at 1Hz (0.5 seconds on, 0.5 seconds off). - -

-
-EK-TM4C123GXL (TivaC LaunchPad) -

- -## Features Demonstrated -- cooperative QV kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive run-to-completion QK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain - -## Build Configurations -- Debug -- Release -- Spy - NOT supported for the simple Blinky example - -# Code Organization -``` -examples\arm-cm\blinky_ek-tm4c123gxl -| -+---qk // preemptive QK kernel -| +---gnu // GNU-ARM toolchain -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | blinky-qk.uvprojx // uVision project -| \---iar // IAR EWARM -| blinky-qk.eww // IAR EW-ARM workspace -| -\---qv // cooperative QK kernel -| +---gnu // GNU-ARM toolchain -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | blinky-qv.uvprojx // uVision project -| \---iar // IAR EWARM -| blinky-qv.eww // IAR EW-ARM workspace -``` - -# Building the example - -### GNU/ARM -- open terminal window -- change to the desired directory (either `examples\arm-cm\blinky_ek-tm4c123gxl\qk\gnu` -or `examples\arm-cm\blinky_ek-tm4c123gxl\qv\gnu`) -- to build the default Debug configuration, type: - -``` -make -``` - -> **NOTE** -The `make` utility for Windows is provided in the QTools collection for Windows. - -- to build the Release configuration, type: - -``` -make CONF=rel -``` - - -### ARM/KEIL MDK -- Open the provided KEIL uVision project (either `blinky-qk.uvprojx` or `blinky-qv.uvprojx`) -in Keil uVision IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Target" drop-down menu. - - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `blinky-qk.eww` or `blinky-qv.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.cpp b/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.cpp deleted file mode 100644 index 59d24191e..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.cpp +++ /dev/null @@ -1,123 +0,0 @@ -//============================================================================ -// QP/C++ Real-Time Embedded Framework (RTEF) -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -//! @date Last updated on: 2022-08-25 -//! @version Last updated Zephyr 3.1.99 and @ref qpcpp_7_1_0 -//! -//! @file -//! @brief Blinky example -//! -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -// unnamed namespace for local definitions with internal linkage -namespace { - -//Q_DEFINE_THIS_FILE - -} // unnamed namespace - -namespace APP { - -//............................................................................ -class Blinky : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - Blinky(); - static Blinky inst; - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; - -// local objects -------------------------------------------------------------- -Blinky Blinky::inst; - -// global objects ------------------------------------------------------------ -QP::QActive * const AO_Blinky = &Blinky::inst; // opaque pointer - -//............................................................................ -Blinky::Blinky() - : QP::QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{ - // empty -} - -// HSM definition ------------------------------------------------------------ -Q_STATE_DEF(Blinky, initial) { - (void)e; // unused parameter - - // arm the time event to expire in half a second and every half second - m_timeEvt.armX(BSP::TICKS_PER_SEC/2U, BSP::TICKS_PER_SEC/2U); - return tran(&off); -} -//............................................................................ -Q_STATE_DEF(Blinky, off) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOff(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&on); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} -//............................................................................ -Q_STATE_DEF(Blinky, on) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOn(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&off); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} - -} // namespace APP - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.hpp b/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.hpp deleted file mode 100644 index 205c41ed1..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/blinky.hpp +++ /dev/null @@ -1,53 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ - -#ifndef BLINKY_HPP_ -#define BLINKY_HPP_ - -namespace APP { - -enum AppSignals : QP::QSignal { - DUMMY_SIG = QP::Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -// opaque pointer to the Blinky AO -extern QP::QActive * const AO_Blinky; - -} // namespace APP - -#endif // BLINKY_HPP_ diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/bsp.hpp b/examples/arm-cm/blinky_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index b9a8a7e1b..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void terminate(std::int16_t const result); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/ek-tm4c123gxl.jpg b/examples/arm-cm/blinky_ek-tm4c123gxl/ek-tm4c123gxl.jpg deleted file mode 100644 index 5ed6188cdcb1be9d3aa9ac5519acc6cd2dbe2d35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50478 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 CaTv4! diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/main.cpp b/examples/arm-cm/blinky_ek-tm4c123gxl/main.cpp deleted file mode 100644 index b30685b92..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/README.txt deleted file mode 100644 index 7cc9a7f3d..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/README.txt +++ /dev/null @@ -1,61 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.sct b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.sct deleted file mode 100644 index 458d5506e..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvoptx b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvoptx deleted file mode 100644 index a419b9d48..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvoptx +++ /dev/null @@ -1,1004 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - blinky-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - blinky-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - 0 - 0 - 686 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - blinky-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 686 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\blinky.cpp - blinky.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\blinky.hpp - blinky.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 6 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 8 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvprojx b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvprojx deleted file mode 100644 index 935af2627..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/armclang/blinky-qk.uvprojx +++ /dev/null @@ -1,1792 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - blinky-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - blinky-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\blinky-qk.bin .\dbg\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - blinky-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\blinky-qk.bin .\rel\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - blinky-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\blinky-qk.bin .\spy\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/bsp.cpp b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/bsp.cpp deleted file mode 100644 index d39a74f79..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/bsp.cpp +++ /dev/null @@ -1,252 +0,0 @@ -//============================================================================ -// Blinky example, EK-TM4C123GXL board, QK kernel -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Blinky Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -namespace { // unnamed local namespace - -//Q_DEFINE_THIS_FILE - -} // unnamed local namespace - -// Local-scope defines ------------------------------------------------------- -#define LED_RED (1U << 1U) -#define LED_GREEN (1U << 3U) -#define LED_BLUE (1U << 2U) - -#define BTN_SW1 (1U << 4U) -#define BTN_SW2 (1U << 0U) - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events at rate 0 - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[20]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *blinkyQueueSto[10]; - APP::AO_Blinky->start( - 1U, // QP prio. of the AO - blinkyQueueSto, // event queue storage - Q_DIM(blinkyQueueSto), // queue length [events] - nullptr, 0U, // no stack storage - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // toggle the User LED on and then off, see NOTE2 - QF_INT_DISABLE(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_INT_ENABLE(); - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - __WFI(); // Wait-For-Interrupt -#endif -} - - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. Please note -// that the LED is toggled with interrupts locked, so no interrupt execution -// time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/Makefile b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/Makefile deleted file mode 100644 index 782edff70..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/Makefile +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QK kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/Qtools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := blinky-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - blinky.cpp \ - bsp.cpp \ - main.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/blinky-qk.ld b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/blinky-qk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/blinky-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/flash.bat b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/README.txt deleted file mode 100644 index b4203fb7b..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd deleted file mode 100644 index e0a637de4..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp deleted file mode 100644 index c8a827584..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.ewp +++ /dev/null @@ -1,3347 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww deleted file mode 100644 index c99248567..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qk.ewp - - - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf b/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qk/iar/blinky-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/README.txt deleted file mode 100644 index 7cc9a7f3d..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/README.txt +++ /dev/null @@ -1,61 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.sct b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.sct deleted file mode 100644 index 458d5506e..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvoptx b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvoptx deleted file mode 100644 index 73f617990..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvoptx +++ /dev/null @@ -1,976 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - blinky-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`F -X0ÂiôîA - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - blinky-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - blinky-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\blinky.cpp - blinky.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\blinky.hpp - blinky.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 6 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 8 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvprojx b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvprojx deleted file mode 100644 index 6f82168af..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/armclang/blinky-qv.uvprojx +++ /dev/null @@ -1,1792 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - blinky-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - blinky-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\blinky-qv.bin .\dbg\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-rel - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - blinky-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\blinky-qv.bin .\rel\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-spy - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - blinky-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\blinky-qv.bin .\spy\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/bsp.cpp b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/bsp.cpp deleted file mode 100644 index 5851393f3..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/bsp.cpp +++ /dev/null @@ -1,252 +0,0 @@ -//============================================================================ -// Blinky example, EK-TM4C123GXL board, QV kernel -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Blinky Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -namespace { // unnamed local namespace - -//Q_DEFINE_THIS_FILE - -} // unnamed local namespace - -// Local-scope defines ------------------------------------------------------- -#define LED_RED (1U << 1U) -#define LED_GREEN (1U << 3U) -#define LED_BLUE (1U << 2U) - -#define BTN_SW1 (1U << 4U) -#define BTN_SW2 (1U << 0U) - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -//............................................................................ -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events at rate 0 -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[200]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *blinkyQueueSto[10]; - APP::AO_Blinky->start( - 1U, // QP prio. of the AO - blinkyQueueSto, // event queue storage - Q_DIM(blinkyQueueSto), // queue length [events] - nullptr, 0U, // no stack storage - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI); - // ... - - // enable IRQs... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CATION: called with interrupts DISABLED, NOTE0 - - // toggle the User LED on and then off, see NOTE2 - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV::onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. Please note -// that the LED is toggled with interrupts locked, so no interrupt execution -// time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/Makefile b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/Makefile deleted file mode 100644 index 03ce5132c..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/Makefile +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QV kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/Qtools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := blinky-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - blinky.cpp \ - bsp.cpp \ - main.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O3 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O3 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/blinky-qv.ld b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/blinky-qv.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/blinky-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/flash.bat b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/README.txt b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/README.txt deleted file mode 100644 index b4203fb7b..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd deleted file mode 100644 index f32068d93..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp deleted file mode 100644 index 83deee62d..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.ewp +++ /dev/null @@ -1,3341 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww deleted file mode 100644 index fa7c77317..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qv.ewp - - - - - diff --git a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf b/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/blinky_ek-tm4c123gxl/qv/iar/blinky-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/blinky_nucleo-c031c6/README.md b/examples/arm-cm/blinky_nucleo-c031c6/README.md deleted file mode 100644 index ba383678f..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/README.md +++ /dev/null @@ -1,80 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# Blinky on NUCLEO-C031C6 -This example demonstrates the [Blinky application](https://www.state-machine.com/qpcpp/tut_blinky.html) on the STM32 NUCLEO-C031C6 board (ARM Cortex-M0+). - -

-
-STM32 NUCLEO-C031C6 -

- -## Features Demonstrated -- cooperative QV kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive run-to-completion QK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain - -## Build Configurations -- Debug -- Release -- Spy - NOT supported for the simple Blinky example - -# Code Organization -``` -examples\arm-cm\blinky_nucleo-c031c6 -| -+---qk // preemptive QK kernel -| +---gnu // GNU-ARM toolchain -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | blinky-qk.uvprojx // uVision project -| \---iar // IAR EWARM -| blinky-qk.eww // IAR EW-ARM workspace -| -\---qv // cooperative QK kernel -| +---gnu // GNU-ARM toolchain -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | blinky-qv.uvprojx // uVision project -| \---iar // IAR EWARM -| blinky-qv.eww // IAR EW-ARM workspace -``` - -# Building the example - -### GNU/ARM -- open terminal window -- change to the desired directory (either `examples\arm-cm\blinky_nucleo-c031c6\qk\gnu` -or `examples\arm-cm\blinky_nucleo-c031c6\qv\gnu`) -- to build the default Debug configuration, type: - -``` -make -``` - -> **NOTE** -The `make` utility for Windows is provided in the QTools collection for Windows. - -- to build the Release configuration, type: - -``` -make CONF=rel -``` - - -### ARM/KEIL MDK -- Open the provided KEIL uVision project (either `blinky-qk.uvprojx` or `blinky-qv.uvprojx`) -in Keil uVision IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Target" drop-down menu. - - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `blinky-qk.eww` or `blinky-qv.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/blinky.cpp b/examples/arm-cm/blinky_nucleo-c031c6/blinky.cpp deleted file mode 100644 index 59d24191e..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/blinky.cpp +++ /dev/null @@ -1,123 +0,0 @@ -//============================================================================ -// QP/C++ Real-Time Embedded Framework (RTEF) -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -//! @date Last updated on: 2022-08-25 -//! @version Last updated Zephyr 3.1.99 and @ref qpcpp_7_1_0 -//! -//! @file -//! @brief Blinky example -//! -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -// unnamed namespace for local definitions with internal linkage -namespace { - -//Q_DEFINE_THIS_FILE - -} // unnamed namespace - -namespace APP { - -//............................................................................ -class Blinky : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - Blinky(); - static Blinky inst; - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; - -// local objects -------------------------------------------------------------- -Blinky Blinky::inst; - -// global objects ------------------------------------------------------------ -QP::QActive * const AO_Blinky = &Blinky::inst; // opaque pointer - -//............................................................................ -Blinky::Blinky() - : QP::QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{ - // empty -} - -// HSM definition ------------------------------------------------------------ -Q_STATE_DEF(Blinky, initial) { - (void)e; // unused parameter - - // arm the time event to expire in half a second and every half second - m_timeEvt.armX(BSP::TICKS_PER_SEC/2U, BSP::TICKS_PER_SEC/2U); - return tran(&off); -} -//............................................................................ -Q_STATE_DEF(Blinky, off) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOff(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&on); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} -//............................................................................ -Q_STATE_DEF(Blinky, on) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOn(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&off); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} - -} // namespace APP - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/blinky.hpp b/examples/arm-cm/blinky_nucleo-c031c6/blinky.hpp deleted file mode 100644 index 205c41ed1..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/blinky.hpp +++ /dev/null @@ -1,53 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ - -#ifndef BLINKY_HPP_ -#define BLINKY_HPP_ - -namespace APP { - -enum AppSignals : QP::QSignal { - DUMMY_SIG = QP::Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -// opaque pointer to the Blinky AO -extern QP::QActive * const AO_Blinky; - -} // namespace APP - -#endif // BLINKY_HPP_ diff --git a/examples/arm-cm/blinky_nucleo-c031c6/bsp.hpp b/examples/arm-cm/blinky_nucleo-c031c6/bsp.hpp deleted file mode 100644 index b9a8a7e1b..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/bsp.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void terminate(std::int16_t const result); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/main.cpp b/examples/arm-cm/blinky_nucleo-c031c6/main.cpp deleted file mode 100644 index b30685b92..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.sct b/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.sct deleted file mode 100644 index ba687922e..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; STACK area - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvoptx b/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvoptx deleted file mode 100644 index a4af70264..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvoptx +++ /dev/null @@ -1,1024 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - blinky-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - blinky-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - blinky-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\blinky.hpp - blinky.hpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - .\blinky-qk.sct - blinky-qk.sct - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\blinky.cpp - blinky.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 10 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 24 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - 4 - 26 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvprojx b/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvprojx deleted file mode 100644 index de7331bf9..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/armclang/blinky-qk.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - blinky-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - blinky-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\blinky-qk.bin .\dbg\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qk.sct - 5 - .\blinky-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - blinky-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\blinky-qk.bin .\rel\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qk.sct - 5 - .\blinky-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - blinky-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\blinky-qk.bin .\spy\blinky-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qk.sct - 5 - .\blinky-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/bsp.cpp b/examples/arm-cm/blinky_nucleo-c031c6/qk/bsp.cpp deleted file mode 100644 index 1638e11b1..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/bsp.cpp +++ /dev/null @@ -1,248 +0,0 @@ -//============================================================================ -// Blinky example, NUCLEO-C031C6 board, QK kernel -// Last updated for version 7.3.0 -// Last updated on 2023-08-28 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Blinky Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -//Q_DEFINE_THIS_FILE - -} // unnamed local namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events at rate 0 - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[20]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *blinkyQueueSto[10]; - APP::AO_Blinky->start( - 1U, // QP prio. of the AO - blinkyQueueSto, // event queue storage - Q_DIM(blinkyQueueSto), // queue length [events] - nullptr, 0U, // no stack storage - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invocations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/Makefile b/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/Makefile deleted file mode 100644 index ae9ea72f9..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/Makefile +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-08-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := blinky-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - blinky.cpp \ - bsp.cpp \ - main.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DSTM32C031xx \ - -DQK_USE_IRQ_NUM=31 \ - -DQK_USE_IRQ_HANDLER=Reserved31_IRQHandler - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/blinky-qk.ld b/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/blinky-qk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/gnu/blinky-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewd b/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewp b/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewp deleted file mode 100644 index 205f9b309..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.eww b/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.eww deleted file mode 100644 index c99248567..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qk.ewp - - - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.icf b/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qk/iar/blinky-qk.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.sct b/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.sct deleted file mode 100644 index ba687922e..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; STACK area - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvoptx b/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvoptx deleted file mode 100644 index b37bde5db..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvoptx +++ /dev/null @@ -1,1024 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - blinky-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - blinky-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - blinky-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\blinky.hpp - blinky.hpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - .\blinky-qv.sct - blinky-qv.sct - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\blinky.cpp - blinky.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 10 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 24 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 26 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvprojx b/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvprojx deleted file mode 100644 index 72f4f3a01..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/armclang/blinky-qv.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - blinky-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - blinky-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\blinky-qv.bin .\dbg\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qv.sct - 5 - .\blinky-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - blinky-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\blinky-qv.bin .\rel\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qv.sct - 5 - .\blinky-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - blinky-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - blinky-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\blinky-qv.bin .\spy\blinky-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\blinky-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - blinky.hpp - 5 - ..\..\blinky.hpp - - - blinky-qv.sct - 5 - .\blinky-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - blinky.cpp - 8 - ..\..\blinky.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/bsp.cpp b/examples/arm-cm/blinky_nucleo-c031c6/qv/bsp.cpp deleted file mode 100644 index 2126676f7..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/bsp.cpp +++ /dev/null @@ -1,255 +0,0 @@ -//============================================================================ -// Blinky example, NUCLEO-C031C6 board, QV kernel -// Last updated for version 7.3.0 -// Last updated on 2023-08-28 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Blinky Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -//Q_DEFINE_THIS_FILE - -} // unnamed local namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events at rate 0 - - QV_ARM_ERRATUM_838869(); -} - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[20]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *blinkyQueueSto[10]; - APP::AO_Blinky->start( - 1U, // QP prio. of the AO - blinkyQueueSto, // event queue storage - Q_DIM(blinkyQueueSto), // queue length [events] - nullptr, 0U, // no stack storage - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // QV_CPU_SLEEP() contains the WFI instruction, which stops the CPU - // clock, which unfortunately disables the JTAG port, so the ST-Link - // debugger can no longer connect to the board. For that reason, the call - // to QV_CPU_SLEEP() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts - QF_INT_ENABLE(); // for now, just enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/Makefile b/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/Makefile deleted file mode 100644 index 0e0a3ebe1..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/Makefile +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-05-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := blinky-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - blinky.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/blinky-qv.ld b/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/blinky-qv.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/gnu/blinky-qv.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewd b/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewp b/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewp deleted file mode 100644 index dc600a0b6..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.eww b/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.eww deleted file mode 100644 index fa7c77317..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qv.ewp - - - - - diff --git a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.icf b/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/blinky_nucleo-c031c6/qv/iar/blinky-qv.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/blinky_nucleo-c031c6/stm32-nucleo-c031c6.jpg b/examples/arm-cm/blinky_nucleo-c031c6/stm32-nucleo-c031c6.jpg deleted file mode 100644 index 6647e2d493863c9d4268596be8bc982a1ca49ccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43475 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 aZwdcScKknmYz}5d{lD5b|344^F8mKp|M*b= diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/README.md b/examples/arm-cm/dpp_efm32-slstk3401a/README.md deleted file mode 100644 index 2810293ea..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 EFM32-SLSTK3401A](../../../doxygen/images/bd_EFM32-SLSTK3401A.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_efm32-slstk3401a.html diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/bsp.hpp b/examples/arm-cm/dpp_efm32-slstk3401a/bsp.hpp deleted file mode 100644 index 2479d54c1..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/bsp.hpp +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void wait4SW1(); -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/dpp.hpp b/examples/arm-cm/dpp_efm32-slstk3401a/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm b/examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/main.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/philo.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/README.txt deleted file mode 100644 index 17af30f26..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.sct deleted file mode 100644 index 794d15cc6..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00020000 { ; load region size_region - ER_IROM1 0x00000000 0x00020000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 2ba0f3943..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1074 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2939,415,3416,730,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 83 - 1 -
3412
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qk\../bsp.cpp\83 -
- - 1 - 0 - 243 - 1 -
13720
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\table.cpp - - \\\../../table.cpp\243 -
- - 2 - 0 - 120 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
-
- - - 0 - 1 - QF::readySet_ - - - - - 1 - 0 - 0x3D28 - 1 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGUARM - / - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - / - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - efm32pg1b - 1 - 0 - 0 - 0 - - 2 - 5 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - startup_efm32pg1b.s - 0 - 0 - - - 2 - 6 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - system_efm32pg1b.c - 0 - 0 - - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - efm32pg1b200f256gm48.h - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - em_cmu.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - em_emu.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - em_gpio.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - em_system.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - em_usart.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 4eba12f88..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1826 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.3.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.3.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.3.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/bsp.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/qk/bsp.cpp deleted file mode 100644 index 5c2ad7b3f..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/bsp.cpp +++ /dev/null @@ -1,559 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr GPIO_Port_TypeDef LED_PORT {gpioPortF}; -constexpr std::uint32_t LED0_PIN {4U}; -constexpr std::uint32_t LED1_PIN {5U}; - -constexpr GPIO_Port_TypeDef PB_PORT {gpioPortF}; -constexpr std::uint32_t PB0_PIN {6U}; -constexpr std::uint32_t PB1_PIN {7U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((current & (1U << PB0_PIN)) != 0U) { // is PB0 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIO_EVEN_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART0_RX_IRQHandler(void); // prototype -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((l_USART0->STATUS & USART_STATUS_RXDATAV) != 0U) { - std::uint8_t b = static_cast(l_USART0->RXDATA); - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -} -//............................................................................ -void ledOff() { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE3 -// QF_INT_DISABLE(); -// GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -// GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -// QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_USART0->TXDATA = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(l_USART0, &init); - - // enable pins at correct UART/USART location. - l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - l_USART0->ROUTELOC0 = (l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - // Finally enable the UART - USART_Enable(l_USART0, usartEnable); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/Makefile b/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/Makefile deleted file mode 100644 index 1af21e40e..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/Makefile +++ /dev/null @@ -1,316 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/README.txt deleted file mode 100644 index b4d4451a1..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project -is located in the "3rd_party" folder in the following location: - -qpc\3rd_party\efm32pg1b\gnu\startup_efm32pg1b.c - -The file startup_efm32pg1b.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/dpp-qk.ld deleted file mode 100644 index 2132b696a..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EFM32-SLSTK3401A, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Pearl Gecko EFM32PG1B200F256GM48 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/flash.bat b/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/flash.bat deleted file mode 100644 index 23215d0ba..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/gnu/flash.bat +++ /dev/null @@ -1,49 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EFM32-SLSTK3401A board -:: -:: NOTE: requires the J-Link commander (JLink.exe) from SEGGER, see: -:: https://www.segger.com/j-link-commander.html -:: -setlocal - -@echo off -@echo Load a given binary file to the flash of EFM32-SLSTK3401A -@echo usage: flash bin-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: JLink utility on your machine -:: -if [%JLINK%] EQU [] set JLINK=%QTOOLS%\..\JLink -if not exist "%JLINK%\JLink.exe" ( - @echo The JLink tool not found. Please adjust flash.bat - @goto end -) - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -:: generate the Jlink command file depending on the first parameter %1 -@echo si 1 >flash.jlink -@echo speed 4000 >>flash.jlink -@echo r >>flash.jlink -@echo h >>flash.jlink -@echo loadbin %1, 0 >>flash.jlink -@echo exit >>flash.jlink - -@echo on -%JLINK%\JLink.exe -device EFM32PG1B200F256GM48 flash.jlink -@echo off - -@del flash.jlink - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd deleted file mode 100644 index 801230fb9..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp deleted file mode 100644 index 829cd8e2d..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3358 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qp_config.hpp b/examples/arm-cm/dpp_efm32-slstk3401a/qp_config.hpp deleted file mode 100644 index e79c27399..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qp_config.hpp +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-07 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// use event constructors for dynamic events -#define QEVT_DYN_CTOR - -// for QK kernel: -// use the FPUEH_IRQHandler() with IRQ number 33 -// for the QXK return-from-preemption handler -#define QK_USE_IRQ_HANDLER FPUEH_IRQHandler -#define QK_USE_IRQ_NUM 33 - -// for QXK kernel: -// use the FPUEH_IRQHandler() with IRQ number 33 -// for the QXK return-from-preemption handler -#define QXK_USE_IRQ_HANDLER FPUEH_IRQHandler -#define QXK_USE_IRQ_NUM 33 - -#ifdef Q_SPY -// for the Spy build configuration, enable the context-switch callback -#define QF_ON_CONTEXT_SW -#endif - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/README.txt deleted file mode 100644 index 17af30f26..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.sct deleted file mode 100644 index 794d15cc6..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00020000 { ; load region size_region - ER_IROM1 0x00000000 0x00020000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 028fcd9f3..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1047 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 356 - 1 -
2170
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qv\../bsp.cpp\356 -
-
- - - 0 - 1 - QActive::registry_ - - - 1 - 1 - QActive::maxPubSignal_ - - - 2 - 1 - QV::priv_ - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGUARM - / - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - efm32pg1b - 1 - 0 - 0 - 0 - - 2 - 5 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - startup_efm32pg1b.s - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - efm32pg1b200f256gm48.h - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - em_gpio.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - system_efm32pg1b.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - em_system.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - em_emu.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - em_cmu.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - em_usart.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 10e4d79ff..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG,EFM32PG1B200F256GM48 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG,EFM32PG1B200F256GM48 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG,EFM32PG1B200F256GM48 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/bsp.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/qv/bsp.cpp deleted file mode 100644 index 9212cbe91..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/bsp.cpp +++ /dev/null @@ -1,555 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr GPIO_Port_TypeDef LED_PORT {gpioPortF}; -constexpr std::uint32_t LED0_PIN {4U}; -constexpr std::uint32_t LED1_PIN {5U}; - -constexpr GPIO_Port_TypeDef PB_PORT {gpioPortF}; -constexpr std::uint32_t PB0_PIN {6U}; -constexpr std::uint32_t PB1_PIN {7U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((current & (1U << PB0_PIN)) != 0U) { // is PB0 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIO_EVEN_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART0_RX_IRQHandler(void); // prototype -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((l_USART0->STATUS & USART_STATUS_RXDATAV) != 0U) { - std::uint8_t b = static_cast(l_USART0->RXDATA); - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: no need to protect shared 'l_rndSeed' in the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -} -//............................................................................ -void ledOff() { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - // toggle the User LED on and then off, see NOTE3 -// GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -// GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - -#ifdef Q_SPY - // intgerrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_USART0->TXDATA = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(l_USART0, &init); - - // enable pins at correct UART/USART location. - l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - l_USART0->ROUTELOC0 = (l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF_onStartup() - - // Finally enable the UART - USART_Enable(l_USART0, usartEnable); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV:onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF/QK services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call the macros QV_ISR_ENTRY/QV_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/Makefile b/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/Makefile deleted file mode 100644 index ef900dc1d..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/Makefile +++ /dev/null @@ -1,316 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QV kernel, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-14 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := \ - - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 \ - -DQF_ON_CONTEXT_SW - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/README.txt deleted file mode 100644 index b4d4451a1..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project -is located in the "3rd_party" folder in the following location: - -qpc\3rd_party\efm32pg1b\gnu\startup_efm32pg1b.c - -The file startup_efm32pg1b.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/dpp-qv.ld deleted file mode 100644 index 12002fb85..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EFM32-SLSTK3401A, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* http://www.state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Pearl Gecko EFM32PG1B200F256GM48 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/flash.bat b/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/flash.bat deleted file mode 100644 index 23215d0ba..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/gnu/flash.bat +++ /dev/null @@ -1,49 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EFM32-SLSTK3401A board -:: -:: NOTE: requires the J-Link commander (JLink.exe) from SEGGER, see: -:: https://www.segger.com/j-link-commander.html -:: -setlocal - -@echo off -@echo Load a given binary file to the flash of EFM32-SLSTK3401A -@echo usage: flash bin-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: JLink utility on your machine -:: -if [%JLINK%] EQU [] set JLINK=%QTOOLS%\..\JLink -if not exist "%JLINK%\JLink.exe" ( - @echo The JLink tool not found. Please adjust flash.bat - @goto end -) - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -:: generate the Jlink command file depending on the first parameter %1 -@echo si 1 >flash.jlink -@echo speed 4000 >>flash.jlink -@echo r >>flash.jlink -@echo h >>flash.jlink -@echo loadbin %1, 0 >>flash.jlink -@echo exit >>flash.jlink - -@echo on -%JLINK%\JLink.exe -device EFM32PG1B200F256GM48 flash.jlink -@echo off - -@del flash.jlink - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd deleted file mode 100644 index cb16c8880..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp deleted file mode 100644 index 2aad0cdcb..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3358 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp.py b/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp.py deleted file mode 100644 index 60c1805b9..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp.py +++ /dev/null @@ -1,103 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp1.py b/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp1.py deleted file mode 100644 index 5958ac265..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qview/dpp1.py +++ /dev/null @@ -1,147 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/eating.gif b/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/hungry.gif b/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/thinking.gif b/examples/arm-cm/dpp_efm32-slstk3401a/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2459,615,2936,930,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - - - - 0 - JL2CM3 - -U440060969 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - - - - - 0 - 0 - 371 - 1 -
3860
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.cpp\371 -
- - 1 - 0 - 144 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - -
-
- - - 0 - 1 - QXK_priv_ - - - 1 - 1 - QActive::registry_[11] - - - - - 1 - 2 - 0x20000100 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - UL2CM3 - -U -O206 -S0 -C0 -P00 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - - - 0 - - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - - - - - 0 - - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - efm32pg1b - 0 - 0 - 0 - 0 - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - startup_efm32pg1b.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - efm32pg1b200f256gm48.h - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - em_gpio.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - system_efm32pg1b.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - em_system.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - em_emu.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - em_cmu.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - em_usart.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 162ad671f..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1898 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - efm32pg1b - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/bsp.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/bsp.cpp deleted file mode 100644 index b5a00df01..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/bsp.cpp +++ /dev/null @@ -1,574 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr GPIO_Port_TypeDef LED_PORT {gpioPortF}; -constexpr std::uint32_t LED0_PIN {4U}; -constexpr std::uint32_t LED1_PIN {5U}; - -constexpr GPIO_Port_TypeDef PB_PORT {gpioPortF}; -constexpr std::uint32_t PB0_PIN {6U}; -constexpr std::uint32_t PB1_PIN {7U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((current & (1U << PB0_PIN)) != 0U) { // is PB0 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIO_EVEN_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART0_RX_IRQHandler(void); // prototype -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((l_USART0->STATUS & USART_STATUS_RXDATAV) != 0U) { - std::uint8_t b = static_cast(l_USART0->RXDATA); - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - Q_UNUSED_PAR(prev); - Q_UNUSED_PAR(next); - - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QXK - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -} -//............................................................................ -void ledOff() { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle the User LED on and then off, see NOTE3 -// QF_INT_DISABLE(); -// GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -// GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -// QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_USART0->TXDATA = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(l_USART0, &init); - - // enable pins at correct UART/USART location. - l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - l_USART0->ROUTELOC0 = (l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF_onStartup() - - // Finally enable the UART - USART_Enable(l_USART0, usartEnable); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QXK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/Makefile b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/Makefile deleted file mode 100644 index 98b1a4bc6..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/Makefile +++ /dev/null @@ -1,325 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-07 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 \ - -DQF_ON_CONTEXT_SW \ - -DQK_USE_IRQ_NUM=33 \ - -DQK_USE_IRQ_HANDLER=FPUEH_IRQHandler - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/README.txt deleted file mode 100644 index 1814d84d5..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/README.txt +++ /dev/null @@ -1,72 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project -is located in the "3rd_party" folder in the following location: - -qpc\3rd_party\efm32pg1b\gnu\startup_efm32pg1b.c - -The file startup_efm32pg1b.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 12002fb85..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EFM32-SLSTK3401A, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* http://www.state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Pearl Gecko EFM32PG1B200F256GM48 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/flash.bat b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/flash.bat deleted file mode 100644 index 23215d0ba..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu/flash.bat +++ /dev/null @@ -1,49 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EFM32-SLSTK3401A board -:: -:: NOTE: requires the J-Link commander (JLink.exe) from SEGGER, see: -:: https://www.segger.com/j-link-commander.html -:: -setlocal - -@echo off -@echo Load a given binary file to the flash of EFM32-SLSTK3401A -@echo usage: flash bin-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: JLink utility on your machine -:: -if [%JLINK%] EQU [] set JLINK=%QTOOLS%\..\JLink -if not exist "%JLINK%\JLink.exe" ( - @echo The JLink tool not found. Please adjust flash.bat - @goto end -) - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -:: generate the Jlink command file depending on the first parameter %1 -@echo si 1 >flash.jlink -@echo speed 4000 >>flash.jlink -@echo r >>flash.jlink -@echo h >>flash.jlink -@echo loadbin %1, 0 >>flash.jlink -@echo exit >>flash.jlink - -@echo on -%JLINK%\JLink.exe -device EFM32PG1B200F256GM48 flash.jlink -@echo off - -@del flash.jlink - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/README.txt b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index f4f024be8..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index aad605126..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3376 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread1.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread2.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/table.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_efm32-slstk3401a/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/README.md b/examples/arm-cm/dpp_ek-tm4c123gxl/README.md deleted file mode 100644 index 30842bae9..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 EFM32-SLSTK3401A](../../../doxygen/images/bd_EK-TM4C123GXL.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_ek-tm4c123gxl.html diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index 82ed115d9..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm b/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/README.txt deleted file mode 100644 index f4869b162..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -About this Example -================== -This directory contains the facilities for "linting" the application with -PC-Lint-Plus. - -To "lint" the application, invoke the batch "lin.bat" without parameters. -Optionally, you can supply the parameter -dQ_SPY to include the QS -instrumentation in the "linting" process. - -The output from the "linting" is saved in the file "lin_out.log". - -*** -NOTE: You need to adjust the symbol PCLP_DIR at the top of the lin.bat -file, to point to the directory where PC-Lint-Plus is installed on your -machine. -*** - - -The PC-Lint-Plus Options File -============================= -The "options.lnt" file specifies the linting options. You might need -to modify this file to suit your needs. - - -**** -NOTE: The purpose of this example is NOT to find problems with the -supporting 3rd-party code, which every non-trivial embedded system needs. -Rather, the purpose of this particular example is to check YOUR application -level code, such as state machines. -**** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/lin.bat b/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/lin.bat deleted file mode 100644 index 4cbefe73c..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/lin.bat +++ /dev/null @@ -1,73 +0,0 @@ -@echo off -:: =========================================================================== -:: Product: QP/C++ build script for PC-Lint-Plus -:: Last Updated for Version: 6.8.0 -:: Date of the Last Update: 2020-01-26 -:: -:: Q u a n t u m L e a P s -:: ------------------------ -:: Modern Embedded Software -:: -:: Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -:: -:: This program is open source software: you can redistribute it and/or -:: modify it under the terms of the GNU General Public License as published -:: by the Free Software Foundation, either version 3 of the License, or -:: (at your option) any later version. -:: -:: Alternatively, this program may be distributed and modified under the -:: terms of Quantum Leaps commercial licenses, which expressly supersede -:: the GNU General Public License and are specifically designed for -:: licensees interested in retaining the proprietary status of their code. -:: -:: This program is distributed in the hope that it will be useful, -:: but WITHOUT ANY WARRANTY; without even the implied warranty of -:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -:: GNU General Public License for more details. -:: -:: You should have received a copy of the GNU General Public License -:: along with this program. If not, see . -:: -:: Contact information: -:: -:: -:: =========================================================================== -@setlocal - -:: usage of lin.bat -@echo Usage: lin [16bit] [-d...] [files...] -@echo examples: -@echo lin ..\table.cpp : use 32bit CPU (default) for linting ..\table.cpp -@echo lin 16bit -dQ_SPY ..\philo.cpp : use 16bit CPU and define Q_SPY for linting ..\philo.cpp -@echo lin ..\philo.cpp ..\table.cpp : use 32bit CPU for linting ..\philo.c and ..\table.cpp -@echo. - -:: NOTE: adjust to for your installation directory of PC-Lint-Plus -@set PCLP=C:\tools\lint-plus\windows\pclp32.exe - -if NOT exist "%PCLP%" ( - @echo The PC-Lint-Plus toolset not found. Please adjust lin.bat - @goto end -) - -:: set the QP/C++ directory -set QPCPP=..\..\..\.. -set QPCPP_LINT=%QPCPP%\ports\lint-plus - -if "%1"=="16bit" ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\16bit options.lnt %2 %3 %4 %5 %6 %7 %8 - @echo 16bit CPU -) else ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\32bit options.lnt %1 %2 %3 %4 %6 %7 %8 - @echo 32bit CPU (default) -) - -:: cleanup -@del *.log - - -:: linting ------------------------------------------------------------------- -%PCLP% -os(lint_out.log) %LINTFLAGS% - -:end -@endlocal diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/options.lnt b/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/options.lnt deleted file mode 100644 index 6093417a3..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/lint-plus/options.lnt +++ /dev/null @@ -1,64 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Product: PC-Lint-Plus options for linting QP/C++ applications -// Last updated for version 6.8.0 -// Last updated on 2020-01-27 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -// general options --unit_check // perform only subset check (suppresses Global Wrapup) --max_threads=1 // suppress message "no '-max_threads=N' option" -//-vf // print names of all source files (for debugging linting) - -// include directories --i.. // application includes --i%QPCPP%\include // QP/C++ public includes --i%QPCPP_LINT% // QP/C++ lint "port" --i%QPCPP_LINT%\qk // QP/C++ lint "port" to QK - -// standards -%QPCPP_LINT%\au-autosar.lnt // AUTOSAR-C++:2014 -%QPCPP_LINT%\au-ds.lnt // Dan Saks recommendations -//-strong(AXJ) // Strong type checking - -// size/alignment options (included from %QPCPP_LINT%\??bit\) -cpu.lnt // for the chosen CPU - -///////////////////////////////////////////////////////////////////////////// -// QP/C++ options for clients -qpcpp.lnt // QP/C++ options - -///////////////////////////////////////////////////////////////////////////// -// additional suppression rules for building this application - -// underlying type for enums is always 'int' -+fei - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/main.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/philo.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/README.txt deleted file mode 100644 index 03fe7046e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/README.txt +++ /dev/null @@ -1,60 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.sct deleted file mode 100644 index fda39c74a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: 2048 assumeed STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 6152c0174..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,994 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index fe11b126e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - QF_ON_CONTEXT_SW - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG,QF_ON_CONTEXT_SW - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY,QF_ON_CONTEXT_SW - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.cpp deleted file mode 100644 index f185a0c7a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/bsp.cpp +++ /dev/null @@ -1,544 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIOPortA_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - // try to get next contiguous block to transmit - std::uint8_t const *block = QS::getBlock(&fifo); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - std::uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -// callback function to execute a user command -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.ccsproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.ccsproject deleted file mode 100644 index e057df002..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.ccsproject +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.cproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.cproject deleted file mode 100644 index c3caf8100..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.cproject +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.project b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.project deleted file mode 100644 index bdf5667f9..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/.project +++ /dev/null @@ -1,100 +0,0 @@ - - - dpp-qk - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QK - 2 - PARENT-5-PROJECT_LOC/src/qk - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/arm-cm/qk/gnu - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/TM4C123GH6PM.h - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qp_config.hpp - 1 - PARENT-2-PROJECT_LOC/qp_config.hpp - - - startup_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/gnu/startup_TM4C123GH6PM.c - - - system_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.c - - - system_TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.h - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - - - CG_TOOL_GPP - $%7BCG_TOOL_ROOT%7D/bin/arm-none-eabi-g++ - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile deleted file mode 100644 index a2761cdd9..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/README.txt deleted file mode 100644 index ab8e99e8f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/README.txt +++ /dev/null @@ -1,79 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - -The CCS Project -=============== -This directory contains also the CCS project which can be imported to the -CCS (Code Composer Studio) IDE based on Eclipse. To import the project, -use the section "General -> Existing Project into Workspace" and select this -directory as the "root directory". For example, the "Select root directory" -might be: C:\qp-dev\qpc\examples\arm-cm\dpp_ek-tm4c123gxl\qxk\gnu - -Once you press "Browse", the project (dpp-qk, dpp-qv, or dpp-qxk) should -become visible. Click on "Select All" and then "Finish". - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/dpp-qk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/README.txt deleted file mode 100644 index a0a244154..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C++ framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C++ stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd deleted file mode 100644 index 143fc5398..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp deleted file mode 100644 index 176a5d37b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3347 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 1 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 1 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp deleted file mode 100644 index 57e38bd99..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp +++ /dev/null @@ -1,271 +0,0 @@ -//============================================================================ -// QP configuration file (QXK on ARM Cortex-M) -// Last updated for version: 7.3.0 -// Last updated on: 2023-10-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- - -// NOTE: Requires command-line macro: QP_CONFIG -// This qp_config.h header file is activated only when the macro -// QP_CONFIG is defined on the command-line to the compiler -// ------------------------------------------- - -// QP API compatibility version (QP_API_VERSION) -// <0=> 0 (Maximum compatibility) -// <580=>580 (QP 5.8.0 or newer) -// <660=>660 (QP 6.6.0 or newer) -// <691=>691 (QP 6.9.1 or newer) -// <700=>700 (QP 7.0.0 or newer) -// <9999=>9999 (Latest only) -// QP API backwards compatibility with the QP/C API version. -// Lower QP_API_VERSION values enable backwards compatibility -// with lower (older) QP API versions. -// For example, QP_API_VERSION==691 will enable the compatibility -// layer with QP version 6.9.1 and newer, but not older than 6.9.1. -// QP_API_VERSION==0 enables the maximum currently supported -// backwards compatibility. Conversely, QP_API_VERSION==9999 means -// that no backwards compatibility layer should be enabled. -// Default: 0 (All supported) -#define QP_API_VERSION 0 - -//.......................................................................... -// QP Functional Safety (FuSa) Subsystem (Q_UNSAFE) -// The QP FuSa Subsystem consists of the following facilities: -// - Software assertions as a recommended technique -// (called Failure Assertion Programming (FAP) in IEC 61508) -// - Software Self-Monitoring (SSM), which encompasses such techniques: -// * Duplicate Inverse Storage for critical variables -// * Memory Markers for critical objects (e.g., events) -// * Hard-limits for all loops -// * Memory Isolation by means of Memory Protection Unit (MPU) - -// Disable QP FuSa in development -// Disable assertions and other self monitoring features -// in development build configurations (NDEBUG undefined). -// VIOLATES functional safety standards. NOT recommended !!! -//#ifndef NDEBUG -//#define Q_UNSAFE -//#endif -// - -// Disable QP FuSa in production release -// Disable assertions and other self monitoring features -// in the release build configurations (NDEBUG defined). -// VIOLATES functional safety standards. NOT recommended !!! -//#ifdef NDEBUG -//#define Q_UNSAFE -//#endif -// - -// - -//.......................................................................... -// QEP Event Processor -// Events and state machines. - -// Event signal size (Q_SIGNAL_SIZE) -// <1U=>1 -// <2U=>2 (default) -// <4U=>4 -// Size of the QEvt signal for QEP/QF [bytes] -// Default: 2 -#define Q_SIGNAL_SIZE 2U - -// - -//.......................................................................... -// QF Framework -// Active Object framework - -// Maximum # Active Objects (QF_MAX_ACTIVE) <1-64> -// Maximum # Active Objects in the system <1..64> -// Default: 32 -#define QF_MAX_ACTIVE 32U - -// Maximum # event pools (QF_MAX_EPOOL) -// <0=>0 no event pools -// <1=>1 <2=>2 <3=>3 (default) <4=>4 <5=>5 -// <6=>6 <7=>7 <8=>8 <9=>9 <10=>10 <11=>11 -// <12=>12 <13=>13 <14=>14 <15=>15 -// Maximum # Event Pools <1..15> -// Default: 3 -#define QF_MAX_EPOOL 3U - -// Maximum # clock tick rates (QF_MAX_TICK_RATE) -// <0=>0 no time events -// <1=>1 (default) <2=>2 <3=>3 <4=>4 <5=>5 -// <6=>6 <7=>7 <8=>8 <9=>9 <10=>10 <11=>11 -// <12=>12 <13=>13 <14=>14 <15=>15 -// Maximum # clock tick rates for time events <1..15> -// Default: 1 -#define QF_MAX_TICK_RATE 1U - -// Dynamic Event Constructor (QEVT_DYN_CTOR) -// Dynamic Event Constructor (RAII) -//#define QEVT_DYN_CTOR -// - -// Active Object stop API (QACTIVE_CAN_STOP) -// Enable Active Object stop API (Not recommended) -//#define QACTIVE_CAN_STOP -// - -// Event size (QF_EVENT_SIZ_SIZE) -// <1U=>1 -// <2U=>2 (default) -// <4U=>4 -// Size of the dynamic events for QF [bytes] -// Default: 2 (64K bytes maximum event size) -#define QF_EVENT_SIZ_SIZE 2U - -// Time event counter size (QF_TIMEEVT_CTR_SIZE) -// <1U=>1 -// <2U=>2 -// <4U=>4 (default) -// Size of the QTimeEvt counter [bytes] -// Default: 4 (2^32 dynamic range) -#define QF_TIMEEVT_CTR_SIZE 4U - -// Event queue counter size (QF_EQUEUE_CTR_SIZE) -// <1U=>1 (default) -// <2U=>2 -// <4U=>4 -// Size of event queue counter [bytes] -// Default: 1 (255 events maximum in a queue) -#define QF_EQUEUE_CTR_SIZE 1U - -// Memory pool counter size (QF_MPOOL_CTR_SIZE) -// <1U=>1 -// <2U=>2 (default) -// <4U=>4 -// Size of memory pool counter [bytes] -// Default: 2 (64K blocks maximum in a pool) -#define QF_MPOOL_CTR_SIZE 2U - -// Memory block size (QF_MPOOL_SIZ_SIZE) -// <1U=>1 -// <2U=>2 (default) -// <4U=>4 -// Size of memory pool block [bytes] -// Default: 2 (64K bytes maximum block size) -#define QF_MPOOL_SIZ_SIZE 2U - -// - -//.......................................................................... -// QS Software Tracing -// Target-resident component of QP/Spy software tracing system -// (tracing instrumentation and command-input). - -// NOTE: Requires command-line macro: Q_SPY -// The QS software tracing instrumenation is activated only when -// the macro Q_SPY is defined on the command-line to the compiler. -// Typically, Q_SPY is defined only in the "spy" build configuration. - -// QS timestamp size (QS_TIME_SIZE) -// <1U=>1 -// <2U=>2 -// <4U=>4 (default) -// Size of the timestamp in QS [bytes] -// Default: 4 (2^32 dynamic range) -#define QS_TIME_SIZE 4U - -// Object pointer size (QS_OBJ_PTR_SIZE) -// <2U=>2 -// <4U=>4 (default) -// <8U=>8 -// Size of object pointer for QS [bytes] -// Default: 4 (4G address space) -#define QS_OBJ_PTR_SIZE 4U - -// Function pointer size (QS_FUN_PTR_SIZE) -// <2U=>2 -// <4U=>4 (default) -// <8U=>8 -// Size of function pointer for QS [bytes] -// Default: 4 (4G address space) -#define QS_FUN_PTR_SIZE 4U - -// QS buffer counter size (QS_CTR_SIZE) -// <1U=>1 -// <2U=>2 (default) -// <4U=>4 -// Size of the counter in the internal QS buffer [bytes] -// Default: 2 (64K bytes in QS buffer) -#define QS_CTR_SIZE 2U - -// - -//.......................................................................... -// QXK Preemptive Dual-Mode Kernel -// Preemptive non-blocking/blocking RTOS kernel. - -// Context switch callback (QF_ON_CONTEXT_SW) - -// Context switch callback WITHOUT QS -// Enable context switch callback QF_onContextSw() -// When Q_SPY is undefined. -//#ifndef Q_SPY -//#define QF_ON_CONTEXT_SW -//#endif -// - -// Context switch callback WITH QS -// Enable context switch callback QF_onContextSw() -// When Q_SPY is defined. -//#ifdef Q_SPY -//#define QF_ON_CONTEXT_SW -//#endif -// - -// - -// MPU memory isolation (QF_MEM_ISOLATE) -// Enable memory isolation (requires MPU) -// NOTE: implies QF_ON_CONTEXT_SW. -//#define QF_MEM_ISOLATE -// - -// Use IRQ handler for QXK return-from-preemption -// Enable this option only if the NMI handler is used in the project. -// If enabled, provide the otherwise unused IRQ number (QXK_USE_IRQ_NUM) -// and the corresponding IRQ handler name (QXK_USE_IRQ_HANDLER) -// in the "Text Editor" mode. -//#define QXK_USE_IRQ_NUM 31 -//#define QXK_USE_IRQ_HANDLER Reserved31_IRQHandler -// - -// - -//------------- <<< end of configuration section >>> ----------------------- - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/README.txt deleted file mode 100644 index 03fe7046e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/README.txt +++ /dev/null @@ -1,60 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.sct deleted file mode 100644 index 458d5506e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 7ee1da438..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,994 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 2f389e38f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.cpp deleted file mode 100644 index fe7c45396..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/bsp.cpp +++ /dev/null @@ -1,537 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - - APP::AO_Table->POST(Q_NEW(QP::QEvt, APP::MAX_PUB_SIG), - &l_GPIOPortA_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: no need to protect shared 'l_rndSeed' in the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - // toggle the User LED on and then off, see NOTE3 - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - -#ifdef Q_SPY - // intgerrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_INT_DISABLE(); - std::uint8_t const *block = QS::getBlock(&fifo); - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -//! callback function to reset the target (to be implemented in the BSP) -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -// callback function to execute a user command -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV:onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF/QK services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.ccsproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.ccsproject deleted file mode 100644 index e057df002..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.ccsproject +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.cproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.cproject deleted file mode 100644 index cee30abac..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.cproject +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.project b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.project deleted file mode 100644 index ad4e29a95..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/.project +++ /dev/null @@ -1,100 +0,0 @@ - - - dpp-qv - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QV - 2 - PARENT-5-PROJECT_LOC/src/qv - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/arm-cm/qv/gnu - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/TM4C123GH6PM.h - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qp_config.hpp - 1 - PARENT-2-PROJECT_LOC/qp_config.hpp - - - startup_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/gnu/startup_TM4C123GH6PM.c - - - system_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.c - - - system_TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.h - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - - - CG_TOOL_GPP - $%7BCG_TOOL_ROOT%7D/bin/arm-none-eabi-g++ - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile deleted file mode 100644 index 8b4533de5..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/README.txt deleted file mode 100644 index ab8e99e8f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/README.txt +++ /dev/null @@ -1,79 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - -The CCS Project -=============== -This directory contains also the CCS project which can be imported to the -CCS (Code Composer Studio) IDE based on Eclipse. To import the project, -use the section "General -> Existing Project into Workspace" and select this -directory as the "root directory". For example, the "Select root directory" -might be: C:\qp-dev\qpc\examples\arm-cm\dpp_ek-tm4c123gxl\qxk\gnu - -Once you press "Browse", the project (dpp-qk, dpp-qv, or dpp-qxk) should -become visible. Click on "Select All" and then "Finish". - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/dpp-qv.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/README.txt deleted file mode 100644 index b4203fb7b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd deleted file mode 100644 index 143fc5398..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp deleted file mode 100644 index f790d766c..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3347 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 1 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 1 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp.py b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp.py deleted file mode 100644 index b0ea9f830..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp.py +++ /dev/null @@ -1,103 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# packet QS_USER_00 (PHILO_STAT) produced when the status of a Philo changes. -# - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the name of object for current_obj() must match the - # QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # intercept the QS_USER_00 application-specific packet - # this packet has the following structure (see bsp.c:displayPhilStat()): - # record-ID, seq-num, Timestamp, format-byte, Philo-num, - # format-bye, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp1.py b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp1.py deleted file mode 100644 index 20d0412c8..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/dpp1.py +++ /dev/null @@ -1,147 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the standard QS_QEP_STATE_ENTRY -# packet, which provides information about the current states of the dining -# Philosophers. The example also demonstrates how to intercept the QS -# "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the information -# about the addresses of the Philosopher objects and the states of their -# state machines. -# - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the name of object for current_obj() must match the - # QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # intercept the QS_OBJ_DICT stadard packet - # this packet has the following structure: - # record-ID, seq-num, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # intercept the QS_FUN_DICT stadard packet - # this packet has the following structure: - # record-ID, seq-num, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # intercept the QS_QEP_TRAN stadard packet - # this packet has the following structure: - # record-ID, seq-num, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4623 -S4 -FO61 - - - - - 0 - 0 - 94 - 1 -
3368
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.cpp\94 -
- - 1 - 0 - 264 - 1 -
19370
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.cpp\264 -
-
- - - 0 - 1 - TH_XThread1 - - - - - 1 - 2 - 0x200002a4 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 7 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 9 - 5 - 0 - 0 - 0 - ..\..\qp_config.hpp - qp_config.hpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 12 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 14 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 15 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 16 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index cd9d609b2..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1931 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -Wno-c++98-compat -Wno-non-virtual-dtor -Wno-padded - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.cpp deleted file mode 100644 index 9543cf045..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/bsp.cpp +++ /dev/null @@ -1,556 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - CONTEXT_SW, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIOPortA_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QXK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - // try to get next contiguous block to transmit - QF_INT_DISABLE(); - std::uint8_t const *block = QS::getBlock(&fifo); - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.ccsproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.ccsproject deleted file mode 100644 index e057df002..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.ccsproject +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.cproject b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.cproject deleted file mode 100644 index 8dfdffe66..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.cproject +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.project b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.project deleted file mode 100644 index 260dc4f8a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/.project +++ /dev/null @@ -1,110 +0,0 @@ - - - dpp-qxk - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/arm-cm/qxk/gnu - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - QXK - 2 - PARENT-5-PROJECT_LOC/src/qxk - - - TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/TM4C123GH6PM.h - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qp_config.hpp - 1 - PARENT-2-PROJECT_LOC/qp_config.hpp - - - startup_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/gnu/startup_TM4C123GH6PM.c - - - system_TM4C123GH6PM.c - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.c - - - system_TM4C123GH6PM.h - 1 - PARENT-5-PROJECT_LOC/3rd_party/ek-tm4c123gxl/system_TM4C123GH6PM.h - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - xthread1.cpp - 1 - PARENT-1-PROJECT_LOC/xthread1.cpp - - - xthread2.cpp - 1 - PARENT-1-PROJECT_LOC/xthread2.cpp - - - - - CG_TOOL_GPP - $%7BCG_TOOL_ROOT%7D/bin/arm-none-eabi-g++ - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile deleted file mode 100644 index ce1c593cc..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/Makefile +++ /dev/null @@ -1,315 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/README.txt deleted file mode 100644 index ab8e99e8f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/README.txt +++ /dev/null @@ -1,79 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - -The CCS Project -=============== -This directory contains also the CCS project which can be imported to the -CCS (Code Composer Studio) IDE based on Eclipse. To import the project, -use the section "General -> Existing Project into Workspace" and select this -directory as the "root directory". For example, the "Select root directory" -might be: C:\qp-dev\qpc\examples\arm-cm\dpp_ek-tm4c123gxl\qxk\gnu - -Once you press "Browse", the project (dpp-qk, dpp-qv, or dpp-qxk) should -become visible. Click on "Select All" and then "Finish". - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/README.txt deleted file mode 100644 index a0a244154..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C++ framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C++ stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 143fc5398..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 1bab8a102..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3362 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 1 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread1.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread2.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/table.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/bsp.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/bsp.hpp deleted file mode 100644 index 87c7885c4..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/bsp.hpp +++ /dev/null @@ -1,61 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -#include // for placement new - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void wait4SW1(); -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp.hpp deleted file mode 100644 index 2b234a00b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp.hpp +++ /dev/null @@ -1,152 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::Philo_ctor} ...................................................... -void Philo_ctor( - std::uint_fast8_t const id, - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -//${Shared::Table_ctor} ...................................................... -void Table_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ -//$declare${Shared-TH} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_XThread1} .................................................. -extern QP::QXThread * const TH_XThread1; - -//${Shared-TH::XThread1_ctor} ................................................ -void XThread1_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared-TH::TH_XThread2} .................................................. -extern QP::QXThread * const TH_XThread2; - -//${Shared-TH::XThread2_ctor} ................................................ -void XThread2_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared-TH::TH_sema} ...................................................... -// NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. -extern QP::QXSemaphore TH_sema; - -//${Shared-TH::TH_mutex} ..................................................... -// NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. -extern QP::QXMutex TH_mutex; - -//${Shared-TH::TH_obj_dict} .................................................. -#ifdef Q_SPY -void TH_obj_dict(); -#endif // def Q_SPY - -} // namespace APP -//$enddecl${Shared-TH} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp_mpu.qm b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp_mpu.qm deleted file mode 100644 index 01304932c..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/dpp_mpu.qm +++ /dev/null @@ -1,728 +0,0 @@ - - - Dining Philosopher Problem example with MPU isolation - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - - - - - - - - - - - Q_REQUIRE(sizeof(Philo) <= size); - -// run the constructor through placemen new() -auto me = new(sto) Philo(id); -me->setThread(mpu); - - - - - - - - - - - - Q_REQUIRE(sizeof(Table) <= size); - -// run the constructor through placemen new() -auto me = new(sto) Table(); -me->setThread(mpu); - - - - - - - - - - - - - - - Q_REQUIRE(sizeof(XThread1) <= size); - -// run the constructor through placement new() -auto me = new(sto) XThread1(); -me->setThread(mpu); - - - - - - - - - - - - Q_REQUIRE(sizeof(XThread2) <= size); - -// run the constructor through placement new() -auto me = new(sto) XThread2(); -me->setThread(mpu); - - - - // NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. - - - - // NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. - - - - QS_OBJ_DICTIONARY(TH_XThread1); -QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - -QS_OBJ_DICTIONARY(TH_XThread2); -QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); -QS_OBJ_DICTIONARY(&TH_sema); -QS_OBJ_DICTIONARY(&TH_mutex); - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(static_cast<std::uint8_t>(id)) - - - - - - Q_UNUSED_PAR(e); - -#ifdef Q_SPY -Philo *Philo_inst = this; -QS_OBJ_ARR_DICTIONARY(Philo_inst, m_id); -QS_OBJ_ARR_DICTIONARY(&Philo_inst->m_timeEvt, m_id); -#endif - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); -(void)m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&Table::initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -#ifdef Q_SPY -Table *Table_inst = this; -QS_OBJ_DICTIONARY(Table_inst); -#endif - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; -#endif - QP::QActive::PUBLISH(pe, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - - - // NOTE: data needed by this thread should be members of -// the thread class. That way they are in the memory region -// accessible from this thread. - - - - : QXThread(&run) - - - - - - // downcast the generic thr pointer to the specific thread -auto me = static_cast<XThread1 *>(thr); - -// subscribe to the EAT signal (from the application) -me->subscribe(APP::EAT_SIG); - -for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); -} - - - - - - - // NOTE: data needed by this thread should be members of -// the thread class. That way they are in the memory region -// accessible from this thread. - - - - : QXThread(&run) - - - - - - // downcast the generic thr pointer to the specific thread -//auto me = static_cast<XThread2 *>(thr); - -// initialize the semaphore before using it -// NOTE: Here the semaphore is initialized in the highest-priority thread -// that uses it. Alternatively, the semaphore can be initialized -// before any thread runs. -TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - -// initialize the mutex before using it -// NOTE: Here the mutex is initialized in the highest-priority thread -// that uses it. Alternatively, the mutex can be initialized -// before any thread runs. -TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex -//l_mutex.init(0U); // alternatively: priority-ceiling NOT used - -for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); -} - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ -$declare ${Shared-TH} -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Philo} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$define ${Shared::Philo_ctor} - -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbor of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbor of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$define ${Shared::Table_ctor} - -$define ${AOs::Table} - - - - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared-TH::TH_sema} -$define ${Shared-TH::TH_mutex} - -$declare ${XThreads::XThread1} -$define ${Shared-TH::XThread1_ctor} -$define ${Shared-TH::TH_obj_dict} -$define ${XThreads::XThread1} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -$declare ${XThreads::XThread2} -$define ${Shared-TH::XThread2_ctor} -$define ${XThreads::XThread2} - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/README.txt deleted file mode 100644 index f4869b162..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -About this Example -================== -This directory contains the facilities for "linting" the application with -PC-Lint-Plus. - -To "lint" the application, invoke the batch "lin.bat" without parameters. -Optionally, you can supply the parameter -dQ_SPY to include the QS -instrumentation in the "linting" process. - -The output from the "linting" is saved in the file "lin_out.log". - -*** -NOTE: You need to adjust the symbol PCLP_DIR at the top of the lin.bat -file, to point to the directory where PC-Lint-Plus is installed on your -machine. -*** - - -The PC-Lint-Plus Options File -============================= -The "options.lnt" file specifies the linting options. You might need -to modify this file to suit your needs. - - -**** -NOTE: The purpose of this example is NOT to find problems with the -supporting 3rd-party code, which every non-trivial embedded system needs. -Rather, the purpose of this particular example is to check YOUR application -level code, such as state machines. -**** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/lin.bat b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/lin.bat deleted file mode 100644 index 4cbefe73c..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/lin.bat +++ /dev/null @@ -1,73 +0,0 @@ -@echo off -:: =========================================================================== -:: Product: QP/C++ build script for PC-Lint-Plus -:: Last Updated for Version: 6.8.0 -:: Date of the Last Update: 2020-01-26 -:: -:: Q u a n t u m L e a P s -:: ------------------------ -:: Modern Embedded Software -:: -:: Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -:: -:: This program is open source software: you can redistribute it and/or -:: modify it under the terms of the GNU General Public License as published -:: by the Free Software Foundation, either version 3 of the License, or -:: (at your option) any later version. -:: -:: Alternatively, this program may be distributed and modified under the -:: terms of Quantum Leaps commercial licenses, which expressly supersede -:: the GNU General Public License and are specifically designed for -:: licensees interested in retaining the proprietary status of their code. -:: -:: This program is distributed in the hope that it will be useful, -:: but WITHOUT ANY WARRANTY; without even the implied warranty of -:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -:: GNU General Public License for more details. -:: -:: You should have received a copy of the GNU General Public License -:: along with this program. If not, see . -:: -:: Contact information: -:: -:: -:: =========================================================================== -@setlocal - -:: usage of lin.bat -@echo Usage: lin [16bit] [-d...] [files...] -@echo examples: -@echo lin ..\table.cpp : use 32bit CPU (default) for linting ..\table.cpp -@echo lin 16bit -dQ_SPY ..\philo.cpp : use 16bit CPU and define Q_SPY for linting ..\philo.cpp -@echo lin ..\philo.cpp ..\table.cpp : use 32bit CPU for linting ..\philo.c and ..\table.cpp -@echo. - -:: NOTE: adjust to for your installation directory of PC-Lint-Plus -@set PCLP=C:\tools\lint-plus\windows\pclp32.exe - -if NOT exist "%PCLP%" ( - @echo The PC-Lint-Plus toolset not found. Please adjust lin.bat - @goto end -) - -:: set the QP/C++ directory -set QPCPP=..\..\..\.. -set QPCPP_LINT=%QPCPP%\ports\lint-plus - -if "%1"=="16bit" ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\16bit options.lnt %2 %3 %4 %5 %6 %7 %8 - @echo 16bit CPU -) else ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\32bit options.lnt %1 %2 %3 %4 %6 %7 %8 - @echo 32bit CPU (default) -) - -:: cleanup -@del *.log - - -:: linting ------------------------------------------------------------------- -%PCLP% -os(lint_out.log) %LINTFLAGS% - -:end -@endlocal diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/options.lnt b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/options.lnt deleted file mode 100644 index 6093417a3..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/lint-plus/options.lnt +++ /dev/null @@ -1,64 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Product: PC-Lint-Plus options for linting QP/C++ applications -// Last updated for version 6.8.0 -// Last updated on 2020-01-27 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -// general options --unit_check // perform only subset check (suppresses Global Wrapup) --max_threads=1 // suppress message "no '-max_threads=N' option" -//-vf // print names of all source files (for debugging linting) - -// include directories --i.. // application includes --i%QPCPP%\include // QP/C++ public includes --i%QPCPP_LINT% // QP/C++ lint "port" --i%QPCPP_LINT%\qk // QP/C++ lint "port" to QK - -// standards -%QPCPP_LINT%\au-autosar.lnt // AUTOSAR-C++:2014 -%QPCPP_LINT%\au-ds.lnt // Dan Saks recommendations -//-strong(AXJ) // Strong type checking - -// size/alignment options (included from %QPCPP_LINT%\??bit\) -cpu.lnt // for the chosen CPU - -///////////////////////////////////////////////////////////////////////////// -// QP/C++ options for clients -qpcpp.lnt // QP/C++ options - -///////////////////////////////////////////////////////////////////////////// -// additional suppression rules for building this application - -// underlying type for enums is always 'int' -+fei - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/main.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/philo.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/philo.cpp deleted file mode 100644 index 9f476c6df..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/philo.cpp +++ /dev/null @@ -1,266 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - Philo(std::uint_fast8_t const id); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Philo_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::Philo_ctor} ...................................................... -void Philo_ctor( - std::uint_fast8_t const id, - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(Philo) <= size); - - // run the constructor through placemen new() - auto me = new(sto) Philo(id); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared::Philo_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo(std::uint_fast8_t const id) - : QActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(static_cast(id)) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - #ifdef Q_SPY - Philo *Philo_inst = this; - QS_OBJ_ARR_DICTIONARY(Philo_inst, m_id); - QS_OBJ_ARR_DICTIONARY(&Philo_inst->m_timeEvt, m_id); - #endif - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.sct deleted file mode 100644 index fda39c74a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: 2048 assumeed STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 5749477cf..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,994 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2720,915,3197,1230,1) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 71837979a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1826 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/bsp.cpp deleted file mode 100644 index 2011b99ed..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/bsp.cpp +++ /dev/null @@ -1,874 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QK kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIOPortA_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - QF_MEM_SYS(); - - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {6}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOF_AHB_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {6}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void TM4C123GXL_MPU_setup() { - - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for TM4C123GXL, whole 256K - MPU->RBAR = 0x00000000U + 0x15U; // base address + region #5 - MPU->RASR = ((18U - 1U) << MPU_RASR_SIZE_Pos) // 2^18=256K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((5U - 1U) << MPU_RASR_SIZE_Pos) // 2^5=32B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - TM4C123GXL_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - QF_MEM_SYS(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_MEM_APP(); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QF_MEM_SYS(); - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - // try to get next contiguous block to transmit - std::uint8_t const *block = QS::getBlock(&fifo); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/Makefile deleted file mode 100644 index a2761cdd9..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/dpp-qk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewd deleted file mode 100644 index fbdad60c0..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewp deleted file mode 100644 index e71f06806..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qp_config.hpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qp_config.hpp deleted file mode 100644 index 6d234d0a1..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qp_config.hpp +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// use memory isolation (MPU) -#define QF_MEM_ISOLATE - -// use event constructors for dynamic events -//#define QEVT_DYN_CTOR - -// for QK kernel: -// use the QEI1_IRQHandler() with IRQ number 38 -// for the QK return-from-preemption handler -#define QK_USE_IRQ_NUM 38 -#define QK_USE_IRQ_HANDLER QEI1_IRQHandler - -// for QXK kernel: -// use the QEI1_IRQHandler() with IRQ number 38 -// for the QXK return-from-preemption handler -#define QXK_USE_IRQ_NUM 38 -#define QXK_USE_IRQ_HANDLER QEI1_IRQHandler - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.sct deleted file mode 100644 index 458d5506e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00040000 { ; load region size_region - ER_IROM1 0x00000000 0x00040000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 4a6ab23be..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1107 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2732,328,3209,643,1) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 208 - 1 -
1794
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qv\../bsp.cpp\208 -
- - 1 - 0 - 99 - 1 -
2040
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qv\../bsp.cpp\99 -
- - 2 - 0 - 319 - 1 -
1116
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - \\dpp_qv\../../../../../3rd_party/ek-tm4c123gxl/arm/startup_TM4C123GH6PM.s\319 -
- - 3 - 0 - 553 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
-
- - - 0 - 1 - APP::AO_Philo - - - 1 - 1 - APP::AO_Table - - - 2 - 1 - QV::priv_ - - - 3 - 1 - MPU_Table - - - - - 1 - 2 - 0x20000788 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2838,676,3315,991,1) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 319 - 1 -
1116
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - \\dpp_qv\../../../../../3rd_party/ek-tm4c123gxl/arm/startup_TM4C123GH6PM.s\319 -
- - 1 - 0 - 304 - 1 -
1092
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - \\dpp_qv\../../../../../3rd_party/ek-tm4c123gxl/arm/startup_TM4C123GH6PM.s\304 -
-
- - - 0 - 1 - priv_ - - - 1 - 1 - QActive::register_ - - - 2 - 1 - AO_Philo - - - - - 1 - 2 - 0x20000728 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index fbe8caede..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1793 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/bsp.cpp deleted file mode 100644 index 6d189a061..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/bsp.cpp +++ /dev/null @@ -1,869 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QV kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIOPortA_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - QF_MEM_SYS(); - - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {6}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOF_AHB_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {6}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void TM4C123GXL_MPU_setup() { - - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for TM4C123GXL, whole 256K - MPU->RBAR = 0x00000000U + 0x15U; // base address + region #5 - MPU->RASR = ((18U - 1U) << MPU_RASR_SIZE_Pos) // 2^18=256K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((5U - 1U) << MPU_RASR_SIZE_Pos) // 2^5=32B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - TM4C123GXL_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle the User LED on and then off, see NOTE2 - QF_MEM_SYS(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - // try to get next contiguous block to transmit - std::uint8_t const *block = QS::getBlock(&fifo); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_MEM_APP(); - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -// callback function to execute a user command -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QF/QV services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call any QF/QV services. The only mechanism by which a "QF-unaware" -// ISR can communicate with the QF framework is by pending a "QF-aware" ISR, -// which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/Makefile deleted file mode 100644 index 8b4533de5..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/README.txt b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/dpp-qv.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewd deleted file mode 100644 index fbdad60c0..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewp deleted file mode 100644 index 481ad9190..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3352 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp.py b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp.py deleted file mode 100644 index b0ea9f830..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp.py +++ /dev/null @@ -1,103 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# packet QS_USER_00 (PHILO_STAT) produced when the status of a Philo changes. -# - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the name of object for current_obj() must match the - # QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # intercept the QS_USER_00 application-specific packet - # this packet has the following structure (see bsp.c:displayPhilStat()): - # record-ID, seq-num, Timestamp, format-byte, Philo-num, - # format-bye, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp1.py b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp1.py deleted file mode 100644 index 20d0412c8..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/dpp1.py +++ /dev/null @@ -1,147 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the standard QS_QEP_STATE_ENTRY -# packet, which provides information about the current states of the dining -# Philosophers. The example also demonstrates how to intercept the QS -# "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the information -# about the addresses of the Philosopher objects and the states of their -# state machines. -# - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the name of object for current_obj() must match the - # QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # intercept the QS_OBJ_DICT stadard packet - # this packet has the following structure: - # record-ID, seq-num, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # intercept the QS_FUN_DICT stadard packet - # this packet has the following structure: - # record-ID, seq-num, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # intercept the QS_QEP_TRAN stadard packet - # this packet has the following structure: - # record-ID, seq-num, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/eating.gif b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/hungry.gif b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/thinking.gif b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4623 -S4 -FO61 - - - - - 0 - 0 - 88 - 1 -
3788
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.cpp\88 -
- - 1 - 0 - 319 - 1 -
1116
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - \\dpp_qxk\../../../../../3rd_party/ek-tm4c123gxl/arm/startup_TM4C123GH6PM.s\319 -
-
- - - 0 - 1 - _ZN2QP7QActive9registry_E - - - - - 1 - 2 - 0x200002a4 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=2691,237,3168,552,1) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 0 - 1 - QXK_priv_ - - - 1 - 1 - APP::TH_XThread1 - - - - - 1 - 2 - 0x20000758 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 9 - 5 - 0 - 0 - 0 - ..\..\qp_config.hpp - qp_config.hpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 12 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 14 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 15 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 16 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 2d540f04a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1931 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 1 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 4 - 0 - 1 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - -Wno-c++98-compat -Wno-non-virtual-dtor -Wno-padded - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/bsp.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/bsp.cpp deleted file mode 100644 index 65061eb62..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/bsp.cpp +++ /dev/null @@ -1,976 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, QXK kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_SysTick_Handler = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_GPIOPortA_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - QF_MEM_SYS(); - - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = static_cast(UART0->DR); - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {7U}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOF_AHB_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {7U}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// XThread1 thread............................................................ -constexpr std::uint32_t XTHREAD1_SIZE_POW2 {10U}; // XThread1 instance + stack -constexpr std::uint32_t XTHREAD1_STACK_SIZE {880U}; // Thread1 stack size - -__attribute__((aligned((1U << XTHREAD1_SIZE_POW2)))) -std::uint8_t XThread1_sto[1U << XTHREAD1_SIZE_POW2]; - -static std::uint8_t * const XThread1_inst = &XThread1_sto[XTHREAD1_STACK_SIZE]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_XThread1[3] = { - { reinterpret_cast(XThread1_sto) + 0x10U,//---- region #0 - ((XTHREAD1_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOF_AHB_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Thread2 thread............................................................. -constexpr std::uint32_t XTHREAD2_SIZE_POW2 {10U}; // XThread2 instance + stack -constexpr std::uint32_t XTHREAD2_STACK_SIZE {880U}; // XThread2 stack size - -__attribute__((aligned((1U << XTHREAD2_SIZE_POW2)))) -std::uint8_t XThread2_sto[1U << XTHREAD2_SIZE_POW2]; - -static std::uint8_t * const XThread2_inst = &XThread2_sto[XTHREAD2_STACK_SIZE]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_XThread2[3] = { - { reinterpret_cast(XThread2_sto) + 0x10U,//---- region #0 - ((XTHREAD2_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOF_AHB_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void TM4C123GXL_MPU_setup() { - - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for TM4C123GXL, whole 256K - MPU->RBAR = 0x00000000U + 0x15U; // base address + region #5 - MPU->RASR = ((18U - 1U) << MPU_RASR_SIZE_Pos) // 2^18=256K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((5U - 1U) << MPU_RASR_SIZE_Pos) // 2^5=32B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -QP::QXThread * const TH_XThread1 = - reinterpret_cast(XThread1_inst); -QP::QXThread * const TH_XThread2 = - reinterpret_cast(XThread2_inst); - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - TM4C123GXL_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QXK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - QS_ONLY(APP::TH_obj_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; -#ifdef QF_MEM_ISOLATE - APP::XThread1_ctor(XThread1_inst, - sizeof(XThread1_sto) - XTHREAD1_STACK_SIZE, - MPU_XThread1); -#else - APP::XThread1_ctor(XThread1_inst, - sizeof(XThread1_sto) - XTHREAD1_STACK_SIZE); -#endif - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &XThread1_sto[0], // stack storage - XTHREAD1_STACK_SIZE); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; -#ifdef QF_MEM_ISOLATE - APP::XThread2_ctor(XThread2_inst, - sizeof(XThread2_sto) - XTHREAD2_STACK_SIZE, - MPU_XThread2); -#else - APP::XThread2_ctor(XThread2_inst, - sizeof(XThread2_sto) - XTHREAD2_STACK_SIZE); -#endif - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &XThread2_sto[0], // stack storage - XTHREAD2_STACK_SIZE); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - QF_MEM_SYS(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_MEM_APP(); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QF_MEM_SYS(); - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - // try to get next contiguous block to transmit - std::uint8_t const *block = QS::getBlock(&fifo); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UART0->FR & UART_FR_TXFE) == 0U) { // while TXE not empty - } - UART0->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/Makefile b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/Makefile deleted file mode 100644 index ce1c593cc..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/Makefile +++ /dev/null @@ -1,315 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.3 -# Date of the Last Update: 2024-01-29 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=fpv4-sp-d16 -FLOAT_ABI := -mfloat-abi=hard - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/flash.bat b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 143fc5398..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 6ecdb277a..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3367 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\dpp-qxk.icf - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.icf deleted file mode 100644 index c6b24e1c6..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; /* <== Quantum Leaps */ -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread1.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread1.cpp deleted file mode 100644 index ab3561ed7..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread1.cpp +++ /dev/null @@ -1,162 +0,0 @@ -//$file${qxk::xthread1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${qxk::xthread1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${qxk::xthread1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared-TH::TH_sema} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_sema} ...................................................... -QP::QXSemaphore TH_sema; - -} // namespace APP -//$enddef${Shared-TH::TH_sema} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::TH_mutex} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_mutex} ..................................................... -QP::QXMutex TH_mutex; - -} // namespace APP -//$enddef${Shared-TH::TH_mutex} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${XThreads::XThread1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread1} ...................................................... -class XThread1 : public QP::QXThread { -private: - - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -} // namespace APP -//$enddecl${XThreads::XThread1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::XThread1_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::XThread1_ctor} ................................................ -void XThread1_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(XThread1) <= size); - - // run the constructor through placement new() - auto me = new(sto) XThread1(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared-TH::XThread1_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::TH_obj_dict} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_obj_dict} .................................................. -#ifdef Q_SPY -void TH_obj_dict() { - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); -} -#endif // def Q_SPY - -} // namespace APP -//$enddef${Shared-TH::TH_obj_dict} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${XThreads::XThread1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread1} ...................................................... - -//${XThreads::XThread1::XThread1} ............................................ -XThread1::XThread1() - : QXThread(&run) -{} - -//${XThreads::XThread1::run} ................................................. -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP -//$enddef${XThreads::XThread1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread2.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread2.cpp deleted file mode 100644 index 158cbb1ef..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/qxk/xthread2.cpp +++ /dev/null @@ -1,128 +0,0 @@ -//$file${qxk::xthread2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${qxk::xthread2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${qxk::xthread2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -//$declare${XThreads::XThread2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread2} ...................................................... -class XThread2 : public QP::QXThread { -private: - - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -} // namespace APP -//$enddecl${XThreads::XThread2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared-TH::XThread2_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::XThread2_ctor} ................................................ -void XThread2_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(XThread2) <= size); - - // run the constructor through placement new() - auto me = new(sto) XThread2(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared-TH::XThread2_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${XThreads::XThread2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread2} ...................................................... - -//${XThreads::XThread2::XThread2} ............................................ -XThread2::XThread2() - : QXThread(&run) -{} - -//${XThreads::XThread2::run} ................................................. -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP -//$enddef${XThreads::XThread2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/table.cpp b/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/table.cpp deleted file mode 100644 index 48c47eb38..000000000 --- a/examples/arm-cm/dpp_ek-tm4c123gxl_mpu/table.cpp +++ /dev/null @@ -1,360 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbor of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbor of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Table_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::Table_ctor} ...................................................... -void Table_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(Table) <= size); - - // run the constructor through placemen new() - auto me = new(sto) Table(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared::Table_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&Table::initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - #ifdef Q_SPY - Table *Table_inst = this; - QS_OBJ_DICTIONARY(Table_inst); - #endif - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_mbed-lpc1768/bsp.hpp b/examples/arm-cm/dpp_mbed-lpc1768/bsp.hpp deleted file mode 100644 index 82ed115d9..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_mbed-lpc1768/dpp.hpp b/examples/arm-cm/dpp_mbed-lpc1768/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_mbed-lpc1768/dpp.qm b/examples/arm-cm/dpp_mbed-lpc1768/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/main.cpp b/examples/arm-cm/dpp_mbed-lpc1768/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_mbed-lpc1768/mbed-lpc1768.jpeg b/examples/arm-cm/dpp_mbed-lpc1768/mbed-lpc1768.jpeg deleted file mode 100644 index 5e9ef5b499e189b2b91aeab6c7e04f0fa75525a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30025 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 N_`hDlN%eR3{{RPKVp#wH diff --git a/examples/arm-cm/dpp_mbed-lpc1768/philo.cpp b/examples/arm-cm/dpp_mbed-lpc1768/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.sct deleted file mode 100644 index cfd8b9c12..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00080000 { ; load region size_region - ER_IROM1 0x00000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x10000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 05acf3e92..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,962 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`Â -—.Çv´ð4 - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - - - - 0 - 1 - me - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - - - mbed-lpc1768 - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - system_LPC17xx.c - 0 - 0 - - - 2 - 8 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - startup_LPC17xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 9 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 10 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 385cc0627..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1748 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.cpp b/examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.cpp deleted file mode 100644 index be36a0d2e..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/bsp.cpp +++ /dev/null @@ -1,647 +0,0 @@ -//============================================================================ -// Product: DPP example, NXP mbed-LPC1768 board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "LPC17xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_1 {1U << 18U}; // P1.18 -constexpr std::uint32_t LED_2 {1U << 20U}; // P1.20 -constexpr std::uint32_t LED_3 {1U << 21U}; // P1.21 -constexpr std::uint32_t LED_4 {1U << 23U}; // P1.23 - -// Push-Button wired externally to DIP8 (P0.6) -constexpr std::uint32_t BTN_EXT {1U << 6U}; // P0.6 - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EINT0_IRQHandler = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {0x80U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - LPC_GPIO1->FIOSET = LED_1; // turn LED on - LPC_GPIO1->FIOSET = LED_2; // turn LED on - LPC_GPIO1->FIOSET = LED_3; // turn LED on - LPC_GPIO1->FIOSET = LED_4; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~LPC_GPIO0->FIOPIN; // read P0 with the buttons - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_EXT) != 0U) { // debounced BTN_EXT state changed? - if ((current & BTN_EXT) != 0U) { // is BTN_EXT depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif // Q_SPY - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void EINT0_IRQHandler(void); // prototype -void EINT0_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EINT0_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -// TBD: UART ISR for QS-RX channel... - -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - Q_UNUSED_PAR(prev); - Q_UNUSED_PAR(next); - - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // turn the GPIO clock on - LPC_SC->PCONP |= (1U << 15); - - // setup the GPIO pin functions for the LEDs... - LPC_PINCON->PINSEL3 &= ~(3U << 4); // LED_1: function P1.18 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 8); // LED_2: function P1.20 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 10); // LED_3: function P1.21 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 14); // LED_4: function P1.23 to GPIO - - // Set GPIO-P1 LED pins to output - LPC_GPIO1->FIODIR |= (LED_1 | LED_2 | LED_3 | LED_4); - - - // setup the GPIO pin function for the Button... - LPC_PINCON->PINSEL0 &= ~(3U << 12); // function P0.6 to GPIO, pull-up - - // Set GPIO-P0 Button pin as input - LPC_GPIO0->FIODIR &= ~BTN_EXT; - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EINT0_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LPC_GPIO1->FIOSET = LED_1; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_1; // turn LED off - } - if (stat[0] == 'e') { - LPC_GPIO1->FIOSET = LED_2; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_2; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - LPC_GPIO1->FIOSET = LED_3; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LPC_GPIO1->FIOSET = LED_3; // turn LED on -} -//............................................................................ -void ledOff() { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} - -} // namespace BSP - -//============================================================================ - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(EINT0_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EINT0_IRQn); -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - LPC_GPIO1->FIOSET = LED_4; // turn LED on - __NOP(); // a couple of NOPs to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LPC_GPIO1->FIOCLR = LED_4; // turn LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((LPC_UART0->LSR & 0x20U) != 0U) { // TX Holding Register empty? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_INT_DISABLE(); - // try to get next contiguous block to transmit - uint8_t const *block = QS::getBlock(&fifo); - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - LPC_UART0->THR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY - -namespace QS { - -static void UART0_setBaudrate(std::uint32_t baud); // helper function - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // setup the P0_2 UART0 TX pin - LPC_PINCON->PINSEL0 &= ~(3U << 4); // clear P0_2 function - LPC_PINCON->PINSEL0 |= (1U << 4); // P0_2 to UART function (TX) - LPC_PINCON->PINMODE0 &= ~(3U << 4); // P0_2 pull-up register - - // setup the P0_3 UART0 RX pin - LPC_PINCON->PINSEL0 &= ~(3U << 6); // clear P0_3 function - LPC_PINCON->PINSEL0 |= (1U << 6); // P0_3 to UART function (RX) - LPC_PINCON->PINMODE0 &= ~(3U << 6); // P0_3 pull-up register - - // enable power to UART0 - LPC_SC->PCONP |= (1U << 3); - - // enable FIFOs and default RX trigger level - LPC_UART0->FCR = - (1U << 0) // FIFO Enable - 0 = Disables, 1 = Enabled - | (0U << 1) // Rx Fifo Reset - | (0U << 2) // Tx Fifo Reset - | (0U << 6); // Rx irq trig: 0=1char, 1=4chars, 2=8chars, 3=14chars - - // disable IRQs - LPC_UART0->IER = - (0U << 0) // Rx Data available IRQ disable - | (0U << 1) // Tx Fifo empty IRQ disable - | (0U << 2); // Rx Line Status IRQ disable - - - // set default baud rate - UART0_setBaudrate(115200U); - - // format 8-data-bits, 1-stop-bit, parity-none - LPC_UART0->LCR = - (3U << 0) // 8-data-bits - | (0U << 2) // 1 stop-bit - | (0U << 3) // parity disable - | (0U << 4); // parity none - - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((LPC_UART0->LSR & 0x20U) == 0U) { // while THR empty... - } - LPC_UART0->THR = b; // put into the THR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -//............................................................................ -// -// Set the LPC UART0 barud-rate generator according to -// Section 14.4.12 in LPC176x Manual (document UM10360) -// -static void UART0_setBaudrate(std::uint32_t baud) { - - // First we check to see if the basic divide with no DivAddVal/MulVal - // ratio gives us an integer result. If it does, we set DivAddVal = 0, - // MulVal = 1. Otherwise, we search the valid ratio value range to find - // the closest match. This could be more elegant, using search methods - // and/or lookup tables, but the brute force method is not that much - // slower, and is more maintainable. - // - std::uint32_t PCLK = SystemCoreClock; // divider /1 set below - std::uint16_t DL = PCLK / (16U * baud); - std::uint8_t DivAddVal = 0U; - std::uint8_t MulVal = 1U; - - // set PCLK divider to 1 - LPC_SC->PCLKSEL0 &= ~(0x3U << 6); // clear divider bits - LPC_SC->PCLKSEL0 |= (0x1U << 6); // set divider to 1 - - if ((PCLK % (16U * baud)) != 0U) { // non zero remainder? - uint32_t err_best = baud; - bool found = false; - std::uint32_t b; - std::uint8_t mv; - for (mv = 1U; mv < 16U && !found; mv++) { - std::uint16_t dlv; - std::uint8_t dav; - for (dav = 0U; dav < mv; ++dav) { - // - // baud = PCLK / (16 * dlv * (1 + (DivAdd / Mul)) - // solving for dlv, we get - // dlv = mul * PCLK / (16 * baud * (divadd + mul)) - // mul has 4 bits, PCLK has 27 so we have 1 bit headroom, - // which can be used for rounding for many values of mul - // and PCLK we have 2 or more bits of headroom which can - // be used to improve precision - // note: X / 32 doesn't round correctly. - // Instead, we use ((X / 16) + 1) / 2 for correct rounding - // - if ((mv*PCLK*2U) & 0x80000000U) { // 1 bit headroom - dlv = ((((2U*mv*PCLK) / (baud*(dav + mv)))/16U) + 1U)/2U; - } - else { // 2 bits headroom, use more precision - dlv = ((((4U*mv*PCLK) / (baud*(dav+mv)))/32U) + 1U)/2U; - } - - // datasheet says if DLL==DLM==0, then 1 is used instead - if (dlv == 0U) { - dlv = 1U; - } - // datasheet says if dav > 0 then DL must be >= 2 - if ((dav > 0U) && (dlv < 2U)) { - dlv = 2U; - } - // integer rearrangement of baud equation (with rounding) - b = ((PCLK*mv / (dlv*(dav + mv)*8U)) + 1U)/2U; - b = (b >= baud) ? (b - baud) : (baud - b); - - // check to see how we did - if (b < err_best) { - err_best = b; - DL = dlv; - MulVal = mv; - DivAddVal = dav; - - if (b == baud) { - found = true; - break; // break out of the inner for-loop - } - } - } - } - } - - // set LCR[DLAB] to enable writing to divider registers - LPC_UART0->LCR |= (1U << 7); - - // set divider values - LPC_UART0->DLM = (DL >> 8) & 0xFFU; - LPC_UART0->DLL = (DL >> 0) & 0xFFU; - LPC_UART0->FDR = ((uint32_t)DivAddVal << 0) - | ((uint32_t)MulVal << 4); - - // clear LCR[DLAB] - LPC_UART0->LCR &= ~(1U << 7); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile b/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile deleted file mode 100644 index 351df8549..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on mbed-LPC1768, QK kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/mbed-lpc1768 \ - $(QPCPP)/3rd_party/mbed-lpc1768/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/mbed-lpc1768 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_LPC17xx.c \ - startup_LPC17xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/dpp-qk.ld deleted file mode 100644 index 77594d7f1..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for LPC1768, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of mbed-LPC1768 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512K - RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x7FDF - - USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K - ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd deleted file mode 100644 index c8e7796d8..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp deleted file mode 100644 index 89b1d3da1..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3344 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - mbed-lpc1768 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\LPC17xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\iar\startup_LPC17xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf deleted file mode 100644 index 0b9e36c06..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x10000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __CRP_start__ = 0x000002FC; -define symbol __CRP_end__ = 0x000002FF; - -define symbol __RAM1_start__ = 0x2007C000; -define symbol __RAM1_end__ = 0x20083FFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__] - mem:[from __CRP_start__ to __CRP_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region CRP_region = mem:[from __CRP_start__ to __CRP_end__]; -define region RAM1_region = mem:[from __RAM1_start__ to __RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in CRP_region { section .crp }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.sct deleted file mode 100644 index cfd8b9c12..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00080000 { ; load region size_region - ER_IROM1 0x00000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x10000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 8d3f4019e..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,938 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`Â -—.Çv´ð4 - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - - - - 0 - 1 - me - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - - - mbed-lpc1768 - 1 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - system_LPC17xx.c - 0 - 0 - - - 2 - 6 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - startup_LPC17xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 7 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 8 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 9 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 10 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index c7b56b13a..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1718 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.cpp b/examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.cpp deleted file mode 100644 index f3839263e..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/bsp.cpp +++ /dev/null @@ -1,643 +0,0 @@ -//============================================================================ -// Product: DPP example, NXP mbed-LPC1768 board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "LPC17xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_1 {1U << 18U}; // P1.18 -constexpr std::uint32_t LED_2 {1U << 20U}; // P1.20 -constexpr std::uint32_t LED_3 {1U << 21U}; // P1.21 -constexpr std::uint32_t LED_4 {1U << 23U}; // P1.23 - -// Push-Button wired externally to DIP8 (P0.6) -constexpr std::uint32_t BTN_EXT {1U << 6U}; // P0.6 - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EINT0_IRQHandler = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {0x80U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - LPC_GPIO1->FIOSET = LED_1; // turn LED on - LPC_GPIO1->FIOSET = LED_2; // turn LED on - LPC_GPIO1->FIOSET = LED_3; // turn LED on - LPC_GPIO1->FIOSET = LED_4; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~LPC_GPIO0->FIOPIN; // read P0 with the buttons - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_EXT) != 0U) { // debounced BTN_EXT state changed? - if ((current & BTN_EXT) != 0U) { // is BTN_EXT depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif // Q_SPY - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions -void EINT0_IRQHandler(void); // prototype -void EINT0_IRQHandler(void) { - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EINT0_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs don't need to call -// QV_ISR_ENTRY/QV_ISR_EXIT and they cannot post or publish events. - -// TBD: UART ISR for QS-RX channel... - -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - Q_UNUSED_PAR(prev); - Q_UNUSED_PAR(next); - - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // turn the GPIO clock on - LPC_SC->PCONP |= (1U << 15); - - // setup the GPIO pin functions for the LEDs... - LPC_PINCON->PINSEL3 &= ~(3U << 4); // LED_1: function P1.18 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 8); // LED_2: function P1.20 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 10); // LED_3: function P1.21 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 14); // LED_4: function P1.23 to GPIO - - // Set GPIO-P1 LED pins to output - LPC_GPIO1->FIODIR |= (LED_1 | LED_2 | LED_3 | LED_4); - - - // setup the GPIO pin function for the Button... - LPC_PINCON->PINSEL0 &= ~(3U << 12); // function P0.6 to GPIO, pull-up - - // Set GPIO-P0 Button pin as input - LPC_GPIO0->FIODIR &= ~BTN_EXT; - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EINT0_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio. - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LPC_GPIO1->FIOSET = LED_1; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_1; // turn LED off - } - if (stat[0] == 'e') { - LPC_GPIO1->FIOSET = LED_2; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_2; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - LPC_GPIO1->FIOSET = LED_3; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // NOTE: no need to lock scheduler in QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LPC_GPIO1->FIOSET = LED_3; // turn LED on -} -//............................................................................ -void ledOff() { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} - -} // namespace BSP - -//============================================================================ - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(EINT0_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EINT0_IRQn); -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CATION: called with interrupts DISABLED, see NOTE0 - // toggle the User LED on and then off, see NOTE3 - LPC_GPIO1->FIOSET = LED_4; // turn LED on - __NOP(); // a couple of NOPs to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LPC_GPIO1->FIOCLR = LED_4; // turn LED off - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((LPC_UART0->LSR & 0x20U) != 0U) { // TX Holding Register empty? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_INT_DISABLE(); - // try to get next contiguous block to transmit - uint8_t const *block = QS::getBlock(&fifo); - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - LPC_UART0->THR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY - -namespace QS { - -static void UART0_setBaudrate(std::uint32_t baud); // helper function - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // setup the P0_2 UART0 TX pin - LPC_PINCON->PINSEL0 &= ~(3U << 4); // clear P0_2 function - LPC_PINCON->PINSEL0 |= (1U << 4); // P0_2 to UART function (TX) - LPC_PINCON->PINMODE0 &= ~(3U << 4); // P0_2 pull-up register - - // setup the P0_3 UART0 RX pin - LPC_PINCON->PINSEL0 &= ~(3U << 6); // clear P0_3 function - LPC_PINCON->PINSEL0 |= (1U << 6); // P0_3 to UART function (RX) - LPC_PINCON->PINMODE0 &= ~(3U << 6); // P0_3 pull-up register - - // enable power to UART0 - LPC_SC->PCONP |= (1U << 3); - - // enable FIFOs and default RX trigger level - LPC_UART0->FCR = - (1U << 0) // FIFO Enable - 0 = Disables, 1 = Enabled - | (0U << 1) // Rx Fifo Reset - | (0U << 2) // Tx Fifo Reset - | (0U << 6); // Rx irq trig: 0=1char, 1=4chars, 2=8chars, 3=14chars - - // disable IRQs - LPC_UART0->IER = - (0U << 0) // Rx Data available IRQ disable - | (0U << 1) // Tx Fifo empty IRQ disable - | (0U << 2); // Rx Line Status IRQ disable - - - // set default baud rate - UART0_setBaudrate(115200U); - - // format 8-data-bits, 1-stop-bit, parity-none - LPC_UART0->LCR = - (3U << 0) // 8-data-bits - | (0U << 2) // 1 stop-bit - | (0U << 3) // parity disable - | (0U << 4); // parity none - - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((LPC_UART0->LSR & 0x20U) == 0U) { // while THR empty... - } - LPC_UART0->THR = b; // put into the THR register - } - else { - break; - } - } -} -//............................................................................ -//! callback function to reset the target (to be implemented in the BSP) -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -// callback function to execute a user command -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -//............................................................................ -// -// Set the LPC UART0 barud-rate generator according to -// Section 14.4.12 in LPC176x Manual (document UM10360) -// -static void UART0_setBaudrate(std::uint32_t baud) { - - // First we check to see if the basic divide with no DivAddVal/MulVal - // ratio gives us an integer result. If it does, we set DivAddVal = 0, - // MulVal = 1. Otherwise, we search the valid ratio value range to find - // the closest match. This could be more elegant, using search methods - // and/or lookup tables, but the brute force method is not that much - // slower, and is more maintainable. - // - std::uint32_t PCLK = SystemCoreClock; // divider /1 set below - std::uint16_t DL = PCLK / (16U * baud); - std::uint8_t DivAddVal = 0U; - std::uint8_t MulVal = 1U; - - // set PCLK divider to 1 - LPC_SC->PCLKSEL0 &= ~(0x3U << 6); // clear divider bits - LPC_SC->PCLKSEL0 |= (0x1U << 6); // set divider to 1 - - if ((PCLK % (16U * baud)) != 0U) { // non zero remainder? - uint32_t err_best = baud; - bool found = false; - std::uint32_t b; - std::uint8_t mv; - for (mv = 1U; mv < 16U && !found; mv++) { - std::uint16_t dlv; - std::uint8_t dav; - for (dav = 0U; dav < mv; ++dav) { - // - // baud = PCLK / (16 * dlv * (1 + (DivAdd / Mul)) - // solving for dlv, we get - // dlv = mul * PCLK / (16 * baud * (divadd + mul)) - // mul has 4 bits, PCLK has 27 so we have 1 bit headroom, - // which can be used for rounding for many values of mul - // and PCLK we have 2 or more bits of headroom which can - // be used to improve precision - // note: X / 32 doesn't round correctly. - // Instead, we use ((X / 16) + 1) / 2 for correct rounding - // - if ((mv*PCLK*2U) & 0x80000000U) { // 1 bit headroom - dlv = ((((2U*mv*PCLK) / (baud*(dav + mv)))/16U) + 1U)/2U; - } - else { // 2 bits headroom, use more precision - dlv = ((((4U*mv*PCLK) / (baud*(dav+mv)))/32U) + 1U)/2U; - } - - // datasheet says if DLL==DLM==0, then 1 is used instead - if (dlv == 0U) { - dlv = 1U; - } - // datasheet says if dav > 0 then DL must be >= 2 - if ((dav > 0U) && (dlv < 2U)) { - dlv = 2U; - } - // integer rearrangement of baud equation (with rounding) - b = ((PCLK*mv / (dlv*(dav + mv)*8U)) + 1U)/2U; - b = (b >= baud) ? (b - baud) : (baud - b); - - // check to see how we did - if (b < err_best) { - err_best = b; - DL = dlv; - MulVal = mv; - DivAddVal = dav; - - if (b == baud) { - found = true; - break; // break out of the inner for-loop - } - } - } - } - } - - // set LCR[DLAB] to enable writing to divider registers - LPC_UART0->LCR |= (1U << 7); - - // set divider values - LPC_UART0->DLM = (DL >> 8) & 0xFFU; - LPC_UART0->DLL = (DL >> 0) & 0xFFU; - LPC_UART0->FDR = ((uint32_t)DivAddVal << 0) - | ((uint32_t)MulVal << 4); - - // clear LCR[DLAB] - LPC_UART0->LCR &= ~(1U << 7); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call the macros QV_ISR_ENTRY/QV_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile b/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile deleted file mode 100644 index 25c24d962..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on mbed-LPC1768, QV kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/mbed-lpc1768 \ - $(QPCPP)/3rd_party/mbed-lpc1768/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/mbed-lpc1768 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_LPC17xx.c \ - startup_LPC17xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/dpp-qv.ld deleted file mode 100644 index 77594d7f1..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for LPC1768, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of mbed-LPC1768 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512K - RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x7FDF - - USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K - ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd deleted file mode 100644 index c8e7796d8..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp deleted file mode 100644 index b0b028f07..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3344 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - mbed-lpc1768 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\LPC17xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\iar\startup_LPC17xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf deleted file mode 100644 index 0b9e36c06..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x10000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __CRP_start__ = 0x000002FC; -define symbol __CRP_end__ = 0x000002FF; - -define symbol __RAM1_start__ = 0x2007C000; -define symbol __RAM1_end__ = 0x20083FFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__] - mem:[from __CRP_start__ to __CRP_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region CRP_region = mem:[from __CRP_start__ to __CRP_end__]; -define region RAM1_region = mem:[from __RAM1_start__ to __RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in CRP_region { section .crp }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.sct b/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.sct deleted file mode 100644 index cfd8b9c12..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x00000000 0x00080000 { ; load region size_region - ER_IROM1 0x00000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x10000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00008000 - 2048) { ; NOTE: assume STACK size 2048! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvoptx b/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvoptx deleted file mode 100644 index 6782f7f49..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvoptx +++ /dev/null @@ -1,1022 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`Â -—.Çv´ð4 - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - - - - 0 - 1 - me - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 8 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - - - BIN\UL2CM3.DLL - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FCFE0 -FD10000000 -FF0LPC_IAP_512 -FL080000 -FS00 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - - - mbed-lpc1768 - 1 - 0 - 0 - 0 - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - system_LPC17xx.c - 0 - 0 - - - 2 - 10 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - startup_LPC17xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index e6354c844..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - LPC1768 - NXP - Keil.LPC1700_DFP.2.7.1 - http://www.keil.com/pack/ - IROM(0x00000000,0x80000) IRAM(0x10000000,0x8000) IRAM2(0x2007C000,0x8000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD10000000 -FCFE0 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000 -FP0($$Device:LPC1768$Flash\LPC_IAP_512.FLM)) - 0 - $$Device:LPC1768$Device\Include\LPC17xx.h - - - - - - - - - - $$Device:LPC1768$SVD\LPC176x5x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x8000 - - - 0 - 0x2007c000 - 0x8000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\mbed-lpc1768 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - - - mbed-lpc1768 - - - system_LPC17xx.c - 1 - ..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - startup_LPC17xx.s - 2 - ..\..\..\..\..\3rd_party\mbed-lpc1768\arm\startup_LPC17xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/bsp.cpp b/examples/arm-cm/dpp_mbed-lpc1768/qxk/bsp.cpp deleted file mode 100644 index 5a318f17c..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/bsp.cpp +++ /dev/null @@ -1,661 +0,0 @@ -//============================================================================ -// Product: DPP example, NXP mbed-LPC1768 board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "LPC17xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_1 {1U << 18U}; // P1.18 -constexpr std::uint32_t LED_2 {1U << 20U}; // P1.20 -constexpr std::uint32_t LED_3 {1U << 21U}; // P1.21 -constexpr std::uint32_t LED_4 {1U << 23U}; // P1.23 - -// Push-Button wired externally to DIP8 (P0.6) -constexpr std::uint32_t BTN_EXT {1U << 6U}; // P0.6 - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EINT0_IRQHandler = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {0x80U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up all LEDs - LPC_GPIO1->FIOSET = LED_1; // turn LED on - LPC_GPIO1->FIOSET = LED_2; // turn LED on - LPC_GPIO1->FIOSET = LED_3; // turn LED on - LPC_GPIO1->FIOSET = LED_4; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~LPC_GPIO0->FIOPIN; // read P0 with the buttons - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_EXT) != 0U) { // debounced BTN_EXT state changed? - if ((current & BTN_EXT) != 0U) { // is BTN_EXT depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif // Q_SPY - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void EINT0_IRQHandler(void); // prototype -void EINT0_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EINT0_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -// TBD: UART ISR for QS-RX channel... - -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - Q_UNUSED_PAR(prev); - Q_UNUSED_PAR(next); - - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // turn the GPIO clock on - LPC_SC->PCONP |= (1U << 15); - - // setup the GPIO pin functions for the LEDs... - LPC_PINCON->PINSEL3 &= ~(3U << 4); // LED_1: function P1.18 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 8); // LED_2: function P1.20 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 10); // LED_3: function P1.21 to GPIO - LPC_PINCON->PINSEL3 &= ~(3U << 14); // LED_4: function P1.23 to GPIO - - // Set GPIO-P1 LED pins to output - LPC_GPIO1->FIODIR |= (LED_1 | LED_2 | LED_3 | LED_4); - - - // setup the GPIO pin function for the Button... - LPC_PINCON->PINSEL0 &= ~(3U << 12); // function P0.6 to GPIO, pull-up - - // Set GPIO-P0 Button pin as input - LPC_GPIO0->FIODIR &= ~BTN_EXT; - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EINT0_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LPC_GPIO1->FIOSET = LED_1; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_1; // turn LED off - } - if (stat[0] == 'e') { - LPC_GPIO1->FIOSET = LED_2; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_2; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - LPC_GPIO1->FIOSET = LED_3; // turn LED on - } - else { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LPC_GPIO1->FIOSET = LED_3; // turn LED on -} -//............................................................................ -void ledOff() { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - LPC_GPIO1->FIOCLR = LED_3; // turn LED off -} - -} // namespace BSP - -//============================================================================ - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(EINT0_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EINT0_IRQn); -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle the User LED on and then off, see NOTE3 - QF_INT_DISABLE(); - LPC_GPIO1->FIOSET = LED_4; // turn LED on - __NOP(); // a couple of NOPs to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LPC_GPIO1->FIOCLR = LED_4; // turn LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((LPC_UART0->LSR & 0x20U) != 0U) { // TX Holding Register empty? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_INT_DISABLE(); - // try to get next contiguous block to transmit - uint8_t const *block = QS::getBlock(&fifo); - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - LPC_UART0->THR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY - -namespace QS { - -static void UART0_setBaudrate(std::uint32_t baud); // helper function - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // setup the P0_2 UART0 TX pin - LPC_PINCON->PINSEL0 &= ~(3U << 4); // clear P0_2 function - LPC_PINCON->PINSEL0 |= (1U << 4); // P0_2 to UART function (TX) - LPC_PINCON->PINMODE0 &= ~(3U << 4); // P0_2 pull-up register - - // setup the P0_3 UART0 RX pin - LPC_PINCON->PINSEL0 &= ~(3U << 6); // clear P0_3 function - LPC_PINCON->PINSEL0 |= (1U << 6); // P0_3 to UART function (RX) - LPC_PINCON->PINMODE0 &= ~(3U << 6); // P0_3 pull-up register - - // enable power to UART0 - LPC_SC->PCONP |= (1U << 3); - - // enable FIFOs and default RX trigger level - LPC_UART0->FCR = - (1U << 0) // FIFO Enable - 0 = Disables, 1 = Enabled - | (0U << 1) // Rx Fifo Reset - | (0U << 2) // Tx Fifo Reset - | (0U << 6); // Rx irq trig: 0=1char, 1=4chars, 2=8chars, 3=14chars - - // disable IRQs - LPC_UART0->IER = - (0U << 0) // Rx Data available IRQ disable - | (0U << 1) // Tx Fifo empty IRQ disable - | (0U << 2); // Rx Line Status IRQ disable - - - // set default baud rate - UART0_setBaudrate(115200U); - - // format 8-data-bits, 1-stop-bit, parity-none - LPC_UART0->LCR = - (3U << 0) // 8-data-bits - | (0U << 2) // 1 stop-bit - | (0U << 3) // parity disable - | (0U << 4); // parity none - - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((LPC_UART0->LSR & 0x20U) == 0U) { // while THR empty... - } - LPC_UART0->THR = b; // put into the THR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -//............................................................................ -// -// Set the LPC UART0 barud-rate generator according to -// Section 14.4.12 in LPC176x Manual (document UM10360) -// -static void UART0_setBaudrate(std::uint32_t baud) { - - // First we check to see if the basic divide with no DivAddVal/MulVal - // ratio gives us an integer result. If it does, we set DivAddVal = 0, - // MulVal = 1. Otherwise, we search the valid ratio value range to find - // the closest match. This could be more elegant, using search methods - // and/or lookup tables, but the brute force method is not that much - // slower, and is more maintainable. - // - std::uint32_t PCLK = SystemCoreClock; // divider /1 set below - std::uint16_t DL = PCLK / (16U * baud); - std::uint8_t DivAddVal = 0U; - std::uint8_t MulVal = 1U; - - // set PCLK divider to 1 - LPC_SC->PCLKSEL0 &= ~(0x3U << 6); // clear divider bits - LPC_SC->PCLKSEL0 |= (0x1U << 6); // set divider to 1 - - if ((PCLK % (16U * baud)) != 0U) { // non zero remainder? - uint32_t err_best = baud; - bool found = false; - std::uint32_t b; - std::uint8_t mv; - for (mv = 1U; mv < 16U && !found; mv++) { - std::uint16_t dlv; - std::uint8_t dav; - for (dav = 0U; dav < mv; ++dav) { - // - // baud = PCLK / (16 * dlv * (1 + (DivAdd / Mul)) - // solving for dlv, we get - // dlv = mul * PCLK / (16 * baud * (divadd + mul)) - // mul has 4 bits, PCLK has 27 so we have 1 bit headroom, - // which can be used for rounding for many values of mul - // and PCLK we have 2 or more bits of headroom which can - // be used to improve precision - // note: X / 32 doesn't round correctly. - // Instead, we use ((X / 16) + 1) / 2 for correct rounding - // - if ((mv*PCLK*2U) & 0x80000000U) { // 1 bit headroom - dlv = ((((2U*mv*PCLK) / (baud*(dav + mv)))/16U) + 1U)/2U; - } - else { // 2 bits headroom, use more precision - dlv = ((((4U*mv*PCLK) / (baud*(dav+mv)))/32U) + 1U)/2U; - } - - // datasheet says if DLL==DLM==0, then 1 is used instead - if (dlv == 0U) { - dlv = 1U; - } - // datasheet says if dav > 0 then DL must be >= 2 - if ((dav > 0U) && (dlv < 2U)) { - dlv = 2U; - } - // integer rearrangement of baud equation (with rounding) - b = ((PCLK*mv / (dlv*(dav + mv)*8U)) + 1U)/2U; - b = (b >= baud) ? (b - baud) : (baud - b); - - // check to see how we did - if (b < err_best) { - err_best = b; - DL = dlv; - MulVal = mv; - DivAddVal = dav; - - if (b == baud) { - found = true; - break; // break out of the inner for-loop - } - } - } - } - } - - // set LCR[DLAB] to enable writing to divider registers - LPC_UART0->LCR |= (1U << 7); - - // set divider values - LPC_UART0->DLM = (DL >> 8) & 0xFFU; - LPC_UART0->DLL = (DL >> 0) & 0xFFU; - LPC_UART0->FDR = ((uint32_t)DivAddVal << 0) - | ((uint32_t)MulVal << 4); - - // clear LCR[DLAB] - LPC_UART0->LCR &= ~(1U << 7); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QXK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/Makefile b/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/Makefile deleted file mode 100644 index 5792a4d2f..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/Makefile +++ /dev/null @@ -1,314 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on mbed-LPC1768, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-07 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/mbed-lpc1768 \ - $(QPCPP)/3rd_party/mbed-lpc1768/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/mbed-lpc1768 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_LPC17xx.c \ - startup_LPC17xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 77594d7f1..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for LPC1768, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of mbed-LPC1768 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512K - RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x7FDF - - USB_RAM(rwx) : ORIGIN = 0x2007C000, LENGTH = 16K - ETH_RAM(rwx) : ORIGIN = 0x20080000, LENGTH = 16K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index c8e7796d8..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 7ffe082fb..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3359 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - mbed-lpc1768 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\LPC17xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\iar\startup_LPC17xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\mbed-lpc1768\system_LPC17xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 0b9e36c06..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x10000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x10007FDF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __CRP_start__ = 0x000002FC; -define symbol __CRP_end__ = 0x000002FF; - -define symbol __RAM1_start__ = 0x2007C000; -define symbol __RAM1_end__ = 0x20083FFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__] - mem:[from __CRP_start__ to __CRP_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region CRP_region = mem:[from __CRP_start__ to __CRP_end__]; -define region RAM1_region = mem:[from __RAM1_start__ to __RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in CRP_region { section .crp }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread1.cpp b/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread2.cpp b/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_mbed-lpc1768/table.cpp b/examples/arm-cm/dpp_mbed-lpc1768/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_mbed-lpc1768/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6/README.md b/examples/arm-cm/dpp_nucleo-c031c6/README.md deleted file mode 100644 index 9f5e47a70..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/README.md +++ /dev/null @@ -1,149 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# DPP on NUCLEO-C031C6 -This example demonstrates the [Dining Philosophers Problem (DPP) application](https://www.state-machine.com/qpc/tut_dpp.html) on the STM32 NUCLEO-C031C6 board (ARM Cortex-M0+). - -

-
-STM32 NUCLEO-C031C6 -

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

- -

- -## Features Demonstrated -- multiple cooperating active objects -- immutable (const) events -- mutable (dynamic) events -- time events -- direct event posting -- publish-subscribe event delivery -- cooperative QV kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive run-to-completion QK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive dual-mode QXK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain - -## Build Configurations -- Debug -- Release -- Spy - software tracing with the built-in virtual COM port - -# Code Organization -``` -examples\arm-cm\dpp_nucleo-c031c6 -| -+---qk // preemptive QK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qk.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qk.eww // IAR EW-ARM workspace -| -\---qv // cooperative QK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qv.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qv.eww // IAR EW-ARM workspace -| -+---qxk // preemptive, dual-mode QXK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qxk.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qxk.eww // IAR EW-ARM workspace -| -``` - -# Building the example - -### GNU/ARM -- open terminal window -- change to the desired directory (either `examples\arm-cm\dpp_nucleo-c031c6\qk\gnu`, `examples\arm-cm\dpp_nucleo-c031c6\qv\gnu`, or `examples\arm-cm\dpp_nucleo-c031c6\qxk\gnu`) -- to build the default Debug configuration, type: - -``` -make -``` - -> **NOTE** -The `make` utility for Windows is provided in the QTools collection for Windows. - -- to build the Release configuration, type: - -``` -make CONF=rel -``` - -- to build the Spy configuration, type: - -``` -make CONF=spy -``` - - -### ARM/KEIL MDK -- Open the provided KEIL uVision project (either `dpp-qk.uvprojx`, `dpp-qv.uvprojx`, or `dpp-qxk.uvprojx`) -in Keil uVision IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Target" drop-down menu. - - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `dpp-qk.eww`, `dpp-qv.eww`, or `dpp-qxk.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - - -# Uploading the Binary to the Board -The STM32 NUCLEO boards enumerate as a USB drive when connected to the host computer. The boards then can be programmed by **copying** the binary to that USB drive. This can be useful for the command-line GNU/ARM build. For example, to program the binary produced for the Debug configuration, you can type: - -``` -copy dbg\dpp-qk.bin E: -``` -NOTE: The above command assumes that the NUCLEO board enumerated as drive E:. Of course you need to adjust the command for your specific drive letter. - -Alternatively, if you use IDEs, such as KEIL-MDK or IAR EWARM, you can program the board from the IDE (e.g., by starting a debug session). - - -# Tracing with QP/Spy -When the board is flashed with the Spy build configuration, it produces the QP/Spy software tracing output to the built-in virtual COM port of the TivaC LauchPad board. The trace is binary rather than ASCII, and therefore requires a special host-based application called QSPY. - -> **NOTE** QSPY host application is available in the QTools collection. - -To launch the QSPY host application: -- open terminal window -- type: - -``` -qspy -c COM5 -``` - -where "COM5" is an example virtual COM port enumerated by the board. You need to check the specific COM port number on your host computer using the Device Manager application, Ports (COM and LPT) section. - - -The following screen shot shows a typical output from QSPY: - -

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

- diff --git a/examples/arm-cm/dpp_nucleo-c031c6/bsp.hpp b/examples/arm-cm/dpp_nucleo-c031c6/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6/dpp.hpp b/examples/arm-cm/dpp_nucleo-c031c6/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6/dpp.qm b/examples/arm-cm/dpp_nucleo-c031c6/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/main.cpp b/examples/arm-cm/dpp_nucleo-c031c6/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6/philo.cpp b/examples/arm-cm/dpp_nucleo-c031c6/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/README.txt b/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/README.txt deleted file mode 100644 index 93065fc2d..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/README.txt +++ /dev/null @@ -1,74 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32C0xx_DFP. -*** - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - - -Selecting QK Exception -====================== -The QK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QK_USE_IRQ_NUM and QK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QK IRQ -as follows: - -QK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QK_USE_IRQ_NUM=31 - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - -The file startup_stm32c031xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.sct deleted file mode 100644 index ba687922e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; STACK area - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 0a2ea127e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1036 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qk.sct - dpp-qk.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - 4 - 27 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 2b1e8eaed..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1838 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6/qk/bsp.cpp deleted file mode 100644 index 602864faa..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/bsp.cpp +++ /dev/null @@ -1,539 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QK -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -constexpr std::uint32_t USART2_TX_PIN {2U}; -constexpr std::uint32_t USART2_RX_PIN {3U}; - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile deleted file mode 100644 index 767067122..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile-cpp20 b/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile-cpp20 deleted file mode 100644 index 6ccec6490..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/Makefile-cpp20 +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/README.txt deleted file mode 100644 index c3e5015ca..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/README.txt +++ /dev/null @@ -1,92 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Selecting QK Exception -====================== -The QK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QK_USE_IRQ_NUM and QK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QK IRQ -as follows: - -QK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QK_USE_IRQ_NUM=31 - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - -The file startup_stm32c031xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/dpp-qk.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewp deleted file mode 100644 index 7bbccf8a5..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 96 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qp_config.hpp b/examples/arm-cm/dpp_nucleo-c031c6/qp_config.hpp deleted file mode 100644 index 2ca7ce444..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qp_config.hpp +++ /dev/null @@ -1,54 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-07 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// use event constructors for dynamic events -#define QEVT_DYN_CTOR - -// for QK kernel: -// use the Reserved31_IRQHandler() with IRQ number 31 -// for the QK return-from-preemption handler -#define QK_USE_IRQ_NUM 31 -#define QK_USE_IRQ_HANDLER Reserved31_IRQHandler - -// for QXK kernel: -// use the Reserved31_IRQHandler() with IRQ number 31 -// for the QXK return-from-preemption handler -#define QXK_USE_IRQ_NUM 31 -#define QXK_USE_IRQ_HANDLER Reserved31_IRQHandler - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qspy-output.png b/examples/arm-cm/dpp_nucleo-c031c6/qspy-output.png deleted file mode 100644 index ee764450fc698007b726222ee98e0c4ff8a2347d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30404 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

48s!6PLv3#1J$zTBSi{a{Ql)}O! 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 diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.sct deleted file mode 100644 index 100826b80..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 4b62ad563..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1036 +0,0 @@ - - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qv.sct - dpp-qv.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 27 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 86b74d6a4..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1841 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6/qv/bsp.cpp deleted file mode 100644 index 866ad748e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/bsp.cpp +++ /dev/null @@ -1,528 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions in QV -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // NOTE: no need to lock the scheduler for the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000U) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile deleted file mode 100644 index 7b49d172c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile-cpp20 b/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile-cpp20 deleted file mode 100644 index 272fd8d75..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/Makefile-cpp20 +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvoptx deleted file mode 100644 index 426490970..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvoptx +++ /dev/null @@ -1,984 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt;*.h;*.hpp;*.inc;*.md;*.qm - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x3 - ARM-GNU - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 120 - 65 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - ST-LINKIII-KEIL_SWO - -U -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x3 - ARM-GNU - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 120 - 65 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x3 - ARM-GNU - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 120 - 65 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - System Viewer\GPIOA - 35904 - - - System Viewer\USART2 - 35905 - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - ..\..\qp_config.hpp - qp_config.hpp - 0 - 0 - - - 1 - 7 - 5 - 0 - 0 - 0 - ..\..\README.md - README.md - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - startup_stm32c031xx.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qp_port.hpp - qp_port.hpp - 0 - 0 - - - 4 - 27 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvprojx deleted file mode 100644 index b2a014547..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/gnu/dpp-qv.uvprojx +++ /dev/null @@ -1,1473 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x3 - ARM-GNU - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 1 - 1 - 0 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - objcopy --input-target=ihex --output-target=binary !H $H@P.bin - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - -1 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - "Cortex-M0+" - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - - - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 2 - 1 - - -pedantic -Wall -Wextra -ffunction-sections -fdata-sections - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\gnu;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 0 - 1 - - - - - - - - - 1 - 0 - 1 - 1 - 1 - - - - - - -specs=nosys.specs -specs=nano.specs -Wl,--cref,--gc-sections - dpp-qv.ld - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - README.md - 5 - ..\..\README.md - - - table.cpp - 8 - ..\..\table.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x3 - ARM-GNU - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 1 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - objcopy --input-target=ihex --output-target=binary !H $H@P.bin - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - -1 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - "Cortex-M0+" - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - - - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 2 - 1 - - -std=c11 -pedantic -Wall -Wextra -ffunction-sections -fdata-sections - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\gnu;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 0 - 1 - - - - - - - - - 1 - 0 - 1 - 0 - 1 - - - - - - - dpp-qv.ld - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - README.md - 5 - ..\..\README.md - - - table.cpp - 8 - ..\..\table.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x3 - ARM-GNU - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 0 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - objcopy --input-target=ihex --output-target=binary !H $H@P.bin - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - -1 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - "Cortex-M0+" - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - - - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 2 - 1 - - -std=c11 -pedantic -Wall -Wextra -ffunction-sections -fdata-sections - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\gnu;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 0 - 1 - - - - - - - - - 1 - 0 - 1 - 0 - 1 - - - - - - - dpp-qv.ld - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - qp_config.hpp - 5 - ..\..\qp_config.hpp - - - README.md - 5 - ..\..\README.md - - - table.cpp - 8 - ..\..\table.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\gnu\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qv - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewp deleted file mode 100644 index ba7a63eff..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp.py b/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp.py deleted file mode 100644 index 73c516548..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp.py +++ /dev/null @@ -1,103 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp1.py deleted file mode 100644 index d93f7b6dc..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qview/dpp1.py +++ /dev/null @@ -1,147 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo_inst[0]", - "Philo_inst[1]", - "Philo_inst[2]", - "Philo_inst[3]", - "Philo_inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo_thinking", - "Philo_hungry", - "Philo_eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-c031c6/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qxk.sct - dpp-qxk.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 9 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - ::Utility - 1 - 0 - 0 - 1 - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.uvprojx deleted file mode 100644 index 52603444e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/arm-pack/dpp-qxk.uvprojx +++ /dev/null @@ -1,1415 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - ::Utility - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - ::Utility - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - ::Utility - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.sct b/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.sct deleted file mode 100644 index 100826b80..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvoptx deleted file mode 100644 index 7306563f1..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvoptx +++ /dev/null @@ -1,1096 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qxk.sct - dpp-qxk.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 9 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 30 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - 4 - 32 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 87848e919..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1913 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6/qxk/bsp.cpp deleted file mode 100644 index 75abe86f7..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/bsp.cpp +++ /dev/null @@ -1,557 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt { APP::PAUSE_SIG }; - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt { APP::SERVE_SIG }; - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QXK -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt { APP::TEST_SIG }; - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile deleted file mode 100644 index f4f58be6b..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile +++ /dev/null @@ -1,316 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile-cpp20 b/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile-cpp20 deleted file mode 100644 index 8d373e8ab..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/Makefile-cpp20 +++ /dev/null @@ -1,316 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -std=c++20 -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/README.txt deleted file mode 100644 index 85b07eb6b..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/README.txt +++ /dev/null @@ -1,92 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Selecting QXK Exception -======================= -The QXK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QXK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QXK_USE_IRQ_NUM and QXK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QXK IRQ -as follows: - -QXK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QXK_USE_IRQ_NUM=31 - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - -The file startup_stm32c031xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 07ca652c1..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3364 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-c031c6/stm32-nucleo-c031c6.jpg b/examples/arm-cm/dpp_nucleo-c031c6/stm32-nucleo-c031c6.jpg deleted file mode 100644 index 6647e2d493863c9d4268596be8bc982a1ca49ccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43475 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 aZwdcScKknmYz}5d{lD5b|344^F8mKp|M*b= diff --git a/examples/arm-cm/dpp_nucleo-c031c6/table.cpp b/examples/arm-cm/dpp_nucleo-c031c6/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/README.md b/examples/arm-cm/dpp_nucleo-c031c6_mpu/README.md deleted file mode 100644 index a94e4c56e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/README.md +++ /dev/null @@ -1,131 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# DPP on NUCLEO-C031C6 -This example demonstrates the [Dining Philosophers Problem (DPP) application](https://www.state-machine.com/qpc/tut_dpp.html) on the STM32 NUCLEO-C031C6 board (ARM Cortex-M0+). - -

-
-STM32 NUCLEO-C031C6 -

- -## Features Demonstrated -- multiple cooperating active objects -- immutable (const) events -- mutable (dynamic) events -- time events -- direct event posting -- publish-subscribe event delivery -- cooperative QV kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive run-to-completion QK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain -- preemptive dual-mode QXK kernel - + with ARM-KEIL toolchain - + with GNU-ARM toolchain - + with IAR-ARM toolchain - -## Build Configurations -- Debug -- Release -- Spy - software tracing with the built-in virtual COM port - -# Code Organization -``` -examples\arm-cm\dpp_nucleo-c031c6 -| -+---qk // preemptive QK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qk.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qk.eww // IAR EW-ARM workspace -| -\---qv // cooperative QK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qv.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qv.eww // IAR EW-ARM workspace -| -+---qxk // preemptive, dual-mode QXK kernel -| +---gnu // GNU-ARM toolchain -| | \---targetConfigs -| | Makefile // Makefile for GNU-ARM -| +---armclang // ARM/KEIL toolchain with Compiler 6 (ARM/CLANG) -| | dpp-qk.uvprojx // uVision project -| \---iar // IAR EWARM -| dpp-qk.eww // IAR EW-ARM workspace -| -``` - -# Building the example - -### GNU/ARM -- open terminal window -- change to the desired directory (either `examples\arm-cm\dpp_nucleo-c031c6\qk\gnu`, `examples\arm-cm\dpp_nucleo-c031c6\qv\gnu`, or `examples\arm-cm\dpp_nucleo-c031c6\qxk\gnu`) -- to build the default Debug configuration, type: - -``` -make -``` - -> **NOTE** -The `make` utility for Windows is provided in the QTools collection for Windows. - -- to build the Release configuration, type: - -``` -make CONF=rel -``` - -- to build the Spy configuration, type: - -``` -make CONF=spy -``` - - -### ARM/KEIL MDK -- Open the provided KEIL uVision project (either `dpp-qk.uvprojx`, `dpp-qv.uvprojx`, or `dpp-qxk.uvprojx`) -in Keil uVision IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Target" drop-down menu. - - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `dpp-qk.eww`, `dpp-qv.eww`, or `dpp-qxk.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - - -# Tracing with QP/Spy -When the board is flashed with the Spy build configuration, it produces the QP/Spy software tracing output to the built-in virtual COM port of the TivaC LauchPad board. The trace is binary rather than ASCII, and therefore requires a special host-based application called QSPY. - -> **NOTE** QSPY host application is available in the QTools collection. - -To launch the QSPY host application: -- open terminal window -- type: - -``` -qspy -c COM5 -``` - -where "COM5" is an example virtual COM port enumerated by the board. You need to check the specific COM port number on your host computer using the Device Manager application, Ports (COM and LPT) section. - - -The following screen shot shows a typical output from QSPY: - -

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

- diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/bsp.hpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/bsp.hpp deleted file mode 100644 index 87c7885c4..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/bsp.hpp +++ /dev/null @@ -1,61 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -#include // for placement new - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void wait4SW1(); -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp.hpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp.hpp deleted file mode 100644 index 2b234a00b..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp.hpp +++ /dev/null @@ -1,152 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::Philo_ctor} ...................................................... -void Philo_ctor( - std::uint_fast8_t const id, - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -//${Shared::Table_ctor} ...................................................... -void Table_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ -//$declare${Shared-TH} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_XThread1} .................................................. -extern QP::QXThread * const TH_XThread1; - -//${Shared-TH::XThread1_ctor} ................................................ -void XThread1_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared-TH::TH_XThread2} .................................................. -extern QP::QXThread * const TH_XThread2; - -//${Shared-TH::XThread2_ctor} ................................................ -void XThread2_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu = nullptr); - -//${Shared-TH::TH_sema} ...................................................... -// NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. -extern QP::QXSemaphore TH_sema; - -//${Shared-TH::TH_mutex} ..................................................... -// NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. -extern QP::QXMutex TH_mutex; - -//${Shared-TH::TH_obj_dict} .................................................. -#ifdef Q_SPY -void TH_obj_dict(); -#endif // def Q_SPY - -} // namespace APP -//$enddecl${Shared-TH} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp_mpu.qm b/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp_mpu.qm deleted file mode 100644 index 01304932c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/dpp_mpu.qm +++ /dev/null @@ -1,728 +0,0 @@ - - - Dining Philosopher Problem example with MPU isolation - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - - - - - - - - - - - Q_REQUIRE(sizeof(Philo) <= size); - -// run the constructor through placemen new() -auto me = new(sto) Philo(id); -me->setThread(mpu); - - - - - - - - - - - - Q_REQUIRE(sizeof(Table) <= size); - -// run the constructor through placemen new() -auto me = new(sto) Table(); -me->setThread(mpu); - - - - - - - - - - - - - - - Q_REQUIRE(sizeof(XThread1) <= size); - -// run the constructor through placement new() -auto me = new(sto) XThread1(); -me->setThread(mpu); - - - - - - - - - - - - Q_REQUIRE(sizeof(XThread2) <= size); - -// run the constructor through placement new() -auto me = new(sto) XThread2(); -me->setThread(mpu); - - - - // NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. - - - - // NOTE: kernel objects can be allocated outside any memory regions -// accessible to the threads. - - - - QS_OBJ_DICTIONARY(TH_XThread1); -QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - -QS_OBJ_DICTIONARY(TH_XThread2); -QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); -QS_OBJ_DICTIONARY(&TH_sema); -QS_OBJ_DICTIONARY(&TH_mutex); - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(static_cast<std::uint8_t>(id)) - - - - - - Q_UNUSED_PAR(e); - -#ifdef Q_SPY -Philo *Philo_inst = this; -QS_OBJ_ARR_DICTIONARY(Philo_inst, m_id); -QS_OBJ_ARR_DICTIONARY(&Philo_inst->m_timeEvt, m_id); -#endif - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); -(void)m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&Table::initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -#ifdef Q_SPY -Table *Table_inst = this; -QS_OBJ_DICTIONARY(Table_inst); -#endif - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; -#endif - QP::QActive::PUBLISH(pe, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - - - // NOTE: data needed by this thread should be members of -// the thread class. That way they are in the memory region -// accessible from this thread. - - - - : QXThread(&run) - - - - - - // downcast the generic thr pointer to the specific thread -auto me = static_cast<XThread1 *>(thr); - -// subscribe to the EAT signal (from the application) -me->subscribe(APP::EAT_SIG); - -for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); -} - - - - - - - // NOTE: data needed by this thread should be members of -// the thread class. That way they are in the memory region -// accessible from this thread. - - - - : QXThread(&run) - - - - - - // downcast the generic thr pointer to the specific thread -//auto me = static_cast<XThread2 *>(thr); - -// initialize the semaphore before using it -// NOTE: Here the semaphore is initialized in the highest-priority thread -// that uses it. Alternatively, the semaphore can be initialized -// before any thread runs. -TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - -// initialize the mutex before using it -// NOTE: Here the mutex is initialized in the highest-priority thread -// that uses it. Alternatively, the mutex can be initialized -// before any thread runs. -TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex -//l_mutex.init(0U); // alternatively: priority-ceiling NOT used - -for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); -} - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ -$declare ${Shared-TH} -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Philo} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$define ${Shared::Philo_ctor} - -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbor of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbor of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$define ${Shared::Table_ctor} - -$define ${AOs::Table} - - - - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared-TH::TH_sema} -$define ${Shared-TH::TH_mutex} - -$declare ${XThreads::XThread1} -$define ${Shared-TH::XThread1_ctor} -$define ${Shared-TH::TH_obj_dict} -$define ${XThreads::XThread1} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -$declare ${XThreads::XThread2} -$define ${Shared-TH::XThread2_ctor} -$define ${XThreads::XThread2} - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/main.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/philo.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/philo.cpp deleted file mode 100644 index 9f476c6df..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/philo.cpp +++ /dev/null @@ -1,266 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - Philo(std::uint_fast8_t const id); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Philo_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::Philo_ctor} ...................................................... -void Philo_ctor( - std::uint_fast8_t const id, - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(Philo) <= size); - - // run the constructor through placemen new() - auto me = new(sto) Philo(id); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared::Philo_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo(std::uint_fast8_t const id) - : QActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(static_cast(id)) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - #ifdef Q_SPY - Philo *Philo_inst = this; - QS_OBJ_ARR_DICTIONARY(Philo_inst, m_id); - QS_OBJ_ARR_DICTIONARY(&Philo_inst->m_timeEvt, m_id); - #endif - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/README.txt b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/README.txt deleted file mode 100644 index 93065fc2d..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/README.txt +++ /dev/null @@ -1,74 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32C0xx_DFP. -*** - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - - -Selecting QK Exception -====================== -The QK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QK_USE_IRQ_NUM and QK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QK IRQ -as follows: - -QK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QK_USE_IRQ_NUM=31 - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - -The file startup_stm32c031xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.sct deleted file mode 100644 index ba687922e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; STACK area - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 0a2ea127e..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1036 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qk.sct - dpp-qk.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - 4 - 27 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 2b1e8eaed..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1838 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qk.sct - 5 - .\dpp-qk.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/bsp.cpp deleted file mode 100644 index 394a6063d..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/bsp.cpp +++ /dev/null @@ -1,873 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QK kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {6}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOA_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {6}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void STM32C031C6_MPU_setup(void) { - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for STM32C031C6, whole 32K - MPU->RBAR = 0x08000000U + 0x15U; // base address + region #5 - MPU->RASR = ((15U - 1U) << MPU_RASR_SIZE_Pos) // 2^15=32K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - STM32C031C6_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //QF_MEM_SYS(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - //QF_MEM_APP(); - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QF_MEM_SYS(); - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - std::uint16_t b = QS::getByte(); - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000U) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/Makefile deleted file mode 100644 index 5d8d73837..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/Makefile +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-07 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/README.txt deleted file mode 100644 index c3e5015ca..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/README.txt +++ /dev/null @@ -1,92 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Selecting QK Exception -====================== -The QK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QK_USE_IRQ_NUM and QK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QK IRQ -as follows: - -QK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QK_USE_IRQ_NUM=31 - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - -The file startup_stm32c031xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/dpp-qk.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewp deleted file mode 100644 index 24e163341..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3352 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qp_config.hpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qp_config.hpp deleted file mode 100644 index ecf402f08..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qp_config.hpp +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// use memory isolation (MPU) -#define QF_MEM_ISOLATE - -// use event constructors for dynamic events -#define QEVT_DYN_CTOR - -// for QK kernel: -// use the Reserved31_IRQHandler() with IRQ number 31 -// for the QK return-from-preemption handler -#define QK_USE_IRQ_NUM 31 -#define QK_USE_IRQ_HANDLER Reserved31_IRQHandler - -// for QXK kernel: -// use the Reserved31_IRQHandler() with IRQ number 31 -// for the QXK return-from-preemption handler -#define QXK_USE_IRQ_NUM 31 -#define QXK_USE_IRQ_HANDLER Reserved31_IRQHandler - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.sct deleted file mode 100644 index 100826b80..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,23 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00008000 { ; load region size_region - ER_IROM1 0x08000000 0x00008000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { - * (STACK, +First) - } - RW_IRAM1 +0 (0x00003000 - 2048) { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 1507e157b..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1036 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qv.sct - dpp-qv.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 27 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 221fff158..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1838 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qv.sct - 5 - .\dpp-qv.sct - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/bsp.cpp deleted file mode 100644 index 994a28adb..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/bsp.cpp +++ /dev/null @@ -1,871 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QV kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions in QV -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { - // is RX register NOT empty? - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {6}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOA_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {6}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void STM32C031C6_MPU_setup(void) { - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for STM32C031C6, whole 32K - MPU->RBAR = 0x08000000U + 0x15U; // base address + region #5 - MPU->RASR = ((15U - 1U) << MPU_RASR_SIZE_Pos) // 2^15=32K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - STM32C031C6_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle the user LED on and then off (not enough LEDs, see NOTE02) - QF_MEM_SYS(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - std::uint16_t b = QS::getByte(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // QV_CPU_SLEEP() contains the WFI instruction, which stops the CPU - // clock, which unfortunately disables the JTAG port, so the ST-Link - // debugger can no longer connect to the board. For that reason, the call - // to QV_CPU_SLEEP() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts - QF_MEM_APP(); - QF_INT_ENABLE(); // for now, just enable interrupts -#else - QF_MEM_APP(); - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000U) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QF/QV services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call any QF/QV services. The only mechanism by which a "QF-unaware" -// ISR can communicate with the QF framework is by pending a "QF-aware" ISR, -// which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/Makefile deleted file mode 100644 index 2c7e12631..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/Makefile +++ /dev/null @@ -1,311 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-07 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/dpp-qv.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewp deleted file mode 100644 index 7fdf30d84..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3352 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp.py b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp.py deleted file mode 100644 index 73c516548..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp.py +++ /dev/null @@ -1,103 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp1.py deleted file mode 100644 index d93f7b6dc..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/dpp1.py +++ /dev/null @@ -1,147 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo_inst[0]", - "Philo_inst[1]", - "Philo_inst[2]", - "Philo_inst[3]", - "Philo_inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo_thinking", - "Philo_hungry", - "Philo_eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.hpp *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ST-LINKIII-KEIL_SWO - -U066BFF505153848667095842 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - UL2CM3 - -U -O206 -S8 -C0 -P00 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=3265,900,3740,1214,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32C0x_32 -FL08000 -FS08000000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U-O206 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32.FLM -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=3317,815,3792,1129,1)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - 0 - 0 - 170 - 1 -
134218192
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - \\dpp_qxk\../../../../../3rd_party/nucleo-c031c6/arm/startup_stm32c031xx.s\170 -
-
- - - 1 - 2 - 0x20000788 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - .\dpp-qxk.sct - dpp-qxk.sct - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 9 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-c031c6 - 1 - 0 - 0 - 0 - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - stm32c0xx.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - stm32c031xx.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - system_stm32c0xx.c - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - startup_stm32c031xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 30 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - 4 - 32 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 7eb6015f1..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1916 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 6 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32C031C6Tx - STMicroelectronics - Keil.STM32C0xx_DFP.1.0.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00003000) IROM(0x08000000,0x00008000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32C0x_32 -FS08000000 -FL08000 -FP0($$Device:STM32C031C6Tx$CMSIS\Flash\STM32C0x_32.FLM)) - 0 - $$Device:STM32C031C6Tx$Drivers\CMSIS\Device\ST\STM32C0xx\Include\stm32c0xx.h - - - - - - - - - - $$Device:STM32C031C6Tx$CMSIS\SVD\STM32C031.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 1 - 0x8000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x3000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-c031c6 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - dpp-qxk.sct - 5 - .\dpp-qxk.sct - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-c031c6 - - - stm32c0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - stm32c031xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - system_stm32c0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - startup_stm32c031xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-c031c6\arm\startup_stm32c031xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qs_port.hpp - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qp_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/bsp.cpp deleted file mode 100644 index 485a10a15..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/bsp.cpp +++ /dev/null @@ -1,965 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-C031C6 board, QXK kernel, MPU isolation -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32c0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD4_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -//---------------------------------------------------------------------------- -// MPU storage and settings... -struct MPU_Region { - std::uint32_t RBAR; - std::uint32_t RASR; -}; - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - QF_INT_DISABLE(); - QF_MEM_SYS(); - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QF_MEM_APP(); - QF_INT_ENABLE(); - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -#ifdef QF_MEM_ISOLATE -//............................................................................ -__attribute__(( used )) -void QF_onMemSys(void) { - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); -} -//............................................................................ -__attribute__(( used )) -void QF_onMemApp() { - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - if (next != nullptr) { - MPU->CTRL = 0U; // disable the MPU - - MPU_Region const * const region = - static_cast(next->getThread()); - MPU->RBAR = region[0].RBAR; - MPU->RASR = region[0].RASR; - MPU->RBAR = region[1].RBAR; - MPU->RASR = region[1].RASR; - MPU->RBAR = region[2].RBAR; - MPU->RASR = region[2].RASR; - - MPU->CTRL = MPU_CTRL_ENABLE_Msk // enable the MPU - | MPU_CTRL_PRIVDEFENA_Msk; // enable background region - __ISB(); - __DSB(); - } -} -#endif // QF_ON_CONTEXT_SW -#endif // QF_MEM_ISOLATE - -} // extern "C" - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -// Stack ..................................................................... -// NOTE -// The main stack size (provided here as power of 2), MUST match the actual -// stack size defined in the linker-script/startup-code. -constexpr std::uint32_t STACK_SIZE_POW2 {11U}; - -// Table AO................................................................... -// size of Table instance, as power-of-2 -constexpr std::uint32_t TABLE_SIZE_POW2 {7U}; - -__attribute__((aligned((1U << TABLE_SIZE_POW2)))) -static std::uint8_t Table_sto[1U << TABLE_SIZE_POW2]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Table[3] = { - { reinterpret_cast(Table_sto) + 0x10U,//---- region #0 - ((TABLE_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOA_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Philo AOs.................................................................. -// size of Philo instance, as power-of-2 -constexpr std::uint32_t PHILO_SIZE_POW2 {7U}; - -__attribute__((aligned((1U << PHILO_SIZE_POW2)))) -static std::uint8_t Philo_sto[APP::N_PHILO][1U << PHILO_SIZE_POW2]; - -constexpr std::uint32_t PHILO_SHARED_SIZE_POW2 {5U}; -__attribute__((aligned((1U << PHILO_SHARED_SIZE_POW2)))) -static union { - std::uint32_t rnd_seed; - std::uint8_t byteso[1U << PHILO_SHARED_SIZE_POW2]; -} Philo_shared_sto; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_Philo[APP::N_PHILO][3] = { - {{ reinterpret_cast(Philo_sto[0]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[1]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[2]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[3]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, - {{ reinterpret_cast(Philo_sto[4]) + 0x10U,//---- region #0 - ((PHILO_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { reinterpret_cast(&Philo_shared_sto) + 0x11U,//---- region #1 - ((PHILO_SHARED_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }}, -}; -#endif - -// XThread1 thread............................................................ -constexpr std::uint32_t XTHREAD1_SIZE_POW2 {10U}; // XThread1 instance + stack -constexpr std::uint32_t XTHREAD1_STACK_SIZE {400U}; // XThread1 stack size - -__attribute__((aligned((1U << XTHREAD1_SIZE_POW2)))) -std::uint8_t XThread1_sto[1U << XTHREAD1_SIZE_POW2]; - -static std::uint8_t * const XThread1_inst = &XThread1_sto[XTHREAD1_STACK_SIZE]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_XThread1[3] = { - { reinterpret_cast(XThread1_sto) + 0x10U,//---- region #0 - ((XTHREAD1_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOA_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// XThread2 thread............................................................ -constexpr std::uint32_t XTHREAD2_SIZE_POW2 {10U}; // XThread2 instance + stack -constexpr std::uint32_t XTHREAD2_STACK_SIZE {400U}; // XThread2 stack size - -__attribute__((aligned((1U << XTHREAD2_SIZE_POW2)))) -std::uint8_t XThread2_sto[1U << XTHREAD2_SIZE_POW2]; - -static std::uint8_t * const XThread2_inst = &XThread2_sto[XTHREAD2_STACK_SIZE]; - -#ifdef QF_MEM_ISOLATE -static MPU_Region const MPU_XThread2[3] = { - { reinterpret_cast(XThread2_sto) + 0x10U,//---- region #0 - ((XTHREAD2_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { GPIOA_BASE + 0x11U, //---- region #1 - ((9U - 1U) << MPU_RASR_SIZE_Pos) // 2^9=512B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (0U << MPU_RASR_C_Pos) // C=0 - + (1U << MPU_RASR_B_Pos) // B=1 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk }, // region enable - { 0U + 0x12U, //---- region #2 - 0U }, -}; -#endif - -// Shared Event-pools......................................................... -constexpr std::uint32_t EPOOLS_SIZE_POW2 {8U}; - -__attribute__((aligned((1U << EPOOLS_SIZE_POW2)))) -static struct EPools { - QF_MPOOL_EL(APP::TableEvt) smlPool[2*APP::N_PHILO]; - // ... other pools -} EPools_sto; -static_assert(sizeof(EPools_sto) <= (1U << EPOOLS_SIZE_POW2), - "Insufficient storage for Event Pools"); - -//............................................................................ -#ifdef QF_MEM_ISOLATE -static void STM32C031C6_MPU_setup(void) { - - MPU->CTRL = 0U; // disable the MPU - - // region #7: NULL-pointer protection region - MPU->RBAR = 0x00000000U + 0x17U; // base address + region #7 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (0U << MPU_RASR_AP_Pos) // PA:na/UA:na - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (0U << MPU_RASR_S_Pos) // S=0 - + (0U << MPU_RASR_C_Pos) // C=0 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #6: stack region - MPU->RBAR = 0x20000000U + 0x16U; // base address + region #6 - MPU->RASR = ((STACK_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #5: ROM region for STM32C031C6, whole 32K - MPU->RBAR = 0x08000000U + 0x15U; // base address + region #5 - MPU->RASR = ((15U - 1U) << MPU_RASR_SIZE_Pos) // 2^15=32K size - + (6U << MPU_RASR_AP_Pos) // PA:ro/UA:ro - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (0U << MPU_RASR_S_Pos) // S=0 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - // region #4: Event-pools region - MPU->RBAR = reinterpret_cast(&EPools_sto) + 0x14U;// region #4 - MPU->RASR = ((EPOOLS_SIZE_POW2 - 1U) << MPU_RASR_SIZE_Pos) // size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - -#ifdef Q_SPY - // region #3: QS-filters region - MPU->RBAR = reinterpret_cast(&QP::QS::filt_) + 0x13U;// region #3 - MPU->RASR = ((8U - 1U) << MPU_RASR_SIZE_Pos) // 2^8=256B size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (1U << MPU_RASR_XN_Pos) // XN=1 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable -#endif - - // region #0: temporary 4G region for the initial transient - MPU->RBAR = 0x00000000U + 0x10U; // base address + region #0 - MPU->RASR = ((32U - 1U) << MPU_RASR_SIZE_Pos) // 2^32=4G size - + (3U << MPU_RASR_AP_Pos) // PA:rw/UA:rw - + (0U << MPU_RASR_XN_Pos) // XN=0 - + (1U << MPU_RASR_S_Pos) // S=1 - + (1U << MPU_RASR_C_Pos) // C=1 - + (0U << MPU_RASR_B_Pos) // B=0 - + (0U << MPU_RASR_TEX_Pos) // TEX=0 - + MPU_RASR_ENABLE_Msk; // region enable - - MPU->CTRL = MPU_CTRL_ENABLE_Msk; // enable the MPU - // but do NOT enable background region - __ISB(); - __DSB(); -} -#endif - -} // unnamed namespace - -//============================================================================ -namespace APP { - -// "opaque" pointer to AO -QP::QActive * const AO_Table = reinterpret_cast(Table_sto); - -QP::QActive * const AO_Philo[APP::N_PHILO] = { - reinterpret_cast(Philo_sto[0]), // "opaque" pointer - reinterpret_cast(Philo_sto[1]), // "opaque" pointer - reinterpret_cast(Philo_sto[2]), // "opaque" pointer - reinterpret_cast(Philo_sto[3]), // "opaque" pointer - reinterpret_cast(Philo_sto[4]), // "opaque" pointer -}; - -QP::QXThread * const TH_XThread1 = - reinterpret_cast(XThread1_inst); -QP::QXThread * const TH_XThread2 = - reinterpret_cast(XThread2_inst); - -} // namespace APP - -//============================================================================ -namespace BSP { - -void init() { -#ifdef QF_MEM_ISOLATE - // setup the MPU - STM32C031C6_MPU_setup(); -#endif - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD4 - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~(3U << 2U*LD4_PIN); - GPIOA->MODER |= (1U << 2U*LD4_PIN); - GPIOA->OTYPER &= ~(1U << LD4_PIN); - GPIOA->OSPEEDR &= ~(3U << 2U*LD4_PIN); - GPIOA->OSPEEDR |= (1U << 2U*LD4_PIN); - GPIOA->PUPDR &= ~(3U << 2U*LD4_PIN); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - QS_ONLY(APP::TH_obj_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - QP::QF::poolInit(EPools_sto.smlPool, - sizeof(EPools_sto.smlPool), - sizeof(EPools_sto.smlPool[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; -#ifdef QF_MEM_ISOLATE - APP::XThread1_ctor(XThread1_inst, - sizeof(XThread1_sto) - XTHREAD1_STACK_SIZE, - MPU_XThread1); -#else - APP::XThread1_ctor(XThread1_inst, - sizeof(XThread1_sto) - XTHREAD1_STACK_SIZE); -#endif - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &XThread1_sto[0], // stack storage - XTHREAD1_STACK_SIZE); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { -#ifdef QF_MEM_ISOLATE - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n]), MPU_Philo[n]); -#else - APP::Philo_ctor(n, Philo_sto[n], sizeof(Philo_sto[n])); -#endif - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; -#ifdef QF_MEM_ISOLATE - APP::XThread2_ctor(XThread2_inst, - sizeof(XThread2_sto) - XTHREAD2_STACK_SIZE, - MPU_XThread2); -#else - APP::XThread2_ctor(XThread2_inst, - sizeof(XThread2_sto) - XTHREAD2_STACK_SIZE); -#endif - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &XThread2_sto[0], // stack storage - XTHREAD2_STACK_SIZE); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; -#ifdef QF_MEM_ISOLATE - APP::Table_ctor(Table_sto, sizeof(Table_sto), MPU_Table); -#else - APP::Table_ctor(Table_sto, sizeof(Table_sto)); -#endif - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - Philo_shared_sto.rnd_seed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = Philo_shared_sto.rnd_seed * (3U*7U*11U*13U*23U); - Philo_shared_sto.rnd_seed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRR = (1U << LD4_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //QF_MEM_SYS(); - //GPIOA->BSRR = (1U << LD4_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD4_PIN + 16U)); // turn LED[n] off - //QF_MEM_APP(); - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QF_MEM_SYS(); - QS::rxParse(); // parse all the received bytes - QF_MEM_APP(); - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - std::uint16_t b = QS::getByte(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } - QF_MEM_APP(); - QF_INT_ENABLE(); -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS facilities... -#ifdef Q_SPY -namespace QS { - -#ifdef QF_MEM_ISOLATE -// Shared QS filters... -__attribute__((aligned(32))) -Filter filt_; -#endif - -//............................................................................ -static uint16_t const UARTPrescTable[12] = { - 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U -}; - -#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__) \ - ((((__PCLK__)/UARTPrescTable[(__CLOCKPRESCALER__)]) \ - + ((__BAUD__)/2U)) / (__BAUD__)) - -#define UART_PRESCALER_DIV1 0U - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APBENR1 |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA to USART2_RX, PA to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 1U << 4U*USART2_RX_PIN) | ( 1U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - // baud rate - USART2->BRR = UART_DIV_SAMPLING16( - SystemCoreClock, 115200U, UART_PRESCALER_DIV1); - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000U) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/Makefile deleted file mode 100644 index 3030c0ac0..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/Makefile +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-C031C6, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-07 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-c031c6 \ - $(QPCPP)/3rd_party/nucleo-c031c6/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-c031c6 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32c0xx.c \ - startup_stm32c031xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQP_CONFIG \ - -DSTM32C031xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/README.txt deleted file mode 100644 index 85b07eb6b..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/README.txt +++ /dev/null @@ -1,92 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Selecting QXK Exception -======================= -The QXK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QXK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QXK_USE_IRQ_NUM and QXK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, (see the vector table), you can define the QXK IRQ -as follows: - -QXK_USE_IRQ_HANDLER=Reserved31_IRQHandler -QXK_USE_IRQ_NUM=31 - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32C0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-c031c6\gnu\startup_stm32c031xx.c - -The file startup_stm32c031xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It calls the assert_failed() function, which must be -defined in the application to customize it for the application-specific -error-handling policy. - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 12MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 4a3ba8516..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Linker script for for STM32C031C6, GNU-ARM linker -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* 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: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32C031C6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 32K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 12K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index b3712b658..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index fd591936d..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3364 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-c031c6 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\iar\startup_stm32c031xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c031xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\stm32c0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-c031c6\system_stm32c0xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.icf deleted file mode 100644 index db057b16c..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,165 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x08007FFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x20002FFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place at start of IRAM_region {block CSTACK }; /* <== Quantum Leaps */ - place in IRAM_region { readwrite, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread1.cpp deleted file mode 100644 index ab3561ed7..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread1.cpp +++ /dev/null @@ -1,162 +0,0 @@ -//$file${qxk::xthread1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${qxk::xthread1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${qxk::xthread1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared-TH::TH_sema} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_sema} ...................................................... -QP::QXSemaphore TH_sema; - -} // namespace APP -//$enddef${Shared-TH::TH_sema} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::TH_mutex} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_mutex} ..................................................... -QP::QXMutex TH_mutex; - -} // namespace APP -//$enddef${Shared-TH::TH_mutex} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${XThreads::XThread1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread1} ...................................................... -class XThread1 : public QP::QXThread { -private: - - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -} // namespace APP -//$enddecl${XThreads::XThread1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::XThread1_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::XThread1_ctor} ................................................ -void XThread1_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(XThread1) <= size); - - // run the constructor through placement new() - auto me = new(sto) XThread1(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared-TH::XThread1_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared-TH::TH_obj_dict} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::TH_obj_dict} .................................................. -#ifdef Q_SPY -void TH_obj_dict() { - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); -} -#endif // def Q_SPY - -} // namespace APP -//$enddef${Shared-TH::TH_obj_dict} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${XThreads::XThread1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread1} ...................................................... - -//${XThreads::XThread1::XThread1} ............................................ -XThread1::XThread1() - : QXThread(&run) -{} - -//${XThreads::XThread1::run} ................................................. -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP -//$enddef${XThreads::XThread1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread2.cpp deleted file mode 100644 index 158cbb1ef..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qxk/xthread2.cpp +++ /dev/null @@ -1,128 +0,0 @@ -//$file${qxk::xthread2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${qxk::xthread2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${qxk::xthread2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -//$declare${XThreads::XThread2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread2} ...................................................... -class XThread2 : public QP::QXThread { -private: - - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -} // namespace APP -//$enddecl${XThreads::XThread2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared-TH::XThread2_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared-TH::XThread2_ctor} ................................................ -void XThread2_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(XThread2) <= size); - - // run the constructor through placement new() - auto me = new(sto) XThread2(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared-TH::XThread2_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${XThreads::XThread2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${XThreads::XThread2} ...................................................... - -//${XThreads::XThread2::XThread2} ............................................ -XThread2::XThread2() - : QXThread(&run) -{} - -//${XThreads::XThread2::run} ................................................. -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP -//$enddef${XThreads::XThread2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/stm32-nucleo-c031c6.jpg b/examples/arm-cm/dpp_nucleo-c031c6_mpu/stm32-nucleo-c031c6.jpg deleted file mode 100644 index 6647e2d493863c9d4268596be8bc982a1ca49ccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43475 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 aZwdcScKknmYz}5d{lD5b|344^F8mKp|M*b= diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/table.cpp b/examples/arm-cm/dpp_nucleo-c031c6_mpu/table.cpp deleted file mode 100644 index 48c47eb38..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/table.cpp +++ /dev/null @@ -1,360 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_mpu.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbor of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbor of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Table_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::Table_ctor} ...................................................... -void Table_ctor( - std::uint8_t * const sto, - std::uint32_t const size, - void const * const mpu) -{ - Q_REQUIRE(sizeof(Table) <= size); - - // run the constructor through placemen new() - auto me = new(sto) Table(); - me->setThread(mpu); -} - -} // namespace APP -//$enddef${Shared::Table_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&Table::initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - #ifdef Q_SPY - Table *Table_inst = this; - QS_OBJ_DICTIONARY(Table_inst); - #endif - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-h743zi/README.md b/examples/arm-cm/dpp_nucleo-h743zi/README.md deleted file mode 100644 index d71007007..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 NUCLEO-H743ZI Q](../../../doxygen/images/bd_NUCLEO-H743ZI.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_nucleo-h743zi.html diff --git a/examples/arm-cm/dpp_nucleo-h743zi/bsp.hpp b/examples/arm-cm/dpp_nucleo-h743zi/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-h743zi/dpp.hpp b/examples/arm-cm/dpp_nucleo-h743zi/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-h743zi/dpp.qm b/examples/arm-cm/dpp_nucleo-h743zi/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/main.cpp b/examples/arm-cm/dpp_nucleo-h743zi/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-h743zi/philo.cpp b/examples/arm-cm/dpp_nucleo-h743zi/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/README.txt deleted file mode 100644 index 3646d25a3..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the ARM-KEIL IDE to build -a QP application. - - -ARM-KEIL Project File ---------------------- -The ARM-KEIL uVision project file provided with this example uses -relative paths to the QP framework location (includes, ports). These -relative paths must be modified when the project is moved to different -relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the STM32F746NG MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\stm32f7-discovery\arm\startup_stm32f746xx.s - -The file startup_stm32f746xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.sct deleted file mode 100644 index c3e0c01ed..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,26 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00200000 { ; load region size_region - ER_IROM1 0x08000000 0x00200000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00020000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } - RW_IRAM2 0x24000000 0x00080000 { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 072e649d9..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1140 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dbg-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O207 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - 0 - 0 - 75 - 1 -
134223008
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qk\../bsp.cpp\75 -
-
- - - 0 - 1 - QK_priv_ - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-h743zi - 1 - 0 - 0 - 0 - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - startup_stm32h743xx.s - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_msp.c - stm32h7xx_hal_msp.c - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_conf.h - stm32h7xx_hal_conf.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - stm32h7xx_nucleo_144.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - system_stm32h7xx.c - 0 - 0 - - - - - STM32H7xx_HAL_Driver - 1 - 0 - 0 - 0 - - 3 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - stm32h7xx_hal.c - 0 - 0 - - - 3 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - stm32h7xx_hal_uart.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - stm32h7xx_hal_cortex.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - stm32h7xx_hal_dma.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - stm32h7xx_hal_gpio.c - 0 - 0 - - - 3 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - stm32h7xx_hal_pwr.c - 0 - 0 - - - 3 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - stm32h7xx_hal_rcc.c - 0 - 0 - - - 3 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - stm32h7xx_hal_rcc_ex.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 6 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 2db7e3eff..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,2024 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dbg-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qk - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.cpp deleted file mode 100644 index d14582670..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/bsp.cpp +++ /dev/null @@ -1,516 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-H743ZI board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeH7 include files -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================ - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call QK_ISR_ENTRY/ -// QK_ISR_EXIT and they cannot post or publish events. - -void USART3_IRQHandler(void); // prototype -void USART3_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - SCB_EnableICache(); // Enable I-Cache - SCB_EnableDCache(); // Enable D-Cache - - // Configure Flash prefetch and Instr. cache through ART accelerator -#if (ART_ACCLERATOR_ENABLE != 0) - __HAL_FLASH_ART_ENABLE(); -#endif // ART_ACCLERATOR_ENABLE - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude - QS_GLB_FILTER(-QP::QS_SCHED_LOCK); // exclude - QS_GLB_FILTER(-QP::QS_SCHED_UNLOCK); // exclude -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some flating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SystemCoreClockUpdate(); - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - QF_INT_DISABLE(); - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - QF_INT_ENABLE(); - - // exercise scheduler lock from idle thread - QP::QSchedStatus lockStat = QP::QK::schedLock(1U); // 1U prio. ceiling - - // Some floating point code is to exercise the VFP... - double volatile x = 1.73205; - x = x * 1.73205; - - QP::QK::schedUnlock(lockStat); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = USART3; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // return failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile deleted file mode 100644 index 7512310ff..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/Makefile +++ /dev/null @@ -1,326 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQF_ON_CONTEXT_SW \ - -DSTM32H743xx \ - -DUSE_HAL_DRIVER \ - -DUSE_STM32H7XX_NUCLEO_144 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/README.txt deleted file mode 100644 index 20c2d487c..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4/M7 projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32F746NG MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\stm32f7-discovery\gnu\startup_stm32f4xx.c - -The file startup_stm32f4xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/dpp-qk.ld deleted file mode 100644 index 6814e7510..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32H743xx, GNU-ARM linker -* Last Updated for Version: 6.1.0 -* Date of the Last Update: 2018-01-30 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32F746NG */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/README.txt deleted file mode 100644 index b283d5281..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C++ framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script (.icf file, see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the STM32F746NG MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - -The file startup_stm32h743xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewd deleted file mode 100644 index 871e252a7..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp deleted file mode 100644 index 1811aa36a..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3391 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-h743zi - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - - - $PROJ_DIR$\..\..\stm32h7xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32h7xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32H7xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.icf deleted file mode 100644 index 8d3950ccd..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,84 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32h7xx.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_FLASH1_start__ = 0x08000000; -define symbol __ICFEDIT_region_FLASH1_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_FLASH2_start__ = 0x08100000; -define symbol __ICFEDIT_region_FLASH2_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_NORPSR_start__ = 0x0; -define symbol __ICFEDIT_region_NORPSR_end__ = 0x0; -define symbol __ICFEDIT_region_NAND_start__ = 0x0; -define symbol __ICFEDIT_region_NAND_end__ = 0x0; -define symbol __ICFEDIT_region_QSPI_start__ = 0x0; -define symbol __ICFEDIT_region_QSPI_end__ = 0x0; -define symbol __ICFEDIT_region_ITCMR_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMR_end__ = 0x0000FFFF; -define symbol __ICFEDIT_region_DTCMR_start__ = 0x20000000; -define symbol __ICFEDIT_region_DTCMR_end__ = 0x2001FFFF; -define symbol __ICFEDIT_region_AXISR_start__ = 0x24000000; -define symbol __ICFEDIT_region_AXISR_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_SRAM1_start__ = 0x30000000; -define symbol __ICFEDIT_region_SRAM1_end__ = 0x3001FFFF; -define symbol __ICFEDIT_region_SRAM2_start__ = 0x30020000; -define symbol __ICFEDIT_region_SRAM2_end__ = 0x3003FFFF; -define symbol __ICFEDIT_region_SRAM3_start__ = 0x30040000; -define symbol __ICFEDIT_region_SRAM3_end__ = 0x30047FFF; -define symbol __ICFEDIT_region_SRAM4_start__ = 0x38000000; -define symbol __ICFEDIT_region_SRAM4_end__ = 0x3800FFFF; -define symbol __ICFEDIT_region_BKPR_start__ = 0x38800000; -define symbol __ICFEDIT_region_BKPR_end__ = 0x38800FFF; -define symbol __ICFEDIT_region_SDR1_start__ = 0x0; -define symbol __ICFEDIT_region_SDR1_end__ = 0x0; -define symbol __ICFEDIT_region_SDR2_start__ = 0x0; -define symbol __ICFEDIT_region_SDR2_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region FLASH_region = mem:[from __ICFEDIT_region_FLASH1_start__ to __ICFEDIT_region_FLASH1_end__] - | mem:[from __ICFEDIT_region_FLASH2_start__ to __ICFEDIT_region_FLASH2_end__]; -define region NORPSR_region = mem:[from __ICFEDIT_region_NORPSR_start__ to __ICFEDIT_region_NORPSR_end__]; -define region NAND_region = mem:[from __ICFEDIT_region_NAND_start__ to __ICFEDIT_region_NAND_end__ ]; -define region QSPI_region = mem:[from __ICFEDIT_region_QSPI_start__ to __ICFEDIT_region_QSPI_end__ ]; -define region ITCMR_region = mem:[from __ICFEDIT_region_ITCMR_start__ to __ICFEDIT_region_ITCMR_end__ ]; -define region DTCMR_region = mem:[from __ICFEDIT_region_DTCMR_start__ to __ICFEDIT_region_DTCMR_end__ ]; -define region AXISR_region = mem:[from __ICFEDIT_region_AXISR_start__ to __ICFEDIT_region_AXISR_end__ ]; -define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] - | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ] - | mem:[from __ICFEDIT_region_SRAM3_start__ to __ICFEDIT_region_SRAM3_end__ ] - | mem:[from __ICFEDIT_region_SRAM4_start__ to __ICFEDIT_region_SRAM4_end__ ]; -define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; -define region SDR_region = mem:[from __ICFEDIT_region_SDR1_start__ to __ICFEDIT_region_SDR1_end__ ] - | mem:[from __ICFEDIT_region_SDR2_start__ to __ICFEDIT_region_SDR2_end__ ]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in FLASH_region { readonly }; -place in QSPI_region { readonly section application_specific_ro }; -//place in NORPSR_region { }; -//place in NAND_region { }; -place in ITCMR_region { section .textrw }; -place in DTCMR_region { section .dtcm_ram, block CSTACK, block PROC_STACK }; -place in SRAM_region { section .axi_sram, block HEAP }; -place in AXISR_region { readwrite }; -place in BKPR_region { section .backup_sram }; -place in SDR_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/README.txt deleted file mode 100644 index 3646d25a3..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the ARM-KEIL IDE to build -a QP application. - - -ARM-KEIL Project File ---------------------- -The ARM-KEIL uVision project file provided with this example uses -relative paths to the QP framework location (includes, ports). These -relative paths must be modified when the project is moved to different -relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the STM32F746NG MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\stm32f7-discovery\arm\startup_stm32f746xx.s - -The file startup_stm32f746xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.sct deleted file mode 100644 index c3e0c01ed..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,26 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Modified by Quantum Leaps: -; added STACK as the first section in RW_STACK -; ************************************************************* - -LR_IROM1 0x08000000 0x00200000 { ; load region size_region - ER_IROM1 0x08000000 0x00200000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00020000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } - RW_IRAM2 0x24000000 0x00080000 { - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 9ff26d675..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1116 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dbg-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O207 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-h743zi - 1 - 0 - 0 - 0 - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - startup_stm32h743xx.s - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_msp.c - stm32h7xx_hal_msp.c - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_conf.h - stm32h7xx_hal_conf.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - stm32h7xx_nucleo_144.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - system_stm32h7xx.c - 0 - 0 - - - - - STM32H7xx_HAL_Driver - 1 - 0 - 0 - 0 - - 3 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - stm32h7xx_hal.c - 0 - 0 - - - 3 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - stm32h7xx_hal_uart.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - stm32h7xx_hal_cortex.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - stm32h7xx_hal_dma.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - stm32h7xx_hal_gpio.c - 0 - 0 - - - 3 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - stm32h7xx_hal_pwr.c - 0 - 0 - - - 3 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - stm32h7xx_hal_rcc.c - 0 - 0 - - - 3 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - stm32h7xx_hal_rcc_ex.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 6 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 5243a30a6..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,2021 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.0.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dbg-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.0.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.0.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qv - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.cpp deleted file mode 100644 index efe1bf236..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/bsp.cpp +++ /dev/null @@ -1,506 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-H743ZI board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeH7 include files -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART3_IRQHandler(void); // prototype -void USART3_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - SCB_EnableICache(); // Enable I-Cache - SCB_EnableDCache(); // Enable D-Cache - - // Configure Flash prefetch and Instr. cache through ART accelerator -#if (ART_ACCLERATOR_ENABLE != 0) - __HAL_FLASH_ART_ENABLE(); -#endif // ART_ACCLERATOR_ENABLE - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some flating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - // NOTE: scheduler locking not needed in the QV kernel - - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SystemCoreClockUpdate(); - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - // toggle an LED on and then off (not enough LEDs, see NOTE02) - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - - // Some floating point code is to exercise the VFP... - QF_INT_ENABLE(); - double volatile x = 1.73205; - x = x * 1.73205; - QF_INT_DISABLE(); - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = USART3; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV::onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call the macros QV_ISR_ENTRY/QV_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE3: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile deleted file mode 100644 index db8f98249..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/Makefile +++ /dev/null @@ -1,328 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-10 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := \ - - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DSTM32H743xx \ - -DUSE_HAL_DRIVER \ - -DUSE_STM32H7XX_NUCLEO_144 \ - -DQF_ON_CONTEXT_SW - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/dpp-qv.ld deleted file mode 100644 index 6814e7510..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32H743xx, GNU-ARM linker -* Last Updated for Version: 6.1.0 -* Date of the Last Update: 2018-01-30 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32F746NG */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/README.txt deleted file mode 100644 index b283d5281..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C++ framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script (.icf file, see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the STM32F746NG MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - -The file startup_stm32h743xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd deleted file mode 100644 index ba7c2c02b..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp deleted file mode 100644 index 32cc39bc7..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3391 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-h743zi - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - - - $PROJ_DIR$\..\..\stm32h7xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32h7xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32H7xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.icf deleted file mode 100644 index 8d3950ccd..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,84 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32h7xx.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_FLASH1_start__ = 0x08000000; -define symbol __ICFEDIT_region_FLASH1_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_FLASH2_start__ = 0x08100000; -define symbol __ICFEDIT_region_FLASH2_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_NORPSR_start__ = 0x0; -define symbol __ICFEDIT_region_NORPSR_end__ = 0x0; -define symbol __ICFEDIT_region_NAND_start__ = 0x0; -define symbol __ICFEDIT_region_NAND_end__ = 0x0; -define symbol __ICFEDIT_region_QSPI_start__ = 0x0; -define symbol __ICFEDIT_region_QSPI_end__ = 0x0; -define symbol __ICFEDIT_region_ITCMR_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMR_end__ = 0x0000FFFF; -define symbol __ICFEDIT_region_DTCMR_start__ = 0x20000000; -define symbol __ICFEDIT_region_DTCMR_end__ = 0x2001FFFF; -define symbol __ICFEDIT_region_AXISR_start__ = 0x24000000; -define symbol __ICFEDIT_region_AXISR_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_SRAM1_start__ = 0x30000000; -define symbol __ICFEDIT_region_SRAM1_end__ = 0x3001FFFF; -define symbol __ICFEDIT_region_SRAM2_start__ = 0x30020000; -define symbol __ICFEDIT_region_SRAM2_end__ = 0x3003FFFF; -define symbol __ICFEDIT_region_SRAM3_start__ = 0x30040000; -define symbol __ICFEDIT_region_SRAM3_end__ = 0x30047FFF; -define symbol __ICFEDIT_region_SRAM4_start__ = 0x38000000; -define symbol __ICFEDIT_region_SRAM4_end__ = 0x3800FFFF; -define symbol __ICFEDIT_region_BKPR_start__ = 0x38800000; -define symbol __ICFEDIT_region_BKPR_end__ = 0x38800FFF; -define symbol __ICFEDIT_region_SDR1_start__ = 0x0; -define symbol __ICFEDIT_region_SDR1_end__ = 0x0; -define symbol __ICFEDIT_region_SDR2_start__ = 0x0; -define symbol __ICFEDIT_region_SDR2_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region FLASH_region = mem:[from __ICFEDIT_region_FLASH1_start__ to __ICFEDIT_region_FLASH1_end__] - | mem:[from __ICFEDIT_region_FLASH2_start__ to __ICFEDIT_region_FLASH2_end__]; -define region NORPSR_region = mem:[from __ICFEDIT_region_NORPSR_start__ to __ICFEDIT_region_NORPSR_end__]; -define region NAND_region = mem:[from __ICFEDIT_region_NAND_start__ to __ICFEDIT_region_NAND_end__ ]; -define region QSPI_region = mem:[from __ICFEDIT_region_QSPI_start__ to __ICFEDIT_region_QSPI_end__ ]; -define region ITCMR_region = mem:[from __ICFEDIT_region_ITCMR_start__ to __ICFEDIT_region_ITCMR_end__ ]; -define region DTCMR_region = mem:[from __ICFEDIT_region_DTCMR_start__ to __ICFEDIT_region_DTCMR_end__ ]; -define region AXISR_region = mem:[from __ICFEDIT_region_AXISR_start__ to __ICFEDIT_region_AXISR_end__ ]; -define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] - | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ] - | mem:[from __ICFEDIT_region_SRAM3_start__ to __ICFEDIT_region_SRAM3_end__ ] - | mem:[from __ICFEDIT_region_SRAM4_start__ to __ICFEDIT_region_SRAM4_end__ ]; -define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; -define region SDR_region = mem:[from __ICFEDIT_region_SDR1_start__ to __ICFEDIT_region_SDR1_end__ ] - | mem:[from __ICFEDIT_region_SDR2_start__ to __ICFEDIT_region_SDR2_end__ ]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in FLASH_region { readonly }; -place in QSPI_region { readonly section application_specific_ro }; -//place in NORPSR_region { }; -//place in NAND_region { }; -place in ITCMR_region { section .textrw }; -place in DTCMR_region { section .dtcm_ram, block CSTACK, block PROC_STACK }; -place in SRAM_region { section .axi_sram, block HEAP }; -place in AXISR_region { readwrite }; -place in BKPR_region { section .backup_sram }; -place in SDR_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp.py b/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp.py deleted file mode 100644 index 82567887c..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp1.py deleted file mode 100644 index 5b0fe6726..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-h743zi/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - 0 - 0 - 419 - 1 -
134223124
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\src\qxk\qxk.cpp - - \\dpp_qxk\../../../../../src/qxk/qxk.cpp\419 -
-
- - - 0 - 1 - QP::QActive::registry_ - - - 1 - 1 - QActive::registry_ - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dbg-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O207 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-h743zi - 1 - 0 - 0 - 0 - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - startup_stm32h743xx.s - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_msp.c - stm32h7xx_hal_msp.c - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\stm32h7xx_hal_conf.h - stm32h7xx_hal_conf.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - stm32h7xx_nucleo_144.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - system_stm32h7xx.c - 0 - 0 - - - - - STM32H7xx_HAL_Driver - 1 - 0 - 0 - 0 - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - stm32h7xx_hal.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - stm32h7xx_hal_uart.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - stm32h7xx_hal_cortex.c - 0 - 0 - - - 3 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - stm32h7xx_hal_dma.c - 0 - 0 - - - 3 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - stm32h7xx_hal_gpio.c - 0 - 0 - - - 3 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - stm32h7xx_hal_pwr.c - 0 - 0 - - - 3 - 20 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - stm32h7xx_hal_rcc.c - 0 - 0 - - - 3 - 21 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - stm32h7xx_hal_rcc_ex.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 4 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 4 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 6 - 41 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 42 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 43 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 619928baf..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,2099 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dbg-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_hal_msp.c - 1 - ..\..\stm32h7xx_hal_msp.c - - - stm32h7xx_hal_conf.h - 5 - ..\..\stm32h7xx_hal_conf.h - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qxk - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.cpp deleted file mode 100644 index c0b2b4ec2..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/bsp.cpp +++ /dev/null @@ -1,524 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-H743ZI board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeH7 include files -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================ - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART3_IRQHandler(void); // prototype -void USART3_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - SCB_EnableICache(); // Enable I-Cache - SCB_EnableDCache(); // Enable D-Cache - - // Configure Flash prefetch and Instr. cache through ART accelerator -#if (ART_ACCLERATOR_ENABLE != 0) - __HAL_FLASH_ART_ENABLE(); -#endif // ART_ACCLERATOR_ENABLE - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - QF_INT_DISABLE(); - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - double volatile x = 1.73205; - x = x * 1.73205; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = USART3; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // return failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QXK_ISR_ENTRY/QXK_ISR_ENTRY -// macros or any other QF services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile deleted file mode 100644 index 81ae52c22..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/Makefile +++ /dev/null @@ -1,331 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQF_ON_CONTEXT_SW \ - -DSTM32H743xx \ - -DUSE_HAL_DRIVER \ - -DUSE_STM32H7XX_NUCLEO_144 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/README.txt deleted file mode 100644 index f82b09a27..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4/M7 projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32H743xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-h743zi\gnu\startup_stm32h743xx.c - -The file startup_stm32h743xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 6814e7510..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32H743xx, GNU-ARM linker -* Last Updated for Version: 6.1.0 -* Date of the Last Update: 2018-01-30 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32F746NG */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/README.txt b/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/README.txt deleted file mode 100644 index b87dad23d..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP framework location (includes, source and port). These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script (.icf file, see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the STM32F743xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-h743zi\iar\startup_stm32h743xx.s - -The file startup_stm32h743xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 9c0d33895..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 3fc37ccd3..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3406 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-h743zi - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - - - $PROJ_DIR$\..\..\stm32h7xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32h7xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32H7xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 8d3950ccd..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,84 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32h7xx.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_FLASH1_start__ = 0x08000000; -define symbol __ICFEDIT_region_FLASH1_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_FLASH2_start__ = 0x08100000; -define symbol __ICFEDIT_region_FLASH2_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_NORPSR_start__ = 0x0; -define symbol __ICFEDIT_region_NORPSR_end__ = 0x0; -define symbol __ICFEDIT_region_NAND_start__ = 0x0; -define symbol __ICFEDIT_region_NAND_end__ = 0x0; -define symbol __ICFEDIT_region_QSPI_start__ = 0x0; -define symbol __ICFEDIT_region_QSPI_end__ = 0x0; -define symbol __ICFEDIT_region_ITCMR_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMR_end__ = 0x0000FFFF; -define symbol __ICFEDIT_region_DTCMR_start__ = 0x20000000; -define symbol __ICFEDIT_region_DTCMR_end__ = 0x2001FFFF; -define symbol __ICFEDIT_region_AXISR_start__ = 0x24000000; -define symbol __ICFEDIT_region_AXISR_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_SRAM1_start__ = 0x30000000; -define symbol __ICFEDIT_region_SRAM1_end__ = 0x3001FFFF; -define symbol __ICFEDIT_region_SRAM2_start__ = 0x30020000; -define symbol __ICFEDIT_region_SRAM2_end__ = 0x3003FFFF; -define symbol __ICFEDIT_region_SRAM3_start__ = 0x30040000; -define symbol __ICFEDIT_region_SRAM3_end__ = 0x30047FFF; -define symbol __ICFEDIT_region_SRAM4_start__ = 0x38000000; -define symbol __ICFEDIT_region_SRAM4_end__ = 0x3800FFFF; -define symbol __ICFEDIT_region_BKPR_start__ = 0x38800000; -define symbol __ICFEDIT_region_BKPR_end__ = 0x38800FFF; -define symbol __ICFEDIT_region_SDR1_start__ = 0x0; -define symbol __ICFEDIT_region_SDR1_end__ = 0x0; -define symbol __ICFEDIT_region_SDR2_start__ = 0x0; -define symbol __ICFEDIT_region_SDR2_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region FLASH_region = mem:[from __ICFEDIT_region_FLASH1_start__ to __ICFEDIT_region_FLASH1_end__] - | mem:[from __ICFEDIT_region_FLASH2_start__ to __ICFEDIT_region_FLASH2_end__]; -define region NORPSR_region = mem:[from __ICFEDIT_region_NORPSR_start__ to __ICFEDIT_region_NORPSR_end__]; -define region NAND_region = mem:[from __ICFEDIT_region_NAND_start__ to __ICFEDIT_region_NAND_end__ ]; -define region QSPI_region = mem:[from __ICFEDIT_region_QSPI_start__ to __ICFEDIT_region_QSPI_end__ ]; -define region ITCMR_region = mem:[from __ICFEDIT_region_ITCMR_start__ to __ICFEDIT_region_ITCMR_end__ ]; -define region DTCMR_region = mem:[from __ICFEDIT_region_DTCMR_start__ to __ICFEDIT_region_DTCMR_end__ ]; -define region AXISR_region = mem:[from __ICFEDIT_region_AXISR_start__ to __ICFEDIT_region_AXISR_end__ ]; -define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] - | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ] - | mem:[from __ICFEDIT_region_SRAM3_start__ to __ICFEDIT_region_SRAM3_end__ ] - | mem:[from __ICFEDIT_region_SRAM4_start__ to __ICFEDIT_region_SRAM4_end__ ]; -define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; -define region SDR_region = mem:[from __ICFEDIT_region_SDR1_start__ to __ICFEDIT_region_SDR1_end__ ] - | mem:[from __ICFEDIT_region_SDR2_start__ to __ICFEDIT_region_SDR2_end__ ]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in FLASH_region { readonly }; -place in QSPI_region { readonly section application_specific_ro }; -//place in NORPSR_region { }; -//place in NAND_region { }; -place in ITCMR_region { section .textrw }; -place in DTCMR_region { section .dtcm_ram, block CSTACK, block PROC_STACK }; -place in SRAM_region { section .axi_sram, block HEAP }; -place in AXISR_region { readwrite }; -place in BKPR_region { section .backup_sram }; -place in SDR_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h b/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h deleted file mode 100644 index efcce29cf..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h +++ /dev/null @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file Demonstrations/Inc/stm32h7xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32h7xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32H7xx_HAL_CONF_H -#define __STM32H7xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -/* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_COMP_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -#define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -#define HAL_EXTI_MODULE_ENABLED -/* #define HAL_FDCAN_MODULE_ENABLED */ -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -/* #define HAL_HASH_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_HRTIM_MODULE_ENABLED */ -/* #define HAL_HSEM_MODULE_ENABLED */ -/* #define HAL_I2C_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_JPEG_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_MDIOS_MODULE_ENABLED */ -/* #define HAL_MDMA_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_OPAMP_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -#define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_RAMECC_MODULE_ENABLED */ -#define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SWPMI_MODULE_ENABLED */ -/* #define HAL_TIM_MODULE_ENABLED */ -#define HAL_UART_MODULE_ENABLED -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal oscillator (CSI) default value. - * This value is the default CSI value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HIS) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HIS is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ -#endif /* LSE_VALUE */ - - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0F) /*!< tick interrupt priority */ -#define USE_RTOS 0 -/* #define USE_SD_TRANSCEIVER 1U */ /*!< use uSD Transceiver */ - -/* ########################### Ethernet Configuration ######################### */ -#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ -#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ - -#define ETH_MAC_ADDR0 ((uint8_t)0x02) -#define ETH_MAC_ADDR1 ((uint8_t)0x00) -#define ETH_MAC_ADDR2 ((uint8_t)0x00) -#define ETH_MAC_ADDR3 ((uint8_t)0x00) -#define ETH_MAC_ADDR4 ((uint8_t)0x00) -#define ETH_MAC_ADDR5 ((uint8_t)0x00) - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1 */ - - -/* ################## SPI peripheral configuration ########################## */ -/** - * @brief Used to activate CRC feature inside HAL SPI Driver - * Activated (1U): CRC code is compiled within HAL SPI driver - * Deactivated (0U): CRC code excluded from HAL SPI driver - */ - -#define USE_SPI_CRC 1U - - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32h7xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32h7xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32h7xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_MDMA_MODULE_ENABLED - #include "stm32h7xx_hal_mdma.h" -#endif /* HAL_MDMA_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32h7xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32h7xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32h7xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32h7xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32h7xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32h7xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32h7xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32h7xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED - #include "stm32h7xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32h7xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED - #include "stm32h7xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32h7xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32h7xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32h7xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32h7xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED - #include "stm32h7xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_HSEM_MODULE_ENABLED - #include "stm32h7xx_hal_hsem.h" -#endif /* HAL_HSEM_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32h7xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32h7xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32h7xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32h7xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32h7xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_JPEG_MODULE_ENABLED - #include "stm32h7xx_hal_jpeg.h" -#endif /* HAL_JPEG_MODULE_ENABLED */ - -#ifdef HAL_MDIOS_MODULE_ENABLED - #include "stm32h7xx_hal_mdios.h" -#endif /* HAL_MDIOS_MODULE_ENABLED */ - - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32h7xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32h7xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED -#include "stm32h7xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32h7xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32h7xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32h7xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RAMECC_MODULE_ENABLED - #include "stm32h7xx_hal_ramecc.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32h7xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32h7xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32h7xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32h7xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32h7xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32h7xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_SWPMI_MODULE_ENABLED - #include "stm32h7xx_hal_swpmi.h" -#endif /* HAL_SWPMI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32h7xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32h7xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32h7xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32h7xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32h7xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32h7xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32h7xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32h7xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32h7xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32H7xx_HAL_CONF_H */ - - diff --git a/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c b/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c deleted file mode 100644 index 4b5cb97c0..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c +++ /dev/null @@ -1,194 +0,0 @@ -/** - ****************************************************************************** - * @file UART/UART_WakeUpFromStopUsingFIFO/Src/stm32h7xx_hal_msp.c - * @author MCD Application Team - * @version V1.2.0 - * @date 29-December-2017 - * @brief HAL MSP module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2017 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -//#include "main.h" -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" - -/** @addtogroup STM32H7xx_HAL_Examples - * @{ - */ - -/** @defgroup HAL_MSP - * @brief HAL MSP module. - * @{ - */ - -/* User can use this section to tailor USARTx/UARTx instance used and associated - resources */ -/* Definition for USARTx clock resources */ -#define USARTx USART3 -#define USARTx_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE() -#define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() - -#define USARTx_FORCE_RESET() __HAL_RCC_USART3_FORCE_RESET() -#define USARTx_RELEASE_RESET() __HAL_RCC_USART3_RELEASE_RESET() - -/* Definition for USARTx Pins */ -#define USARTx_TX_PIN GPIO_PIN_8 -#define USARTx_TX_GPIO_PORT GPIOD -#define USARTx_TX_AF GPIO_AF7_USART3 -#define USARTx_RX_PIN GPIO_PIN_9 -#define USARTx_RX_GPIO_PORT GPIOD -#define USARTx_RX_AF GPIO_AF7_USART3 - -/** @addtogroup STM32F7xx_HAL_Examples - * @{ - */ - -/** @defgroup UART_TwoBoards_ComPolling - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_MSP_Private_Functions - * @{ - */ - -/* NOTE: -* STM32Cube's initialization calls the weakly defined HAL_InitTick(), which -* by default configures and starts the Systick interrupt. This is TOO EARLY, -* because the system os NOT ready yet to handle interrupts. -* To avoid problems, a dummy definition for HAL_InitTick() is provided -* in the file stm32l5xx_hal_msp.c. The SystTick is configured and -* started later in QF_onStartup(). -*/ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - (void)TickPriority; /* unused parameter */ - return HAL_OK; -} - -/** - * @brief UART MSP Initialization - * This function configures the hardware resources used in this example: - * - Peripheral's clock enable - * - Peripheral's GPIO Configuration - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspInit(UART_HandleTypeDef *huart) { - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable GPIO TX/RX clock */ - USARTx_TX_GPIO_CLK_ENABLE(); - USARTx_RX_GPIO_CLK_ENABLE(); - - /* Enable USARTx clock */ - USARTx_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* UART TX GPIO pin configuration */ - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = USARTx_TX_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = USARTx_TX_AF; - HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct); - - /* UART RX GPIO pin configuration */ - GPIO_InitStruct.Pin = USARTx_RX_PIN; - GPIO_InitStruct.Alternate = USARTx_RX_AF; - HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct); - - /*##-3- Configure the NVIC for UART ########################################*/ - /* NVIC for USART */ - /* this is delayed till QF_onStartup() */ -} - -/** - * @brief UART MSP De-Initialization - * This function frees the hardware resources used in this example: - * - Disable the Peripheral's clock - * - Revert GPIO and NVIC configuration to their default state - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) -{ - /*##-1- Reset peripherals ##################################################*/ - USARTx_FORCE_RESET(); - USARTx_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure USART Tx as alternate function */ - HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN); - /* Configure USART Rx as alternate function */ - HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN); - - /*##-3- Disable the NVIC for UART ##########################################*/ - /* this is delayed till QF_onCleanup() */ -} - -/* dummy legacy callbacks for STM32CubeH7 */ -void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-cm/dpp_nucleo-h743zi/table.cpp b/examples/arm-cm/dpp_nucleo-h743zi/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_nucleo-h743zi/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l053r8/README.md b/examples/arm-cm/dpp_nucleo-l053r8/README.md deleted file mode 100644 index 538e55669..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 EFM32-SLSTK3401A](../../../doxygen/images/bd_NUCLEO-L053R8.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_nucleo-l053r8.html diff --git a/examples/arm-cm/dpp_nucleo-l053r8/bsp.hpp b/examples/arm-cm/dpp_nucleo-l053r8/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l053r8/dpp.hpp b/examples/arm-cm/dpp_nucleo-l053r8/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l053r8/dpp.qm b/examples/arm-cm/dpp_nucleo-l053r8/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/main.cpp b/examples/arm-cm/dpp_nucleo-l053r8/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-l053r8/philo.cpp b/examples/arm-cm/dpp_nucleo-l053r8/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/README.txt deleted file mode 100644 index 8c2596235..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32L053_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - - -Startup Code -============ -The startup code for the STM32L1xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - -The file startup_stm32l053xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l0xx.c.pll provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 3ca4e5463..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1009 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - 0 - 0 - 340 - 1 -
134219556
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qk\../bsp.cpp\340 -
- - 1 - 0 - 81 - 1 -
134222088
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\src\qf\qf_actq.cpp - - \\dpp_qk\../../../../../src/qf/qf_actq.cpp\81 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 5 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 10 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index a991d1778..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1763 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - QK_USE_IRQ_HANDLER=LCD_IRQHandler QK_USE_IRQ_NUM=30 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6070000::V6.7::.\ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.cpp deleted file mode 100644 index bed0079e5..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/bsp.cpp +++ /dev/null @@ -1,537 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L053R8 board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD2_PIN); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QK -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->IOPENR |= (1U << 0U); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRR = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED2 on -} -//............................................................................ -void ledOff() { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED2 off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 4U << 4U*USART2_RX_PIN) | ( 4U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile deleted file mode 100644 index 170a9ea5c..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32 NUCLEO-L053R8, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx \ - -DQF_ON_CONTEXT_SW - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/README.txt deleted file mode 100644 index 0745590d5..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/README.txt +++ /dev/null @@ -1,94 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -The TRUEStudio Project -====================== -The project file for the Atollic TRUEStudio-STM32 is provided and can be -directly imported into the TRUEStudio Eclipse-based IDE. All three build -configurations are supported (Debug, Release and Spy). - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32L0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\gnu\startup_stm32l053xx.c - -The file startup_stm32l053xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l0xx.c.pll provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/dpp-qk.ld deleted file mode 100644 index 9a3462e07..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L053R8, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L053R8 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/README.txt deleted file mode 100644 index f3e4e9295..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/README.txt +++ /dev/null @@ -1,72 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script dpp-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Selecting QK Exception -====================== -The QK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QK_USE_IRQ_NUM and QK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, for the STM32L053 MCU, you might dedicate the IRQ -"CRYPTO_IRQHandler" (see the vector table), with IRQ number 25, -as follows: - -QK_USE_IRQ_HANDLER=LCD_IRQHandler -QK_USE_IRQ_NUM=30 - - -Startup Code -============ -The startup code for the STM32L053 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\iar\startup_stm32l053xx.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd deleted file mode 100644 index 6a0e9ea28..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp deleted file mode 100644 index b5a5df3bf..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3607 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l053r8 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\iar\startup_stm32l053xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - Debug - - ICCARM - - 37 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.icf deleted file mode 100644 index 1acff018c..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,37 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x080807FF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/README.txt deleted file mode 100644 index a24e5193e..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32L0xx_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - - -Startup Code -============ -The startup code for the STM32L1xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - -The file startup_stm32l053xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l0xx.c.pll provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index dc487a632..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,976 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF480 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -I0 -O8431 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-l053r8 - 0 - 0 - 0 - 0 - - 2 - 5 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 0 - 0 - 0 - 0 - - 3 - 10 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 11 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 0 - 0 - 0 - 0 - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 0 - 0 - 0 - 0 - - 5 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index f56122fb4..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1766 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6070000::V6.7::.\ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP-MPU - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - -MPU - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.cpp deleted file mode 100644 index 6ebd4b491..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/bsp.cpp +++ /dev/null @@ -1,524 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L053R8 board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD2_PIN); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions in QV -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->IOPENR |= (1U << 0U); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRR = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // NOTE: no need to lock the scheduler for the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED2 on -} -//............................................................................ -void ledOff() { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED2 off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 4U << 4U*USART2_RX_PIN) | ( 4U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000U) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile deleted file mode 100644 index cf6928169..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32 NUCLEO-L053R8, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/README.txt deleted file mode 100644 index 0745590d5..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/README.txt +++ /dev/null @@ -1,94 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -The TRUEStudio Project -====================== -The project file for the Atollic TRUEStudio-STM32 is provided and can be -directly imported into the TRUEStudio Eclipse-based IDE. All three build -configurations are supported (Debug, Release and Spy). - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32L0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\gnu\startup_stm32l053xx.c - -The file startup_stm32l053xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l0xx.c.pll provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/dpp-qv.ld deleted file mode 100644 index 9a3462e07..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L053R8, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L053R8 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd deleted file mode 100644 index f99677ce3..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp deleted file mode 100644 index d818788ea..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3355 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l053r8 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\iar\startup_stm32l053xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.icf deleted file mode 100644 index 1acff018c..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,37 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x080807FF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp.py b/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp.py deleted file mode 100644 index 82567887c..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp1.py deleted file mode 100644 index 5b0fe6726..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-l053r8/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-l053r8/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-l053r8/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-l053r8/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Source Code - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 7 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 8 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 6042e12ec..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1868 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - QXK_USE_IRQ_HANDLER=WWDG_IRQHandler,QXK_USE_IRQ_NUM=0 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - -fno-exceptions - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Source Code - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.cpp deleted file mode 100644 index a0f56c860..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/bsp.cpp +++ /dev/null @@ -1,547 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L053R8 board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI0_1_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << LD2_PIN); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QXK -void EXTI0_1_IRQHandler(void); // prototype -void EXTI0_1_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI0_1_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->ISR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->RDR; - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->IOPENR |= (1U << 0U); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->IOPENR |= (1U << 2U); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI0_1_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRR = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - } - else { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED2 on -} -//............................................................................ -void ledOff() { - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED2 off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI0_1_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_1_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRR = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRR = (1U << (LD2_PIN + 16U)); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->ISR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->TDR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->IOPENR |= ( 1U << 0U); // Enable GPIOA clock for USART pins - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 4U << 4U*USART2_RX_PIN) | ( 4U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U | // no flow control - (1U << 12U); // disable overrun detection (OVRDIS) - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 0U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->ISR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->TDR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any QF services. These ISRs -// are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// Usually, one of the LEDs is used to visualize the idle loop activity. -// However, the board has not enough LEDs (only one, actually), so this -// feature is disabled. -// diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile deleted file mode 100644 index 2fa4a581a..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/Makefile +++ /dev/null @@ -1,315 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-L053R8, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx \ - -DQF_ON_CONTEXT_SW - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/README.txt deleted file mode 100644 index 0745590d5..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/README.txt +++ /dev/null @@ -1,94 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the Atollic TRUEStudio-ST32 with the provided project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -The TRUEStudio Project -====================== -The project file for the Atollic TRUEStudio-STM32 is provided and can be -directly imported into the TRUEStudio Eclipse-based IDE. All three build -configurations are supported (Debug, Release and Spy). - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32L0xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\gnu\startup_stm32l053xx.c - -The file startup_stm32l053xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l0xx.c.pll provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 24a370248..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L053R8, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* http://www.state-machine.com -* email:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L053R8 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/README.txt b/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/README.txt deleted file mode 100644 index 2dc8f82ed..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/README.txt +++ /dev/null @@ -1,72 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script dpp-qxk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Selecting QXK Exception -======================= -The QXK kernel needs a dedicated exception to return to the thread -context after preemption. The default is to use the NMI exception -for that purpose. However, in case NMI is needed for some other -purpose, the QXK port allows you to select a any, otherwise unused -IRQ for that purpose. To choose a given IRQ, you need to define -the macros QXK_USE_IRQ_NUM and QXK_USE_IRQ_HANDLER. These macros can -be provided on the command-line to the compiler. - -For example, for the STM32L053 MCU, you might dedicate the IRQ -"CRYPTO_IRQHandler" (see the vector table), with IRQ number 25, -as follows: - -QXK_USE_IRQ_HANDLER=LCD_IRQHandler -QXK_USE_IRQ_NUM=30 - - -Startup Code -============ -The startup code for the STM32L053 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l053r8\iar\startup_stm32l053xx.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 6a0e9ea28..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index b32fce3b3..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3619 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-l053r8 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\iar\startup_stm32l053xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - Debug - - ICCARM - - 37 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 9c0592222..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,37 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 512; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x080807FF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l053r8/table.cpp b/examples/arm-cm/dpp_nucleo-l053r8/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_nucleo-l053r8/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l152re/README.md b/examples/arm-cm/dpp_nucleo-l152re/README.md deleted file mode 100644 index aeacdf4eb..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 NUCLEO-L552ZE Q](../../../doxygen/images/bd_NUCLEO-L152RE.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_nucleo-l152re.html diff --git a/examples/arm-cm/dpp_nucleo-l152re/bsp.hpp b/examples/arm-cm/dpp_nucleo-l152re/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l152re/dpp.hpp b/examples/arm-cm/dpp_nucleo-l152re/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l152re/dpp.qm b/examples/arm-cm/dpp_nucleo-l152re/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/main.cpp b/examples/arm-cm/dpp_nucleo-l152re/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-l152re/philo.cpp b/examples/arm-cm/dpp_nucleo-l152re/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/README.txt b/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/README.txt deleted file mode 100644 index 18159edae..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32L152_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - - -Startup Code -============ -The startup code for the STM32L1xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - -The file startup_stm32l1xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l1xx_pll.c provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.sct deleted file mode 100644 index fbadbbfab..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,22 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00080000 { ; load region size_region - ER_IROM1 0x08000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00014000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index f4059d341..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1051 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - 0 - 0 - 214 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - 0 - 0 - 214 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - -
-
- - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - 0 - 0 - 214 - 1 -
134222098
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qk\../bsp.c\214 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - -
-
- - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-l152re - 0 - 0 - 0 - 0 - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - README.txt - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - stm32l1xx.h - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - system_stm32l1xx.c - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - system_stm32l1xx.h - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - startup_stm32l1xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 875518c2a..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1793 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - HSE_VALUE=4000000 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l152re/qk/bsp.cpp deleted file mode 100644 index 62c31018c..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/bsp.cpp +++ /dev/null @@ -1,539 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L152RE board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l1xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI9_5_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QK -void EXTI9_5_IRQHandler(void); // prototype -void EXTI9_5_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI9_5_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->AHBENR |= (1U << 0); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->AHBENR |= (1U << 2); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI9_5_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI9_5_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI9_5_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -constexpr std::uint32_t USART2_TX_PIN {2U}; -constexpr std::uint32_t USART2_RX_PIN {3U}; - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->AHBENR |= ( 1U << 0U); // Enable GPIOA clock - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 7U << 4U*USART2_RX_PIN) | ( 7U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U; // no flow control - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 13U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile deleted file mode 100644 index 02e119ad6..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/Makefile +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32 NUCLEO-L152RE, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l152re \ - $(QPCPP)/3rd_party/nucleo-l152re/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l152re - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l1xx.c \ - startup_stm32l1xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/dpp-qk.ld deleted file mode 100644 index b3a6ec97a..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L152RET6, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L152RET6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewd deleted file mode 100644 index 63befcfee..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewp deleted file mode 100644 index cf0b17fa0..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3344 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l152re - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\iar\startup_stm32l1xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.icf deleted file mode 100644 index e6a294d31..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,36 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20013FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x08083FFF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/README.txt b/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/README.txt deleted file mode 100644 index 18159edae..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::STM32L152_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - - -Startup Code -============ -The startup code for the STM32L1xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - -The file startup_stm32l1xx.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - - -Adjusting the CPU Clock Speed -============================= -The current setting is to run at 2MHz from the MSI (internal oscillator), -but the CPU clock speed can be modified by editing the file -system_stm32l1xx.c. The file system_stm32l1xx_pll.c provides an example -of clock setting using the PLL driven from the MSE. - -*** -NOTE: -The NUCLEO boards have a wide range of possible clock selections, depending -on the solder bridge configuration. Please see Chapter 5.7 "OSC clock" in -the STM32 NUCLEO Boards User Manual (ST document UM1724) for more information. -*** - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.sct deleted file mode 100644 index fbadbbfab..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,22 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00080000 { ; load region size_region - ER_IROM1 0x08000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00014000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 3d8512c52..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1000 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=1457,708,1907,1265,1)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8398 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-l152re - 0 - 0 - 0 - 0 - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - README.txt - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - stm32l1xx.h - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - system_stm32l1xx.c - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - system_stm32l1xx.h - 0 - 0 - - - 2 - 11 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - startup_stm32l1xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 78a3df175..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1793 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-l152re/qv/bsp.cpp deleted file mode 100644 index a24ad8310..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/bsp.cpp +++ /dev/null @@ -1,526 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L152RE board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l1xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI9_5_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -// interrupt handler for testing preemptions in QV -void EXTI9_5_IRQHandler(void); // prototype -void EXTI9_5_IRQHandler(void) { - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI9_5_IRQHandler); - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->AHBENR |= (1U << 0); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->AHBENR |= (1U << 2); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI9_5_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // NOTE: no need to lock the scheduler for the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI9_5_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI9_5_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED[n] off - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -constexpr std::uint32_t USART2_TX_PIN {2U}; -constexpr std::uint32_t USART2_RX_PIN {3U}; - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->AHBENR |= ( 1U << 0U); // Enable GPIOA clock - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 7U << 4U*USART2_RX_PIN) | ( 7U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U; // no flow control - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 13U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile deleted file mode 100644 index d2baf19ae..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/Makefile +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32 NUCLEO-L152RE, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l152re \ - $(QPCPP)/3rd_party/nucleo-l152re/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l152re - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l1xx.c \ - startup_stm32l1xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/dpp-qv.ld deleted file mode 100644 index b3a6ec97a..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L152RET6, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L152RET6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewd deleted file mode 100644 index 232e04a26..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewp deleted file mode 100644 index b3f5c098c..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3344 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l152re - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\iar\startup_stm32l1xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.icf deleted file mode 100644 index e6a294d31..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,36 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20013FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x08083FFF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/dpp.py b/examples/arm-cm/dpp_nucleo-l152re/qview/dpp.py deleted file mode 100644 index 82567887c..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-l152re/qview/dpp1.py deleted file mode 100644 index 5b0fe6726..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-l152re/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-l152re/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-l152re/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-l152re/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-l152re/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=1724,109,2174,666,1)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8398 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - 0 - 0 - 214 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - -
-
- - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -I0 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$CMSIS\Flash\STM32L1xx_512.FLM)) - - - - - 0 - 0 - 214 - 1 -
134222098
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.c\214 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - -
-
- - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - nucleo-l152re - 0 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - README.txt - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - stm32l1xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - system_stm32l1xx.c - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - system_stm32l1xx.h - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - startup_stm32l1xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 0dd9637f2..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1868 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - HSE_VALUE=4000000 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L152RE - STMicroelectronics - Keil.STM32L1xx_DFP.1.4.1 - http://www.keil.com/pack/ - IROM(0x08000000,0x80000) IRAM(0x20000000,0x14000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L1xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L152RE$Flash\STM32L1xx_512.FLM)) - 0 - $$Device:STM32L152RE$Device\Include\STM32L1xx.h - - - - - - - - - - $$Device:STM32L152RE$SVD\STM32L1xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM3 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x14000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\nucleo-l152re - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - nucleo-l152re - - - README.txt - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\README.txt - - - stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - system_stm32l1xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - system_stm32l1xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - startup_stm32l1xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l152re\arm\startup_stm32l1xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.cpp deleted file mode 100644 index 2d68a5545..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/bsp.cpp +++ /dev/null @@ -1,553 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L152RE board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32l1xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LD2_PIN {5U}; -constexpr std::uint32_t B1_PIN {13U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_EXTI9_5_IRQHandler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOC->IDR; // read Port C with Button B1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -// interrupt handler for testing preemptions in QXK -void EXTI9_5_IRQHandler(void); // prototype -void EXTI9_5_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing.. - static QP::QEvt const testEvt(APP::TEST_SIG); - APP::AO_Table->POST(&testEvt, &l_EXTI9_5_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & (1U << 5U)) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // enable GPIOA clock port for the LED LD2 - RCC->AHBENR |= (1U << 0); - - // configure LED (PA.5) pin as push-pull output, no pull-up, pull-down - GPIOA->MODER &= ~((3U << 2U*LD2_PIN)); - GPIOA->MODER |= ((1U << 2U*LD2_PIN)); - GPIOA->OTYPER &= ~((1U << LD2_PIN)); - GPIOA->OSPEEDR &= ~((3U << 2U*LD2_PIN)); - GPIOA->OSPEEDR |= ((1U << 2U*LD2_PIN)); - GPIOA->PUPDR &= ~((3U << 2U*LD2_PIN)); - - // enable GPIOC clock port for the Button B1 - RCC->AHBENR |= (1U << 2); - - // configure Button (PC.13) pins as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR &= ~(3U << 2U*B1_PIN); - GPIOC->OSPEEDR |= (1U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_EXTI9_5_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on - } - else { - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOA->BSRRL = (1U << LD2_PIN); // turn LED on -} -//............................................................................ -void ledOff() { - GPIOA->BSRRH = (1U << LD2_PIN); // turn LED off -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(EXTI9_5_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI9_5_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // UART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle an LED on and then off (not enough LEDs, see NOTE02) - //QF_INT_DISABLE(); - //GPIOA->BSRRL = (1U << LD2_PIN); // turn LED[n] on - //GPIOA->BSRRH = (1U << LD2_PIN); // turn LED[n] off - //QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & (1U << 7U)) != 0U) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -constexpr std::uint32_t USART2_TX_PIN {2U}; -constexpr std::uint32_t USART2_RX_PIN {3U}; - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC->AHBENR |= ( 1U << 0U); // Enable GPIOA clock - RCC->APB1ENR |= ( 1U << 17U); // Enable USART#2 clock - - // Configure PA3 to USART2_RX, PA2 to USART2_TX - GPIOA->AFR[0] &= ~((15U << 4U*USART2_RX_PIN) | (15U << 4U*USART2_TX_PIN)); - GPIOA->AFR[0] |= (( 7U << 4U*USART2_RX_PIN) | ( 7U << 4U*USART2_TX_PIN)); - GPIOA->MODER &= ~(( 3U << 2U*USART2_RX_PIN) | ( 3U << 2U*USART2_TX_PIN)); - GPIOA->MODER |= (( 2U << 2U*USART2_RX_PIN) | ( 2U << 2U*USART2_TX_PIN)); - - USART2->BRR = __USART_BRR(SystemCoreClock, 115200U); // baud rate - USART2->CR3 = 0x0000U; // no flow control - USART2->CR2 = 0x0000U; // 1 stop bit - USART2->CR1 = ((1U << 2U) | // enable RX - (1U << 3U) | // enable TX - (1U << 5U) | // enable RX interrupt - (0U << 12U) | // 8 data bits - (0U << 28U) | // 8 data bits - (1U << 13U)); // enable USART - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & 0x00010000) == 0) { // COUNT no set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & (1U << 7U)) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile deleted file mode 100644 index b5fa3214e..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/Makefile +++ /dev/null @@ -1,314 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32 NUCLEO-L152RE, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l152re \ - $(QPCPP)/3rd_party/nucleo-l152re/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l152re - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l1xx.c \ - startup_stm32l1xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index b3a6ec97a..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for STM32L152RET6, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L152RET6 */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 63befcfee..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 20fdd51ff..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3359 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-l152re - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\iar\startup_stm32l1xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\stm32l1xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\nucleo-l152re\system_stm32l1xx.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf deleted file mode 100644 index e6a294d31..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,36 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20013FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; - -define symbol __region_EEPROM_start__ = 0x08080000; -define symbol __region_EEPROM_end__ = 0x08083FFF; -define region EEPROM_region = mem:[from __region_EEPROM_start__ to __region_EEPROM_end__]; - -place in EEPROM_region { section .eeprom }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l152re/table.cpp b/examples/arm-cm/dpp_nucleo-l152re/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_nucleo-l152re/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/README.md b/examples/arm-cm/dpp_nucleo-l552ze/README.md deleted file mode 100644 index b1b9c9f9f..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32 NUCLEO-L552ZE Q](../../../doxygen/images/bd_NUCLEO-L552ZE.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_nucleo-l552ze.html diff --git a/examples/arm-cm/dpp_nucleo-l552ze/bsp.hpp b/examples/arm-cm/dpp_nucleo-l552ze/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/dpp.hpp b/examples/arm-cm/dpp_nucleo-l552ze/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/dpp.qm b/examples/arm-cm/dpp_nucleo-l552ze/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/main.cpp b/examples/arm-cm/dpp_nucleo-l552ze/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_nucleo-l552ze/philo.cpp b/examples/arm-cm/dpp_nucleo-l552ze/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.sct deleted file mode 100644 index a2c35683b..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,16 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; ************************************************************* - -LR_IROM1 0x08000000 0x00080000 { ; load region size_region - ER_IROM1 0x08000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00030000 { ; RW data - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index e089f08de..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1162 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - 0 - 141 - 1 -
134218908
- 0 - 0 - 0 - 0 - 0 - 1 - C:\qp-dev\qpcpp\examples\arm-cm\dpp_nucleo-l552ze\qk\bsp.c - - \\dpp_qk\../bsp.c\141 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 5 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - STM32L5xx_HAL_Driver - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - stm32l5xx_hal.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - stm32l5xx_hal_cortex.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - stm32l5xx_hal_rcc.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - stm32l5xx_hal_rcc_ex.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - stm32l5xx_hal_gpio.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - stm32l5xx_hal_icache.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - stm32l5xx_hal_pwr.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - stm32l5xx_hal_pwr_ex.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - stm32l5xx_hal_exti.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - stm32l5xx_hal_uart.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - stm32l5xx_hal_dma.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - stm32l5xx_hal_uart_ex.c - 0 - 0 - - - - - nucleo-l552ze - 1 - 0 - 0 - 0 - - 3 - 19 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_nucleo_conf.h - stm32l5xx_nucleo_conf.h - 0 - 0 - - - 3 - 20 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - startup_stm32l552xx.s - 0 - 0 - - - 3 - 21 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - system_stm32l5xx.h - 0 - 0 - - - 3 - 22 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_conf.h - stm32l5xx_hal_conf.h - 0 - 0 - - - 3 - 23 - 1 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_msp.c - stm32l5xx_hal_msp.c - 0 - 0 - - - 3 - 24 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - system_stm32l5xx.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - stm32l5xx_nucleo.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 41 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 42 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 43 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index 2f07ff427..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,2099 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qk - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.cpp deleted file mode 100644 index e377c73dd..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/bsp.cpp +++ /dev/null @@ -1,546 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L552ZE board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeL5 include files -#include "stm32l5xx_hal.h" -#include "stm32l5xx_nucleo.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================ - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void LPUART1_IRQHandler(void); // prototype -void LPUART1_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - - // Reset of all peripherals, Initializes the Flash interface - // - // NOTE: - // STM32Cube's HAL_Init() calls the weakly defined HAL_InitTick(), which - // by default configures and starts the Systick interrupt. This is - // TOO EARLY, because the system os NOT ready yet to handle interrupts. - // To avoid problems, a dummy definition for HAL_InitTick() is provided - // in the file stm32l5xx_hal_msp.c. The SystTick is configured and - // started later in QF_onStartup(). - // - HAL_Init(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // Configure the system clock - RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; - RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; - - // Configure the main internal regulator output voltage - HAL_StatusTypeDef err = - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0); - Q_ASSERT(err == HAL_OK); - - // Initializes the RCC Oscillators according to the specified parameters - // in the RCC_OscInitTypeDef structure. - // - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 55; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; - RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; - RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; - err = HAL_RCC_OscConfig(&RCC_OscInitStruct); - Q_ASSERT(err == HAL_OK); - - // Initializes the CPU, AHB and APB buses clocks - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - err = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_Enable(); - Q_ASSERT(err == HAL_OK); - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some flating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE2 - QF_INT_DISABLE(); - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - double volatile x = 1.73205; - x = x * 1.73205; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = LPUART1; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.FifoMode = UART_FIFOMODE_DISABLE; - l_uartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - l_uartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile deleted file mode 100644 index 243c4f83e..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/Makefile +++ /dev/null @@ -1,333 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEOL552ZE, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeL5/nucleo-l552ze/gnu \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Source/Templates \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32l552xx.c \ - stm32l5xx_hal.c \ - stm32l5xx_hal_cortex.c \ - stm32l5xx_hal_rcc.c \ - stm32l5xx_hal_rcc_ex.c \ - stm32l5xx_hal_gpio.c \ - stm32l5xx_hal_icache.c \ - stm32l5xx_hal_pwr.c \ - stm32l5xx_hal_pwr_ex.c \ - stm32l5xx_hal_exti.c \ - stm32l5xx_hal_dma.c \ - stm32l5xx_hal_uart.c \ - stm32l5xx_hal_uart_ex.c \ - stm32l5xx_hal_msp.c \ - stm32l5xx_nucleo.c \ - system_stm32l5xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQF_ON_CONTEXT_SW \ - -DUSE_HAL_DRIVER \ - -DSTM32L552xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m33 -ARM_FPU := -mfpu=fpv5-sp-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/dpp-qk.ld deleted file mode 100644 index c77442d66..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32L552ZETxQ, GNU-ARM linker -* Last Updated for Version: 7.0.0 -* Date of the Last Update: 2022-02-26 -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L552ZETxQ */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewd deleted file mode 100644 index e9a32e919..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp deleted file mode 100644 index e4d317855..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3406 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l552ze - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\iar\startup_stm32l552xx.s - - - $PROJ_DIR$\..\..\stm32l5xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32l5xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - $PROJ_DIR$\..\..\stm32l5xx_nucleo_conf.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32L5xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.icf deleted file mode 100644 index ae4268dfd..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,164 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x2002FFFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x20030000; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x2003FFFF; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.sct deleted file mode 100644 index a2c35683b..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,16 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; ************************************************************* - -LR_IROM1 0x08000000 0x00080000 { ; load region size_region - ER_IROM1 0x08000000 0x00080000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00030000 { ; RW data - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index ff7c62bc2..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1162 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - 0 - 141 - 1 -
134218908
- 0 - 0 - 0 - 0 - 0 - 1 - C:\qp-dev\qpcpp\examples\arm-cm\dpp_nucleo-l552ze\qv\bsp.c - - \\dpp_qv\../bsp.c\141 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - STM32L5xx_HAL_Driver - 1 - 0 - 0 - 0 - - 2 - 7 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - stm32l5xx_hal.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - stm32l5xx_hal_cortex.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - stm32l5xx_hal_rcc.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - stm32l5xx_hal_rcc_ex.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - stm32l5xx_hal_gpio.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - stm32l5xx_hal_icache.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - stm32l5xx_hal_pwr.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - stm32l5xx_hal_pwr_ex.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - stm32l5xx_hal_exti.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - stm32l5xx_hal_uart.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - stm32l5xx_hal_dma.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - stm32l5xx_hal_uart_ex.c - 0 - 0 - - - - - nucleo-l552ze - 1 - 0 - 0 - 0 - - 3 - 19 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_nucleo_conf.h - stm32l5xx_nucleo_conf.h - 0 - 0 - - - 3 - 20 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - startup_stm32l552xx.s - 0 - 0 - - - 3 - 21 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - system_stm32l5xx.h - 0 - 0 - - - 3 - 22 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_conf.h - stm32l5xx_hal_conf.h - 0 - 0 - - - 3 - 23 - 1 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_msp.c - stm32l5xx_hal_msp.c - 0 - 0 - - - 3 - 24 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - system_stm32l5xx.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - stm32l5xx_nucleo.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 41 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 42 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 43 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index 981346905..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,2096 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qv/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qv.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qv/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qv.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qv/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qv.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qv - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.cpp b/examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.cpp deleted file mode 100644 index f31c135a8..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/bsp.cpp +++ /dev/null @@ -1,530 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L552ZE board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeL5 include files -#include "stm32l5xx_hal.h" -#include "stm32l5xx_nucleo.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs cannot post or publish events. - -void LPUART1_IRQHandler(void); // prototype -void LPUART1_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - - // Reset of all peripherals, Initializes the Flash interface - // - // NOTE: - // STM32Cube's HAL_Init() calls the weakly defined HAL_InitTick(), which - // by default configures and starts the Systick interrupt. This is - // TOO EARLY, because the system os NOT ready yet to handle interrupts. - // To avoid problems, a dummy definition for HAL_InitTick() is provided - // in the file stm32l5xx_hal_msp.c. The SystTick is configured and - // started later in QF_onStartup(). - // - HAL_Init(); - - // Configure the system clock - RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; - RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; - - // Configure the main internal regulator output voltage - HAL_StatusTypeDef err = - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0); - Q_ASSERT(err == HAL_OK); - - // Initializes the RCC Oscillators according to the specified parameters - // in the RCC_OscInitTypeDef structure. - // - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 55; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; - RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; - RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; - err = HAL_RCC_OscConfig(&RCC_OscInitStruct); - Q_ASSERT(err == HAL_OK); - - // Initializes the CPU, AHB and APB buses clocks - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - err = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_Enable(); - Q_ASSERT(err == HAL_OK); - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some flating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - // NOTE: scheduler locking not needed in the QV kernel - - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - // toggle an LED on and then off (not enough LEDs, see NOTE02) - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = LPUART1; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.FifoMode = UART_FIFOMODE_DISABLE; - l_uartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - l_uartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV::onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QV_ISR_ENTRY/QV_ISR_ENTRY -// macros or any other QF services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call the macros QV_ISR_ENTRY/QV_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile deleted file mode 100644 index 9559c7262..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/Makefile +++ /dev/null @@ -1,335 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEOL552ZE, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-10 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeL5/nucleo-l552ze/gnu \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Source/Templates \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32l552xx.c \ - stm32l5xx_hal.c \ - stm32l5xx_hal_cortex.c \ - stm32l5xx_hal_rcc.c \ - stm32l5xx_hal_rcc_ex.c \ - stm32l5xx_hal_gpio.c \ - stm32l5xx_hal_icache.c \ - stm32l5xx_hal_pwr.c \ - stm32l5xx_hal_pwr_ex.c \ - stm32l5xx_hal_exti.c \ - stm32l5xx_hal_dma.c \ - stm32l5xx_hal_uart.c \ - stm32l5xx_hal_uart_ex.c \ - stm32l5xx_hal_msp.c \ - stm32l5xx_nucleo.c \ - system_stm32l5xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := \ - - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQF_ON_CONTEXT_SW \ - -DUSE_HAL_DRIVER \ - -DSTM32L552xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m33 -ARM_FPU := -mfpu=fpv5-sp-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/dpp-qv.ld deleted file mode 100644 index c77442d66..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32L552ZETxQ, GNU-ARM linker -* Last Updated for Version: 7.0.0 -* Date of the Last Update: 2022-02-26 -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L552ZETxQ */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewd deleted file mode 100644 index e9a32e919..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp deleted file mode 100644 index ed8da4f68..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3406 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - nucleo-l552ze - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\iar\startup_stm32l552xx.s - - - $PROJ_DIR$\..\..\stm32l5xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32l5xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - $PROJ_DIR$\..\..\stm32l5xx_nucleo_conf.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32L5xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.icf deleted file mode 100644 index ae4268dfd..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,164 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x2002FFFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x20030000; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x2003FFFF; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp.py b/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp.py deleted file mode 100644 index 958057cc5..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp1.py b/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp1.py deleted file mode 100644 index acd540a22..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table_inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo_inst[0]", - "Philo_inst[1]", - "Philo_inst[2]", - "Philo_inst[3]", - "Philo_inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo_thinking", - "Philo_hungry", - "Philo_eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_DWN.gif b/examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_UP.gif b/examples/arm-cm/dpp_nucleo-l552ze/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-l552ze/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-l552ze/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-l552ze/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - 0 - 141 - 1 -
134218908
- 0 - 0 - 0 - 0 - 0 - 1 - C:\qp-dev\qpcpp\examples\arm-cm\dpp_nucleo-l552ze\qxk\bsp.c - - \\dpp_qxk\../bsp.c\141 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 5 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 110000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - DLGTARM - (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - UL2V8M - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) - - - 0 - ST-LINKIII-KEIL_SWO - -U066FFF353638425043092845 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BE12477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L5x_512_0800.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L552ZETxQ$CMSIS\Flash\STM32L5x_512_0800.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - STM32L5xx_HAL_Driver - 1 - 0 - 0 - 0 - - 2 - 9 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - stm32l5xx_hal.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - stm32l5xx_hal_cortex.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - stm32l5xx_hal_rcc.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - stm32l5xx_hal_rcc_ex.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - stm32l5xx_hal_gpio.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - stm32l5xx_hal_icache.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - stm32l5xx_hal_pwr.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - stm32l5xx_hal_pwr_ex.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - stm32l5xx_hal_exti.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - stm32l5xx_hal_uart.c - 0 - 0 - - - 2 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - stm32l5xx_hal_dma.c - 0 - 0 - - - 2 - 20 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - stm32l5xx_hal_uart_ex.c - 0 - 0 - - - - - nucleo-l552ze - 1 - 0 - 0 - 0 - - 3 - 21 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_nucleo_conf.h - stm32l5xx_nucleo_conf.h - 0 - 0 - - - 3 - 22 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - startup_stm32l552xx.s - 0 - 0 - - - 3 - 23 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - system_stm32l5xx.h - 0 - 0 - - - 3 - 24 - 5 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_conf.h - stm32l5xx_hal_conf.h - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\stm32l5xx_hal_msp.c - stm32l5xx_hal_msp.c - 0 - 0 - - - 3 - 26 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - system_stm32l5xx.c - 0 - 0 - - - 3 - 27 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - stm32l5xx_nucleo.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 4 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 4 - 41 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 4 - 42 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 4 - 43 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 44 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 45 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 46 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 47 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 48 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 049963902..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,2174 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qxk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qxk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 4 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qxk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qxk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L552ZETxQ - STMicroelectronics - Keil.STM32L5xx_DFP.1.4.0 - http://www.keil.com/pack/ - IRAM(0x20000000-0x2003FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) FPU3(SFPU) CPUTYPE("Cortex-M33") ELITTLE TZ - - - - 0 - - - - - - - - - - - $$Device:STM32L552ZETxQ$Drivers\CMSIS\SVD\STM32L5x2.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 0 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM33 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M33" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x8000000 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,USE_HAL_DRIVER,STM32L552xx - - ../..;../../../../../include;../../../../../src;../../../../../ports/arm-cm/qxk/armclang;../../../../../3rd_party/CMSIS/Include;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc;../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy;../../../../../3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include;../../../../../3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - - - - dpp-qxk.sct - - - - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\..\bsp.hpp - - - dpp.hpp - 5 - ..\..\dpp.hpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - STM32L5xx_HAL_Driver - - - stm32l5xx_hal.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c - - - stm32l5xx_hal_cortex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c - - - stm32l5xx_hal_rcc.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c - - - stm32l5xx_hal_rcc_ex.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c - - - stm32l5xx_hal_gpio.c - 1 - ../../../../../3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c - - - stm32l5xx_hal_icache.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - stm32l5xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - stm32l5xx_hal_pwr_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - stm32l5xx_hal_exti.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - stm32l5xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - stm32l5xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - stm32l5xx_hal_uart_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - - - nucleo-l552ze - - - stm32l5xx_nucleo_conf.h - 5 - ..\..\stm32l5xx_nucleo_conf.h - - - startup_stm32l552xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\arm\startup_stm32l552xx.s - - - system_stm32l5xx.h - 5 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Include\system_stm32l5xx.h - - - stm32l5xx_hal_conf.h - 5 - ..\..\stm32l5xx_hal_conf.h - - - stm32l5xx_hal_msp.c - 1 - ..\..\stm32l5xx_hal_msp.c - - - system_stm32l5xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - stm32l5xx_nucleo.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - dpp-qxk - 1 - - - - -
diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.cpp b/examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.cpp deleted file mode 100644 index d75a33fc8..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/bsp.cpp +++ /dev/null @@ -1,560 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-L552ZE board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeL5 include files -#include "stm32l5xx_hal.h" -#include "stm32l5xx_nucleo.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light all LEDs - BSP_LED_On(LED1); - BSP_LED_On(LED2); - BSP_LED_On(LED3); - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================ - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_USER); // read User button - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced User button state changed? - if (current != 0U) { // is User button depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void LPUART1_IRQHandler(void); // prototype -void LPUART1_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0) { - std::uint8_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - - // Reset of all peripherals, Initializes the Flash interface - // - // NOTE: - // STM32Cube's HAL_Init() calls the weakly defined HAL_InitTick(), which - // by default configures and starts the Systick interrupt. This is - // TOO EARLY, because the system os NOT ready yet to handle interrupts. - // To avoid problems, a dummy definition for HAL_InitTick() is provided - // in the file stm32l5xx_hal_msp.c. The SystTick is configured and - // started later in QF_onStartup(). - // - HAL_Init(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // Configure the system clock - RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; - RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; - - // Configure the main internal regulator output voltage - HAL_StatusTypeDef err = - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0); - Q_ASSERT(err == HAL_OK); - - // Initializes the RCC Oscillators according to the specified parameters - // in the RCC_OscInitTypeDef structure. - // - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 55; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; - RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; - RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; - err = HAL_RCC_OscConfig(&RCC_OscInitStruct); - Q_ASSERT(err == HAL_OK); - - // Initializes the CPU, AHB and APB buses clocks - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - err = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY); - Q_ASSERT(err == HAL_OK); - - err = HAL_ICACHE_Enable(); - Q_ASSERT(err == HAL_OK); - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // Configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); // seed the random number generator - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some flating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED1); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED1); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - // toggle the User LED on and then off, see NOTE2 - QF_INT_DISABLE(); - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - double volatile x = 1.73205; - x = x * 1.73205; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = LPUART1; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.FifoMode = UART_FIFOMODE_DISABLE; - l_uartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - l_uartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - l_uartHandle.Instance->TDR = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QXK_ISR_ENTRY/QXK_ISR_ENTRY -// macros or any other QF services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile b/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile deleted file mode 100644 index eda830dea..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/Makefile +++ /dev/null @@ -1,338 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEOL552ZE, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeL5/nucleo-l552ze/gnu \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Source/Templates \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/STM32L5xx_HAL_Driver/Inc/Legacy \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/CMSIS/Device/ST/STM32L5xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeL5/Drivers/BSP/STM32L5xx_Nucleo - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32l552xx.c \ - stm32l5xx_hal.c \ - stm32l5xx_hal_cortex.c \ - stm32l5xx_hal_rcc.c \ - stm32l5xx_hal_rcc_ex.c \ - stm32l5xx_hal_gpio.c \ - stm32l5xx_hal_icache.c \ - stm32l5xx_hal_pwr.c \ - stm32l5xx_hal_pwr_ex.c \ - stm32l5xx_hal_exti.c \ - stm32l5xx_hal_dma.c \ - stm32l5xx_hal_uart.c \ - stm32l5xx_hal_uart_ex.c \ - stm32l5xx_hal_msp.c \ - stm32l5xx_nucleo.c \ - system_stm32l5xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := \ - -DQF_ON_CONTEXT_SW \ - -DUSE_HAL_DRIVER \ - -DSTM32L552xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m33 -ARM_FPU := -mfpu=fpv5-sp-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index c77442d66..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32L552ZETxQ, GNU-ARM linker -* Last Updated for Version: 7.0.0 -* Date of the Last Update: 2022-02-26 -* -* Q u a n t u m L e a P s -* ------------------------ -* Modern Embedded Software -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* -* -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32L552ZETxQ */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index e9a32e919..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 94c183922..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3421 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - nucleo-l552ze - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\nucleo-l552ze\iar\startup_stm32l552xx.s - - - $PROJ_DIR$\..\..\stm32l5xx_hal_conf.h - - - $PROJ_DIR$\..\..\stm32l5xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\BSP\STM32L5xx_Nucleo\stm32l5xx_nucleo.c - - - $PROJ_DIR$\..\..\stm32l5xx_nucleo_conf.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\CMSIS\Device\ST\STM32L5xx\Source\Templates\system_stm32l5xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32L5xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_exti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_icache.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_pwr_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeL5\Drivers\STM32L5xx_HAL_Driver\Src\stm32l5xx_hal_uart_ex.c - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.icf deleted file mode 100644 index ae4268dfd..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,164 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; -define symbol __ICFEDIT_region_IROM1_end__ = 0x0807FFFF; -define symbol __ICFEDIT_region_IROM2_start__ = 0x0; -define symbol __ICFEDIT_region_IROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM1_start__ = 0x0; -define symbol __ICFEDIT_region_EROM1_end__ = 0x0; -define symbol __ICFEDIT_region_EROM2_start__ = 0x0; -define symbol __ICFEDIT_region_EROM2_end__ = 0x0; -define symbol __ICFEDIT_region_EROM3_start__ = 0x0; -define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; -define symbol __ICFEDIT_region_IRAM1_end__ = 0x2002FFFF; -define symbol __ICFEDIT_region_IRAM2_start__ = 0x20030000; -define symbol __ICFEDIT_region_IRAM2_end__ = 0x2003FFFF; -define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; -define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define symbol use_IROM1 = (__ICFEDIT_region_IROM1_start__ != 0x0 || __ICFEDIT_region_IROM1_end__ != 0x0); -define symbol use_IROM2 = (__ICFEDIT_region_IROM2_start__ != 0x0 || __ICFEDIT_region_IROM2_end__ != 0x0); -define symbol use_EROM1 = (__ICFEDIT_region_EROM1_start__ != 0x0 || __ICFEDIT_region_EROM1_end__ != 0x0); -define symbol use_EROM2 = (__ICFEDIT_region_EROM2_start__ != 0x0 || __ICFEDIT_region_EROM2_end__ != 0x0); -define symbol use_EROM3 = (__ICFEDIT_region_EROM3_start__ != 0x0 || __ICFEDIT_region_EROM3_end__ != 0x0); -define symbol use_IRAM1 = (__ICFEDIT_region_IRAM1_start__ != 0x0 || __ICFEDIT_region_IRAM1_end__ != 0x0); -define symbol use_IRAM2 = (__ICFEDIT_region_IRAM2_start__ != 0x0 || __ICFEDIT_region_IRAM2_end__ != 0x0); -define symbol use_ERAM1 = (__ICFEDIT_region_ERAM1_start__ != 0x0 || __ICFEDIT_region_ERAM1_end__ != 0x0); -define symbol use_ERAM2 = (__ICFEDIT_region_ERAM2_start__ != 0x0 || __ICFEDIT_region_ERAM2_end__ != 0x0); -define symbol use_ERAM3 = (__ICFEDIT_region_ERAM3_start__ != 0x0 || __ICFEDIT_region_ERAM3_end__ != 0x0); - -if (use_IROM1) -{ - define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; -} -else -{ - define region IROM1_region = []; -} - -if (use_IROM2) -{ - define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; -} -else -{ - define region IROM2_region = []; -} -define region IROM_region = IROM1_region | IROM2_region; - -if (use_EROM1) -{ - define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; -} -else -{ - define region EROM1_region = []; -} -if (use_EROM2) -{ - define region EROM2_region = mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__]; -} -else -{ - define region EROM2_region = []; -} -if (use_EROM3) -{ - define region EROM3_region = mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; -} -else -{ - define region EROM3_region = []; -} -define region EROM_region = EROM1_region | EROM2_region | EROM3_region; - -if (use_IRAM1) -{ - define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; -} -else -{ - define region IRAM1_region = []; -} -if (use_IRAM2) -{ - define region IRAM2_region = mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; -} -else -{ - define region IRAM2_region = []; -} -define region IRAM_region = IRAM1_region | IRAM2_region; - -if (use_ERAM1) -{ - define region ERAM1_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__]; -} -else -{ - define region ERAM1_region = []; -} -if (use_ERAM2) -{ - define region ERAM2_region = mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__]; -} -else -{ - define region ERAM2_region = []; -} -if (use_ERAM3) -{ - define region ERAM3_region = mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; -} -else -{ - define region ERAM3_region = []; -} -define region ERAM_region = ERAM1_region | ERAM2_region | ERAM3_region; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -if (!isempty(IROM_region)) -{ - place in IROM_region { readonly }; -} - -if (!isempty(EROM_region)) -{ - place in EROM_region { readonly section application_specific_ro }; -} - -if (!isempty(IRAM_region)) -{ - define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; - define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; - define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; -} - -if (!isempty(ERAM_region)) -{ - place in ERAM_region { readwrite section application_specific_rw }; -} \ No newline at end of file diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread1.cpp b/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread2.cpp b/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_nucleo-l552ze/stm32-nucleo-l552ze.jpg b/examples/arm-cm/dpp_nucleo-l552ze/stm32-nucleo-l552ze.jpg deleted file mode 100644 index 9c7f096cd29940e568908080bad3feab4d303457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39333 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 diff --git a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_conf.h b/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_conf.h deleted file mode 100644 index 9b9e9baff..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_conf.h +++ /dev/null @@ -1,435 +0,0 @@ -/** - ****************************************************************************** - * @file stm32l5xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2019 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32L5xx_HAL_CONF_H -#define STM32L5xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -/*#define HAL_ADC_MODULE_ENABLED */ -/*#define HAL_COMP_MODULE_ENABLED */ -/*#define HAL_CRC_MODULE_ENABLED */ -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_DFSDM_MODULE_ENABLED */ -/*#define HAL_FDCAN_MODULE_ENABLED */ -/*#define HAL_GTZC_MODULE_ENABLED */ -/*#define HAL_HASH_MODULE_ENABLED */ -/*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ -/*#define HAL_LPTIM_MODULE_ENABLED */ -/*#define HAL_MMC_MODULE_ENABLED */ -/*#define HAL_NAND_MODULE_ENABLED */ -/*#define HAL_NOR_MODULE_ENABLED */ -/*#define HAL_OPAMP_MODULE_ENABLED */ -/*#define HAL_OSPI_MODULE_ENABLED */ -/*#define HAL_OTFDEC_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ -/*#define HAL_PKA_MODULE_ENABLED */ -/*#define HAL_RCC_MODULE_ENABLED */ -/*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ -/*#define HAL_SAI_MODULE_ENABLED */ -/*#define HAL_SD_MODULE_ENABLED */ -/*#define HAL_SMARTCARD_MODULE_ENABLED */ -/*#define HAL_SMBUS_MODULE_ENABLED */ -/*#define HAL_SPI_MODULE_ENABLED */ -/*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ -/*#define HAL_TSC_MODULE_ENABLED */ -#define HAL_UART_MODULE_ENABLED -/*#define HAL_USART_MODULE_ENABLED */ -/*#define HAL_WWDG_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_ICACHE_MODULE_ENABLED - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 16000000UL /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100UL /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal Multiple Speed oscillator (MSI) default value. - * This value is the default MSI range value after Reset. - */ -#if !defined (MSI_VALUE) - #define MSI_VALUE 4000000UL /*!< Value of the Internal oscillator in Hz*/ -#endif /* MSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE 16000000UL /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined (HSI48_VALUE) - #define HSI48_VALUE 48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000UL /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768UL /*!< Value of the External oscillator in Hz*/ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000UL /*!< Time out for LSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for SAI1 peripheral - * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source - * frequency. - */ -#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) - #define EXTERNAL_SAI1_CLOCK_VALUE 48000UL /*!< Value of the SAI1 External clock source in Hz*/ -#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ - -/** - * @brief External clock source for SAI2 peripheral - * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source - * frequency. - */ -#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) - #define EXTERNAL_SAI2_CLOCK_VALUE 48000UL /*!< Value of the SAI2 External clock source in Hz*/ -#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ - -#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY 0UL /*!< tick interrupt priority */ -#define USE_RTOS 0U - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Register callback feature configuration ############### */ -/** - * @brief Set below the peripheral configuration to "1U" to add the support - * of HAL callback registration/unregistration feature for the HAL - * driver(s). This allows user application to provide specific callback - * functions thanks to HAL_PPP_RegisterCallback() rather than overwriting - * the default weak callback functions (see each stm32l5xx_hal_ppp.h file - * for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef - * for each PPP peripheral). - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_PKA_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_TSC_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ - -#define USE_SPI_CRC 0U - -/* ################## CRYP peripheral configuration ########################## */ - -#define USE_HAL_CRYP_SUSPEND_RESUME 1U - -/* ################## SDMMC peripheral configuration ######################### */ - -#define USE_SD_TRANSCEIVER 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32l5xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32l5xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32l5xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32l5xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32l5xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32l5xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED - #include "stm32l5xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32l5xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32l5xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32l5xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32l5xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED - #include "stm32l5xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32l5xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_GTZC_MODULE_ENABLED - #include "stm32l5xx_hal_gtzc.h" -#endif /* HAL_GTZC_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32l5xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32l5xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_ICACHE_MODULE_ENABLED - #include "stm32l5xx_hal_icache.h" -#endif /* HAL_ICACHE_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32l5xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32l5xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32l5xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32l5xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32l5xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32l5xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED - #include "stm32l5xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_OSPI_MODULE_ENABLED - #include "stm32l5xx_hal_ospi.h" -#endif /* HAL_OSPI_MODULE_ENABLED */ - -#ifdef HAL_OTFDEC_MODULE_ENABLED - #include "stm32l5xx_hal_otfdec.h" -#endif /* HAL_OTFDEC_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32l5xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_PKA_MODULE_ENABLED - #include "stm32l5xx_hal_pka.h" -#endif /* HAL_PKA_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32l5xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32l5xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32l5xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32l5xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32l5xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32l5xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32l5xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32l5xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32l5xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32l5xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_TSC_MODULE_ENABLED - #include "stm32l5xx_hal_tsc.h" -#endif /* HAL_TSC_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32l5xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32l5xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32l5xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t *file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32L5xx_HAL_CONF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_msp.c b/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_msp.c deleted file mode 100644 index 4242ae8ca..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_hal_msp.c +++ /dev/null @@ -1,182 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file UART/UART_WakeUpFromStopUsingFIFO/Src/stm32l5xx_hal_msp.c - * @author MCD Application Team - * @brief HAL MSP module. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -//#include "main.h" -#include "stm32l5xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* NOTE: -* STM32Cube's initialization calls the weakly defined HAL_InitTick(), which -* by default configures and starts the Systick interrupt. This is TOO EARLY, -* because the system os NOT ready yet to handle interrupts. -* To avoid problems, a dummy definition for HAL_InitTick() is provided -* in the file stm32l5xx_hal_msp.c. The SystTick is configured and -* started later in QF_onStartup(). -*/ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - (void)TickPriority; /* unused parameter */ - return HAL_OK; -} - - -/** -* @brief UART MSP Initialization -* This function configures the hardware resources used in this example -* @param huart: UART handle pointer -* @retval None -*/ -void HAL_UART_MspInit(UART_HandleTypeDef* huart) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - if(huart->Instance==LPUART1) - { - /* USER CODE BEGIN LPUART1_MspInit 0 */ - - /* USER CODE END LPUART1_MspInit 0 */ - /** Initializes the peripherals clock - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; - PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - //assert_failed("HAL_UART_MspInit", 10); - } - - /* Peripheral clock enable */ - __HAL_RCC_LPUART1_CLK_ENABLE(); - - __HAL_RCC_GPIOG_CLK_ENABLE(); - HAL_PWREx_EnableVddIO2(); - /**LPUART1 GPIO Configuration - PG7 ------> LPUART1_TX - PG8 ------> LPUART1_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - /* USER CODE BEGIN LPUART1_MspInit 1 */ - - /* USER CODE END LPUART1_MspInit 1 */ - } - -} - -/** -* @brief UART MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param huart: UART handle pointer -* @retval None -*/ -void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) -{ - if(huart->Instance==LPUART1) - { - /* USER CODE BEGIN LPUART1_MspDeInit 0 */ - - /* USER CODE END LPUART1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_LPUART1_CLK_DISABLE(); - - /**LPUART1 GPIO Configuration - PG7 ------> LPUART1_TX - PG8 ------> LPUART1_RX - */ - HAL_GPIO_DeInit(GPIOG, GPIO_PIN_7|GPIO_PIN_8); - - /* LPUART1 interrupt DeInit */ - HAL_NVIC_DisableIRQ(LPUART1_IRQn); - /* USER CODE BEGIN LPUART1_MspDeInit 1 */ - - /* USER CODE END LPUART1_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_nucleo_conf.h b/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_nucleo_conf.h deleted file mode 100644 index a3c5b9a10..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/stm32l5xx_nucleo_conf.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - ****************************************************************************** - * @file stm32l5xx_nucleo_conf.h - * @author MCD Application Team - * @brief STM32L5XX nucleo board configuration file. - * This file should be copied to the application folder and renamed - * to stm32l5xx_nucleo_conf.h . - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2019 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32L5XX_NUCLEO_CONF_H -#define STM32L5XX_NUCLEO_CONF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32l5xx_hal.h" - -/* Usage of nucleo board */ -#define USE_NUCLEO_144 1U - -/* Usage of COM feature */ -#define USE_BSP_COM_FEATURE 0U -#define USE_COM_LOG 0U - -/* Button user interrupt priority */ -#define BSP_BUTTON_USER_IT_PRIORITY 0x07UL /* Default is lowest priority level */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32L5XX_NUCLEO_CONF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/arm-cm/dpp_nucleo-l552ze/table.cpp b/examples/arm-cm/dpp_nucleo-l552ze/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_nucleo-l552ze/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_stm32f4-discovery/README.md b/examples/arm-cm/dpp_stm32f4-discovery/README.md deleted file mode 100644 index 2e5b7ffd4..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![STM32F4-Discovery](../../../doxygen/images/bd_STM32F4-Disco.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_dpp_stm32f4-discovery.html diff --git a/examples/arm-cm/dpp_stm32f4-discovery/bsp.hpp b/examples/arm-cm/dpp_stm32f4-discovery/bsp.hpp deleted file mode 100644 index 18073d7f2..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/bsp.hpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cm/dpp_stm32f4-discovery/dpp.hpp b/examples/arm-cm/dpp_stm32f4-discovery/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cm/dpp_stm32f4-discovery/dpp.qm b/examples/arm-cm/dpp_stm32f4-discovery/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/main.cpp b/examples/arm-cm/dpp_stm32f4-discovery/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/dpp_stm32f4-discovery/philo.cpp b/examples/arm-cm/dpp_stm32f4-discovery/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/README.txt deleted file mode 100644 index 1f7cfb27d..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.sct b/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.sct deleted file mode 100644 index eb3902ad0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.sct +++ /dev/null @@ -1,22 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00100000 { ; load region size_region - ER_IROM1 0x08000000 0x00100000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00020000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvoptx b/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvoptx deleted file mode 100644 index 0df217a6a..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvoptx +++ /dev/null @@ -1,1024 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U57FF6B064965525557292487 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - stm32f4-discovery - 1 - 0 - 0 - 0 - - 2 - 5 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - startup_stm32f4xx.s - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - README.txt - 0 - 0 - - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - stm32f4xx.h - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - system_stm32f4xx.c - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - system_stm32f4xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - stm32f4xx_rcc.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - stm32f4xx_usart.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - stm32f4xx_gpio.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvprojx b/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvprojx deleted file mode 100644 index c6143eb09..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/armclang/dpp-qk.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qk.bin .\dbg\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060528::V5.06 update 5 (build 528)::ARMCC - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qk.bin .\rel\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qk.bin .\spy\dpp-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/bsp.cpp b/examples/arm-cm/dpp_stm32f4-discovery/qk/bsp.cpp deleted file mode 100644 index 7ea953f83..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/bsp.cpp +++ /dev/null @@ -1,569 +0,0 @@ -//============================================================================ -// Product: DPP example, STM32F4-Discovery board, QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32f4xx.h" // CMSIS-compliant header file for the MCU used -#include "stm32f4xx_exti.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_usart.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -GPIO_TypeDef * const LED_GPIO_PORT = GPIOD; -constexpr std::uint32_t LED_GPIO_CLK {RCC_AHB1Periph_GPIOD}; - -constexpr std::uint32_t LED4_PIN {GPIO_Pin_12}; -constexpr std::uint32_t LED3_PIN {GPIO_Pin_13}; -constexpr std::uint32_t LED5_PIN {GPIO_Pin_14}; -constexpr std::uint32_t LED6_PIN {GPIO_Pin_15}; - -#define BTN_GPIO_PORT GPIOA -constexpr std::uint32_t BTN_GPIO_CLK {RCC_AHB1Periph_GPIOA}; -constexpr std::uint32_t BTN_B1 {GPIO_Pin_0}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BTN_GPIO_PORT->IDR; // read BTN GPIO - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_B1) != 0U) { // debounced B1 state changed? - if ((current & BTN_B1) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & USART_SR_RXNE) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE The VFP (Floating Point Unit) unit is configured by QK-port - - // Initialize thr port for the LEDs - RCC_AHB1PeriphClockCmd(LED_GPIO_CLK , ENABLE); - - // GPIO Configuration for the LEDs... - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Mode = GPIO_Mode_OUT; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_struct.GPIO_Pin = LED3_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED4_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED5_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED6_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - - // Initialize thr port for Button - RCC_AHB1PeriphClockCmd(BTN_GPIO_CLK , ENABLE); - - // GPIO Configuration for the Button... - GPIO_struct.GPIO_Pin = BTN_B1; - GPIO_struct.GPIO_Mode = GPIO_Mode_IN; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(BTN_GPIO_PORT, &GPIO_struct); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - } - if (stat[0] == 'e') { - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused) { - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // Some flating point code is to exercise the FPU... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LED_GPIO_PORT->BSRRL = LED6_PIN; -} -//............................................................................ -void ledOff() { - LED_GPIO_PORT->BSRRH = LED6_PIN; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // USART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - QF_INT_DISABLE(); - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - __NOP(); // wait a little to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & USART_FLAG_TXE) != 0) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - - // GPIOA clock enable - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - // GPIOA Configuration: USART2 TX on PA2 and RX on PA3 - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; - GPIO_struct.GPIO_Mode = GPIO_Mode_AF; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP ; - GPIO_Init(GPIOA, &GPIO_struct); - - // Connect USART2 pins to AF2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX = PA2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX = PA3 - - USART_InitTypeDef USART_struct; - USART_struct.USART_BaudRate = 115200; - USART_struct.USART_WordLength = USART_WordLength_8b; - USART_struct.USART_StopBits = USART_StopBits_1; - USART_struct.USART_Parity = USART_Parity_No; - USART_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_struct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; - USART_Init(USART2, &USART_struct); - - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // enable RX interrupt - USART_Cmd(USART2, ENABLE); // enable USART2 - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & USART_FLAG_TXE) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/Makefile b/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/Makefile deleted file mode 100644 index 70daaf444..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/Makefile +++ /dev/null @@ -1,314 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32F4-Discovery, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/stm32f4-discovery \ - $(QPCPP)/3rd_party/stm32f4-discovery/src \ - $(QPCPP)/3rd_party/stm32f4-discovery/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/stm32f4-discovery \ - -I$(QPCPP)/3rd_party/stm32f4-discovery/inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32f4xx.c \ - startup_stm32f4xx.c \ - stm32f4xx_gpio.c \ - stm32f4xx_rcc.c \ - stm32f4xx_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/README.txt deleted file mode 100644 index 99ca75ab1..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code used in this project is located in the "3rd_party" folder -in the following location: - -3rd_party\\gcc\startup_.c - -The file startup_.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/dpp-qk.ld b/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/dpp-qk.ld deleted file mode 100644 index 7bfebfed9..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/dpp-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32F407VG, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/flash.bat b/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/flash.bat deleted file mode 100644 index 2ea7836b0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/gnu/flash.bat +++ /dev/null @@ -1,23 +0,0 @@ -::============================================================================ -:: Batch file to load the DPP program to the flash of STM32 boards -:: -:: NOTE: requires the ST-LINK utility from ST, see: -:: http://www.st.com/en/embedded-software/stsw-link004.html -:: -@echo off -setlocal - -@echo Load the program to the flash of STM32 board -@echo usage: flash dbg\dpp.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: STLINK utility on your machine -:: -set STLINK="C:\tools\ST\ST-LINK\ST-LINK Utility\ST-LINK_CLI.exe" - -@echo on -%STLINK% -P %1 0x08000000 - -@echo off -endlocal diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd b/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd deleted file mode 100644 index 22af80f9b..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp b/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp deleted file mode 100644 index a6244f8bc..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3368 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - stm32f4-discovery - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\iar\startup_stm32f4xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.eww b/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.icf b/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.icf deleted file mode 100644 index 596c28bc7..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,35 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __region_RAM1_start__ = 0x10000000; -define symbol __region_RAM1_end__ = 0x1000FFFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/README.txt deleted file mode 100644 index 1f7cfb27d..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.sct b/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.sct deleted file mode 100644 index eb3902ad0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.sct +++ /dev/null @@ -1,22 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00100000 { ; load region size_region - ER_IROM1 0x08000000 0x00100000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00020000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvoptx b/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvoptx deleted file mode 100644 index 589085d5b..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvoptx +++ /dev/null @@ -1,1024 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U57FF6B064965525557292487 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-rel - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8398 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - stm32f4-discovery - 1 - 0 - 0 - 0 - - 2 - 5 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - startup_stm32f4xx.s - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - README.txt - 0 - 0 - - - 2 - 7 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - stm32f4xx.h - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - system_stm32f4xx.c - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - system_stm32f4xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - stm32f4xx_rcc.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - stm32f4xx_usart.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - stm32f4xx_gpio.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvprojx b/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvprojx deleted file mode 100644 index de3a6d40b..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/armclang/dpp-qv.uvprojx +++ /dev/null @@ -1,1823 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qv.bin .\dbg\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qv.bin .\rel\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qv.bin .\spy\dpp-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/bsp.cpp b/examples/arm-cm/dpp_stm32f4-discovery/qv/bsp.cpp deleted file mode 100644 index 31f23e0c7..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/bsp.cpp +++ /dev/null @@ -1,570 +0,0 @@ -//============================================================================ -// Product: DPP example, STM32F4-Discovery board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32f4xx.h" // CMSIS-compliant header file for the MCU used -#include "stm32f4xx_exti.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_usart.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -GPIO_TypeDef * const LED_GPIO_PORT = GPIOD; -constexpr std::uint32_t LED_GPIO_CLK {RCC_AHB1Periph_GPIOD}; - -constexpr std::uint32_t LED4_PIN {GPIO_Pin_12}; -constexpr std::uint32_t LED3_PIN {GPIO_Pin_13}; -constexpr std::uint32_t LED5_PIN {GPIO_Pin_14}; -constexpr std::uint32_t LED6_PIN {GPIO_Pin_15}; - -#define BTN_GPIO_PORT GPIOA -constexpr std::uint32_t BTN_GPIO_CLK {RCC_AHB1Periph_GPIOA}; -constexpr std::uint32_t BTN_B1 {GPIO_Pin_0}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BTN_GPIO_PORT->IDR; // read BTN GPIO - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_B1) != 0U) { // debounced B1 state changed? - if ((current & BTN_B1) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs don't need to call -// QV_ISR_ENTRY/QV_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & USART_SR_RXNE) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE The VFP (Floating Point Unit) unit is configured by QV-port - - // Initialize thr port for the LEDs - RCC_AHB1PeriphClockCmd(LED_GPIO_CLK , ENABLE); - - // GPIO Configuration for the LEDs... - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Mode = GPIO_Mode_OUT; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_struct.GPIO_Pin = LED3_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED4_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED5_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED6_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - - // Initialize thr port for Button - RCC_AHB1PeriphClockCmd(BTN_GPIO_CLK , ENABLE); - - // GPIO Configuration for the Button... - GPIO_struct.GPIO_Pin = BTN_B1; - GPIO_struct.GPIO_Mode = GPIO_Mode_IN; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(BTN_GPIO_PORT, &GPIO_struct); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - } - if (stat[0] == 'e') { - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused) { - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // Some flating point code is to exercise the FPU... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: no need to lock the scheduler for the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LED_GPIO_PORT->BSRRL = LED6_PIN; -} -//............................................................................ -void ledOff() { - LED_GPIO_PORT->BSRRH = LED6_PIN; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // USART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE0 - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - QF_INT_DISABLE(); - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - __NOP(); // wait a little to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - // interrupts still disabled - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & USART_FLAG_TXE) != 0) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - - // GPIOA clock enable - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - // GPIOA Configuration: USART2 TX on PA2 and RX on PA3 - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; - GPIO_struct.GPIO_Mode = GPIO_Mode_AF; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP ; - GPIO_Init(GPIOA, &GPIO_struct); - - // Connect USART2 pins to AF2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX = PA2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX = PA3 - - USART_InitTypeDef USART_struct; - USART_struct.USART_BaudRate = 115200; - USART_struct.USART_WordLength = USART_WordLength_8b; - USART_struct.USART_StopBits = USART_StopBits_1; - USART_struct.USART_Parity = USART_Parity_No; - USART_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_struct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; - USART_Init(USART2, &USART_struct); - - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // enable RX interrupt - USART_Cmd(USART2, ENABLE); // enable USART2 - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & USART_FLAG_TXE) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call any other QF/QV services. -// These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/Makefile b/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/Makefile deleted file mode 100644 index 35697fa77..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/Makefile +++ /dev/null @@ -1,314 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32F4-Discovery, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/stm32f4-discovery \ - $(QPCPP)/3rd_party/stm32f4-discovery/src \ - $(QPCPP)/3rd_party/stm32f4-discovery/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/stm32f4-discovery \ - -I$(QPCPP)/3rd_party/stm32f4-discovery/inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32f4xx.c \ - startup_stm32f4xx.c \ - stm32f4xx_gpio.c \ - stm32f4xx_rcc.c \ - stm32f4xx_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/README.txt deleted file mode 100644 index 99ca75ab1..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code used in this project is located in the "3rd_party" folder -in the following location: - -3rd_party\\gcc\startup_.c - -The file startup_.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/dpp-qv.ld b/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/dpp-qv.ld deleted file mode 100644 index 7bfebfed9..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/dpp-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32F407VG, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/flash.bat b/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/flash.bat deleted file mode 100644 index 2ea7836b0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/gnu/flash.bat +++ /dev/null @@ -1,23 +0,0 @@ -::============================================================================ -:: Batch file to load the DPP program to the flash of STM32 boards -:: -:: NOTE: requires the ST-LINK utility from ST, see: -:: http://www.st.com/en/embedded-software/stsw-link004.html -:: -@echo off -setlocal - -@echo Load the program to the flash of STM32 board -@echo usage: flash dbg\dpp.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: STLINK utility on your machine -:: -set STLINK="C:\tools\ST\ST-LINK\ST-LINK Utility\ST-LINK_CLI.exe" - -@echo on -%STLINK% -P %1 0x08000000 - -@echo off -endlocal diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd b/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd deleted file mode 100644 index 22af80f9b..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp b/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp deleted file mode 100644 index 493236c92..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3362 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - stm32f4-discovery - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\iar\startup_stm32f4xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.eww b/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.icf b/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.icf deleted file mode 100644 index 596c28bc7..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,35 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __region_RAM1_start__ = 0x10000000; -define symbol __region_RAM1_end__ = 0x1000FFFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/README.txt deleted file mode 100644 index 1f7cfb27d..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.sct b/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.sct deleted file mode 100644 index eb3902ad0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.sct +++ /dev/null @@ -1,22 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00100000 { ; load region size_region - ER_IROM1 0x08000000 0x00100000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_STACK 0x20000000 { ; <== Quantum Leaps - * (STACK, +First) - } - RW_IRAM1 +0 (0x00020000 - 2048) { ; NOTE: 2048 assumed for STACK size! - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvoptx b/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvoptx deleted file mode 100644 index 12256a9af..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvoptx +++ /dev/null @@ -1,1279 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U57FF6B064965525557292487 -O8398 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - 0 - 0 - 231 - 1 -
134218302
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - \\dpp_qxk\../../../../../3rd_party/stm32f4-discovery/arm/startup_stm32f4xx.s\231 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-rel - 0x4 - ARM-ADS - - 16000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8430 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - 0 - 0 - 405 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\bsp.cpp - - -
- - 1 - 0 - 42 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - C:\qp-dev\qpcpp\examples\arm-cm\dpp_stm32f4-discovery\qxk\main.cpp - - -
- - 2 - 0 - 98 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - -
- - 3 - 0 - 148 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - -
- - 4 - 0 - 231 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ST-LINKIII-KEIL_SWO - -U066EFF495056805087184715 -O8398 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - - - - - 0 - 0 - 405 - 1 -
134221038
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\dpp_qxk\../bsp.cpp\405 -
- - 1 - 0 - 259 - 1 -
134218576
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - \\dpp_qxk\../../../../../3rd_party/stm32f4-discovery/arm/startup_stm32f4xx.s\259 -
- - 2 - 0 - 148 - 1 -
134220772
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - \\dpp_qxk\../../../../../ports/arm-cm/qxk/arm/qxk_port.cpp\148 -
- - 3 - 0 - 42 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - C:\qp-dev\qpcpp\examples\arm-cm\dpp_stm32f4-discovery\qxk\main.cpp - - -
- - 4 - 0 - 98 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - -
- - 5 - 0 - 231 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\table.cpp - table.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\xthread1.cpp - xthread1.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\xthread2.cpp - xthread2.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - stm32f4-discovery - 1 - 0 - 0 - 0 - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - startup_stm32f4xx.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - README.txt - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - stm32f4xx.h - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - system_stm32f4xx.c - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - system_stm32f4xx.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - stm32f4xx_rcc.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - stm32f4xx_usart.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - stm32f4xx_gpio.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvprojx b/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvprojx deleted file mode 100644 index 5662adb6a..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/armclang/dpp-qxk.uvprojx +++ /dev/null @@ -1,1898 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp-qxk.bin .\dbg\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-rel - 0x4 - ARM-ADS - 5060528::V5.06 update 5 (build 528)::ARMCC - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp-qxk.bin .\rel\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32F407VGTx - STMicroelectronics - Keil.STM32F4xx_DFP.2.17.0 - https://www.keil.com/pack/ - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F407VGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407VGTx$CMSIS\SVD\STM32F40x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp-qxk.bin .\spy\dpp-qxk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x10000000 - 0x10000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include; ..\..\..\..\..\3rd_party\stm32f4-discovery; ..\..\..\..\..\3rd_party\stm32f4-discovery\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - bsp.cpp - 8 - ..\bsp.cpp - - - philo.cpp - 8 - ..\..\philo.cpp - - - table.cpp - 8 - ..\..\table.cpp - - - xthread1.cpp - 8 - ..\xthread1.cpp - - - xthread2.cpp - 8 - ..\xthread2.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - stm32f4-discovery - - - startup_stm32f4xx.s - 2 - ..\..\..\..\..\3rd_party\stm32f4-discovery\arm\startup_stm32f4xx.s - - - README.txt - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\README.txt - - - stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - system_stm32f4xx.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - system_stm32f4xx.h - 5 - ..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - stm32f4xx_rcc.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - stm32f4xx_usart.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - stm32f4xx_gpio.c - 1 - ..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/bsp.cpp b/examples/arm-cm/dpp_stm32f4-discovery/qxk/bsp.cpp deleted file mode 100644 index 213224c1f..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/bsp.cpp +++ /dev/null @@ -1,583 +0,0 @@ -//============================================================================ -// Product: DPP example, STM32F4-Discovery board, QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32f4xx.h" // CMSIS-compliant header file for the MCU used -#include "stm32f4xx_exti.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_usart.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -GPIO_TypeDef * const LED_GPIO_PORT = GPIOD; -constexpr std::uint32_t LED_GPIO_CLK {RCC_AHB1Periph_GPIOD}; - -constexpr std::uint32_t LED4_PIN {GPIO_Pin_12}; -constexpr std::uint32_t LED3_PIN {GPIO_Pin_13}; -constexpr std::uint32_t LED5_PIN {GPIO_Pin_14}; -constexpr std::uint32_t LED6_PIN {GPIO_Pin_15}; - -#define BTN_GPIO_PORT GPIOA -constexpr std::uint32_t BTN_GPIO_CLK {RCC_AHB1Periph_GPIOA}; -constexpr std::uint32_t BTN_B1 {GPIO_Pin_0}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up the user LED - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - // for debugging, hang on in an endless loop... - for (;;) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BTN_GPIO_PORT->IDR; // read BTN GPIO - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_B1) != 0U) { // debounced B1 state changed? - if ((current & BTN_B1) != 0U) { // is B1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. - -void USART2_IRQHandler(void); // prototype -void USART2_IRQHandler(void) { // used in QS-RX (kernel UNAWARE interrutp) - // is RX register NOT empty? - if ((USART2->SR & USART_SR_RXNE) != 0U) { - std::uint8_t b = USART2->DR; - QP::QS::rxPut(b); - } - - QXK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE The VFP (Floating Point Unit) unit is configured by QXK-port - - // Initialize thr port for the LEDs - RCC_AHB1PeriphClockCmd(LED_GPIO_CLK , ENABLE); - - // GPIO Configuration for the LEDs... - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Mode = GPIO_Mode_OUT; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_struct.GPIO_Pin = LED3_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED4_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED5_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED6_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - - // Initialize thr port for Button - RCC_AHB1PeriphClockCmd(BTN_GPIO_CLK , ENABLE); - - // GPIO Configuration for the Button... - GPIO_struct.GPIO_Pin = BTN_B1; - GPIO_struct.GPIO_Mode = GPIO_Mode_IN; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(BTN_GPIO_PORT, &GPIO_struct); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *xThread1QueueSto[5]; - static uint64_t xThread1StackSto[64]; - APP::TH_XThread1->start( - 1U, // QP priority of the thread - xThread1QueueSto, // event queue storage - Q_DIM(xThread1QueueSto), // event length [events] - &xThread1StackSto[0], // stack storage - sizeof(xThread1StackSto)); // stack size [bytes] - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *xThread2QueueSto[5]; - static uint64_t xThread2StackSto[64]; - APP::TH_XThread2->start( - APP::N_PHILO + 5U, // QP priority of the thread - xThread2QueueSto, // event queue storage - Q_DIM(xThread2QueueSto), // event length [events] - &xThread2StackSto[0], // stack storage - sizeof(xThread2StackSto)); // stack size [bytes] - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - } - if (stat[0] == 'e') { - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t const paused) { - if (paused) { - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // Some flating point code is to exercise the FPU... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - QP::QSchedStatus lockStat = QP::QXK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QXK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - LED_GPIO_PORT->BSRRL = LED6_PIN; -} -//............................................................................ -void ledOff() { - LED_GPIO_PORT->BSRRH = LED6_PIN; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -// QF callbacks... -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - // NOTE: this might have been changed by STM32Cube. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART2_IRQn, 0U); // kernel UNAWARE interrupt - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - -#ifdef Q_SPY - NVIC_EnableIRQ(USART2_IRQn); // USART2 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - - // toggle an LED on and then off (not enough LEDs, see NOTE02) - QF_INT_DISABLE(); - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - __NOP(); // wait a little to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((USART2->SR & USART_FLAG_TXE) != 0) { // TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -#define __DIV(__PCLK, __BAUD) (((__PCLK / 4) *25)/(__BAUD)) -#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100) -#define __DIVFRAQ(__PCLK, __BAUD) \ - (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) \ - * 16 + 50) / 100) -#define __USART_BRR(__PCLK, __BAUD) \ - ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) - -// USART2 pins PA.2 and PA.3 -#define USART2_TX_PIN 2U -#define USART2_RX_PIN 3U - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS receive channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable peripheral clock for USART2 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - - // GPIOA clock enable - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - // GPIOA Configuration: USART2 TX on PA2 and RX on PA3 - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; - GPIO_struct.GPIO_Mode = GPIO_Mode_AF; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP ; - GPIO_Init(GPIOA, &GPIO_struct); - - // Connect USART2 pins to AF2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX = PA2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX = PA3 - - USART_InitTypeDef USART_struct; - USART_struct.USART_BaudRate = 115200; - USART_struct.USART_WordLength = USART_WordLength_8b; - USART_struct.USART_StopBits = USART_StopBits_1; - USART_struct.USART_Parity = USART_Parity_No; - USART_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_struct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; - USART_Init(USART2, &USART_struct); - - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // enable RX interrupt - USART_Cmd(USART2, ENABLE); // enable USART2 - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((USART2->SR & USART_FLAG_TXE) == 0U) { // while TXE not empty - } - USART2->DR = b; // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QXK_ISR_ENTRY macros or any other QF/QXK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QXK services. In particular they -// can NOT call the macros QXK_ISR_ENTRY/QXK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/Makefile b/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/Makefile deleted file mode 100644 index 1a6fd421a..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/Makefile +++ /dev/null @@ -1,319 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on STM32F4-Discovery, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-08 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools/releases - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/stm32f4-discovery \ - $(QPCPP)/3rd_party/stm32f4-discovery/src \ - $(QPCPP)/3rd_party/stm32f4-discovery/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/stm32f4-discovery \ - -I$(QPCPP)/3rd_party/stm32f4-discovery/inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32f4xx.c \ - startup_stm32f4xx.c \ - stm32f4xx_gpio.c \ - stm32f4xx_rcc.c \ - stm32f4xx_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - xthread1.cpp \ - xthread2.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O2 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/README.txt b/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/README.txt deleted file mode 100644 index 99ca75ab1..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code used in this project is located in the "3rd_party" folder -in the following location: - -3rd_party\\gcc\startup_.c - -The file startup_.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/dpp-qxk.ld b/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/dpp-qxk.ld deleted file mode 100644 index 7bfebfed9..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/dpp-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32F407VG, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/flash.bat b/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/flash.bat deleted file mode 100644 index 2ea7836b0..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/gnu/flash.bat +++ /dev/null @@ -1,23 +0,0 @@ -::============================================================================ -:: Batch file to load the DPP program to the flash of STM32 boards -:: -:: NOTE: requires the ST-LINK utility from ST, see: -:: http://www.st.com/en/embedded-software/stsw-link004.html -:: -@echo off -setlocal - -@echo Load the program to the flash of STM32 board -@echo usage: flash dbg\dpp.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: STLINK utility on your machine -:: -set STLINK="C:\tools\ST\ST-LINK\ST-LINK Utility\ST-LINK_CLI.exe" - -@echo on -%STLINK% -P %1 0x08000000 - -@echo off -endlocal diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd b/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index 22af80f9b..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp b/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index 26bd450f3..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3383 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\xthread1.cpp - - - $PROJ_DIR$\..\xthread2.cpp - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - stm32f4-discovery - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\iar\startup_stm32f4xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww b/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf b/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 596c28bc7..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,35 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define symbol __region_RAM1_start__ = 0x10000000; -define symbol __region_RAM1_end__ = 0x1000FFFF; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; -place in RAM1_region { section .sram }; \ No newline at end of file diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread1.cpp b/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread1.cpp deleted file mode 100644 index f394c2661..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread1.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -class XThread1 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread1 inst; - XThread1(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread1 - -//............................................................................ -QP::QXThread * const TH_XThread1 = &XThread1::inst; - -XThread1 XThread1::inst; - -XThread1::XThread1() - : QXThread(&run) -{} - -//............................................................................ -void XThread1::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread1); - QS_OBJ_DICTIONARY(TH_XThread1->getTimeEvt()); - - // subscribe to the EAT signal (from the application) - me->subscribe(APP::EAT_SIG); - - for (;;) { - QP::QEvt const *e = me->queueGet(BSP::TICKS_PER_SEC/4U); - if (e) { - TH_sema.signal(); // signal Thread2 - QP::QF::gc(e); // must explicitly recycle the received event! - } - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - BSP::ledOn(); - if (TH_mutex.tryLock()) { // exercise the mutex - // some floating point code to exercise the VFP... - float volatile x = 1.4142135F; - x = x * 1.4142135F; - QP::QXThread::delay(10U); // BLOCK while holding a mutex - TH_mutex.unlock(); - } - TH_mutex.unlock(); - BSP::ledOff(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread2.cpp b/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread2.cpp deleted file mode 100644 index 7ba1da8f1..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/qxk/xthread2.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//============================================================================ -// QXThread example -// Last updated for version 7.3.0 -// Last updated on 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_FILE -} // unnamed namespace - -//---------------------------------------------------------------------------- -namespace APP { - -//............................................................................ -QP::QXSemaphore TH_sema; -QP::QXMutex TH_mutex; - -//............................................................................ -class XThread2 : public QP::QXThread { -private: - // NOTE: data needed by this thread should be members of - // the thread class. That way they are in the memory region - // accessible from this thread. - std::uint8_t m_foo; - -public: - static XThread2 inst; - XThread2(); - -private: - static void run(QP::QXThread * const thr); -}; // class XThread2 - -//............................................................................ -QP::QXThread * const TH_XThread2 = &XThread2::inst; - -XThread2 XThread2::inst; - -XThread2::XThread2() - : QXThread(&run) -{} - -//............................................................................ -void XThread2::run(QP::QXThread * const thr) { - // downcast the generic thr pointer to the specific thread - //auto me = static_cast(thr); - - QS_OBJ_DICTIONARY(TH_XThread2); - QS_OBJ_DICTIONARY(TH_XThread2->getTimeEvt()); - QS_OBJ_DICTIONARY(&TH_sema); - QS_OBJ_DICTIONARY(&TH_mutex); - - // initialize the semaphore before using it - // NOTE: Here the semaphore is initialized in the highest-priority thread - // that uses it. Alternatively, the semaphore can be initialized - // before any thread runs. - TH_sema.init(0U, // count==0 (signaling semaphore) - 1U); // max_count==1 (binary semaphore) - - // initialize the mutex before using it - // NOTE: Here the mutex is initialized in the highest-priority thread - // that uses it. Alternatively, the mutex can be initialized - // before any thread runs. - TH_mutex.init(APP::N_PHILO + 6U); // priority-ceiling mutex - //l_mutex.init(0U); // alternatively: priority-ceiling NOT used - - for (;;) { - // wait on a semaphore (BLOCK indefinitely) - TH_sema.wait(); - - TH_mutex.lock(QP::QXTHREAD_NO_TIMEOUT); // lock the mutex - QP::QXThread::delay(5U); // wait more (BLOCK) - TH_mutex.unlock(); - } -} - -} // namespace APP diff --git a/examples/arm-cm/dpp_stm32f4-discovery/table.cpp b/examples/arm-cm/dpp_stm32f4-discovery/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/arm-cm/dpp_stm32f4-discovery/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/game_efm32-slstk3401a/README.md b/examples/arm-cm/game_efm32-slstk3401a/README.md deleted file mode 100644 index bc964590c..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/README.md +++ /dev/null @@ -1,72 +0,0 @@ -![STM32 EFM32-SLSTK3401A](../../../doxygen/images/bd_EFM32-SLSTK3401A.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_game_efm32-slstk3401a - -# About this Example -This directory contains the "Fly 'n' Shoot" game example application for -the EFM32-SLSTK3401A board (Pearl Gecko evaluation kit) board. This -directory contains portable code that should compile with any C compiler -for ARM Cortex-M. - -The sub-directories contain code and project files, which are specific to -the particular ARM toolchains, such as ARM (MDK-ARM), GCC, and IAR. - -Please refer to the README files in the sub-directories for specific -instructions how to use and customize the example to your needs. - - -# Support Code for EFM32-SLSTK3401A Board -The directory qpc\3rd_party\efm32pg1b\ contains the CMSIS-compliant -device code for the LM3S811 MCU. Please see the README file in this -folder for more details. - - -# QS Software Tracing Instrumentation -The example provides the "Spy" build configuration, which outputs the -QS (Quantum Spy) software tracing data through UART0, which is connected -to the virtual COM port of the board. - -The output is generated at 115200 baud rate. - -Here is an example invocation of the QSPY host application to receive -the QS data from EFM32-SLSTK3401A: - -``` -qspy -c COM1 (Windows) - -qspy -c /dev/ttyS1 (POSIX) -``` - -The actual serial-port number might be different on your workstation. -Please check the Device Manager to find the COM port number. - - -# Win32-GUI Emulation -The sub-directory "win32-gui" provides the emulation of the example -on Windows GUI, either single-threaded (win32-qv) or multithreaded (win32). -This sub-directory contains the Makefile for the GNU-GCC toolset (MinGW) -and Visual Studio solution file (game-gui.sln) for Visual C++. - -The Win32-GUI emulation is based on the QWinâ„¢ GUI Prototyping Toolkit, see: - -- https://www.state-machine.com/products/qtools#QWIN - -The emulation uses exactly the same code as the embedded board and differs -only in the Board Support Package (bsp.c). This example demonstrates the -"dual targeting" development approach, where most of the embedded code is -developed on the workstation (Windows), but is intended for a deeply -embedded target (EFM32-SLSTK3401A here). - - -# QS Software Tracing Instrumentation -The "win32-gui" emulation also supports the "Spy" build configuration, -in which case it attempts to connect to the QSPY host application via -a TCP/IP socket (default). Here is how you launch the QSPY host utility: - - -``` -qspy -``` - diff --git a/examples/arm-cm/game_efm32-slstk3401a/bsp.hpp b/examples/arm-cm/game_efm32-slstk3401a/bsp.hpp deleted file mode 100644 index c6c134f0a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example on EFM32-SLSTK3401A board -// Last updated for version 7.3.0 -// Last updated on 2023-09-06 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr uint32_t TICKS_PER_SEC = static_cast(33); -constexpr uint32_t SCREEN_WIDTH = static_cast(128); -constexpr uint32_t SCREEN_HEIGHT = static_cast(128); - -void init(void); -void terminate(int16_t result); - -void updateScreen(void); -void clearFB(void); -void clearWalls(void); -void paintString(uint8_t x, uint8_t y, char const *str); -void paintBitmap(uint8_t x, uint8_t y, uint8_t bmp_id); -void advanceWalls(uint8_t top, uint8_t bottom); -void updateScore(uint16_t score); - -bool isThrottle(void); // is the throttle button depressed? -bool doBitmapsOverlap(uint8_t bmp_id1, uint8_t x1, uint8_t y1, - uint8_t bmp_id2, uint8_t x2, uint8_t y2); -bool isWallHit(uint8_t bmp_id, uint8_t x, uint8_t y); -void displayOn(void); -void displayOff(void); - -void randomSeed(uint32_t seed); // random seed -uint32_t random(void); // pseudo-random generator - -extern QP::QTicker *the_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/arm-cm/game_efm32-slstk3401a/game.hpp b/examples/arm-cm/game_efm32-slstk3401a/game.hpp deleted file mode 100644 index 3df880ae9..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/game.hpp +++ /dev/null @@ -1,171 +0,0 @@ -//$file${.::game.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::game.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::game.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef GAME_HPP_ -#define GAME_HPP_ - -namespace GAME { - -enum GameSignals : QP::QSignal { // signals used in the game - TIME_TICK_SIG = QP::Q_USER_SIG, // published from tick ISR - PLAYER_TRIGGER_SIG, // published by Player (ISR) to trigger the Missile - PLAYER_QUIT_SIG, // published by Player (ISR) to quit the game - GAME_OVER_SIG, // published by Ship when it finishes exploding - - // insert other published signals here ... - MAX_PUB_SIG, // the last published signal - - PLAYER_SHIP_MOVE_SIG, // posted by Player (ISR) to the Ship to move it - - BLINK_TIMEOUT_SIG, // signal for Tunnel's blink timeout event - SCREEN_TIMEOUT_SIG, // signal for Tunnel's screen timeout event - - TAKE_OFF_SIG, // from Tunnel to Ship to grant permission to take off - HIT_WALL_SIG, // from Tunnel to Ship when Ship hits the wall - HIT_MINE_SIG, // from Mine to Ship or Missile when it hits the mine - SHIP_IMG_SIG, // from Ship to the Tunnel to draw and check for hits - MISSILE_IMG_SIG, // from Missile the Tunnel to draw and check for hits - MINE_IMG_SIG, // sent by Mine to the Tunnel to draw the mine - MISSILE_FIRE_SIG, // sent by Ship to the Missile to fire - DESTROYED_MINE_SIG, // from Missile to Ship when Missile destroyed Mine - EXPLOSION_SIG, // from any exploding object to render the explosion - MINE_PLANT_SIG, // from Tunnel to the Mine to plant it - MINE_DISABLED_SIG, // from Mine to Tunnel when it becomes disabled - MINE_RECYCLE_SIG, // sent by Tunnel to Mine to recycle the mine - SCORE_SIG, // from Ship to Tunnel to display the score - - MAX_SIG // the last signal (keep always last) -}; - -#define GAME_TUNNEL_WIDTH BSP::SCREEN_WIDTH -#define GAME_TUNNEL_HEIGHT (BSP::SCREEN_HEIGHT - 10U) -#define GAME_MINES_MAX 5U -#define GAME_MINES_DIST_MIN 10U -#define GAME_SPEED_X 1U -#define GAME_MISSILE_SPEED_X 2U -#define GAME_SHIP_X 10U -#define GAME_SHIP_Y (GAME_TUNNEL_HEIGHT / 2U) -#define GAME_WALLS_GAP_Y 50U -#define GAME_WALLS_MIN_GAP_Y 20U - -enum GameBitmapIds { - SHIP_BMP, - MISSILE_BMP, - MINE1_BMP, - MINE2_BMP, - MINE2_MISSILE_BMP, - EXPLOSION0_BMP, - EXPLOSION1_BMP, - EXPLOSION2_BMP, - EXPLOSION3_BMP, - MAX_BMP -}; - -} // namespace GAME - -// Shared declarations -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::ObjectPosEvt} .................................................... -class ObjectPosEvt : public QP::QEvt { -public: - std::uint8_t x; - std::uint8_t y; - -public: - constexpr ObjectPosEvt( - QP::QSignal sig, - std::uint8_t const x0, - std::uint8_t const y0) - : QEvt(sig), - x(x0), - y(y0) - {} -}; // class ObjectPosEvt - -//${Shared::ObjectImageEvt} .................................................. -class ObjectImageEvt : public QP::QEvt { -public: - std::uint8_t x; - std::int8_t y; - std::uint8_t bmp; -}; // class ObjectImageEvt - -//${Shared::MineEvt} ......................................................... -class MineEvt : public QP::QEvt { -public: - std::uint8_t id; - -public: - constexpr MineEvt( - QP::QSignal sig, - std::uint8_t id_p) - : QEvt(sig), - id(id_p) - {} -}; // class MineEvt - -//${Shared::ScoreEvt} ........................................................ -class ScoreEvt : public QP::QEvt { -public: - std::uint16_t score; - -public: - constexpr ScoreEvt( - QP::QSignal sig, - std::uint16_t score_p) - : QEvt(sig), - score(score_p) - {} -}; // class ScoreEvt - -//${Shared::AO_Tunnel} ....................................................... -// opaque pointer -extern QP::QActive * const AO_Tunnel; - -//${Shared::AO_Ship} ......................................................... -// opaque pointer -extern QP::QActive * const AO_Ship; - -//${Shared::AO_Missile} ...................................................... -// opaque pointer -extern QP::QActive * const AO_Missile; - -//${Shared::Mine1_getInst} ................................................... -QP::QHsm * Mine1_getInst(std::uint8_t id); - -//${Shared::Mine2_getInst} ................................................... -QP::QHsm * Mine2_getInst(std::uint8_t id); - -} // namespace GAME -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // GAME_HPP_ diff --git a/examples/arm-cm/game_efm32-slstk3401a/game.qm b/examples/arm-cm/game_efm32-slstk3401a/game.qm deleted file mode 100644 index b41e6bdf8..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/game.qm +++ /dev/null @@ -1,1448 +0,0 @@ - - - "Fly 'n' Shoot" game model from Chapters 1 & 9 of PSiCC2 - - - - - - - - - - - - - - - - - - - : QEvt(sig), - x(x0), - y(y0) - - - - - - - - - - - - - - - - - - This constructor is called only for statically allocated MineEvt - - - - - : QEvt(sig), - id(id_p) - - - - - - - - - This constructor is called only for statically allocated MineEvt - - - - - : QEvt(sig), - score(score_p) - - - - - // opaque pointer - = &Tunnel::inst; - - - - // opaque pointer - = &Ship::inst; - - - - // opaque pointer - = &Missile::inst; - - - - - - Q_REQUIRE(id < Q_DIM(Mine1::inst)); -return &Mine1::inst[id]; - - - - - - Q_REQUIRE(id < Q_DIM(Mine2::inst)); -return &Mine2::inst[id]; - - - - - - - Tunnel Active Object - - - - - - - - - - - - - - - - - - - - - - - - - static instance (Singleton) - - - - : QActive(&initial), - m_blinkTimeEvt(this, BLINK_TIMEOUT_SIG, 0U), - m_screenTimeEvt(this, SCREEN_TIMEOUT_SIG, 0U), - m_last_mine_x(0U), m_last_mine_y(0U) - -for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n] = Mine1_getInst(n); // initialize mine1-type pool - m_mine2_pool[n] = Mine2_getInst(n); // initialize mine2-type pool - m_mines[n] = nullptr; // mine 'n' is unused -} - - - - uint32_t rnd = (BSP::random() & 0xFFU); - -// reduce the top wall thickness 18.75% of the time -if ((rnd < 48U) && (m_wall_thickness_top > 0U)) { - --m_wall_thickness_top; -} - -// reduce the bottom wall thickness 18.75% of the time -if ((rnd > 208U) && (m_wall_thickness_bottom > 0U)) { - --m_wall_thickness_bottom; -} - -rnd = (BSP::random() & 0xFFU); - -// grow the bottom wall thickness 19.14% of the time -if ((rnd < 49U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) -{ - ++m_wall_thickness_bottom; -} - -// grow the top wall thickness 19.14% of the time -if ((rnd > 207U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) -{ - ++m_wall_thickness_top; -} - -// advance the Tunnel by 1 game step to the left -// and copy the Tunnel layer to the main frame buffer -// -BSP::advanceWalls(m_wall_thickness_top, m_wall_thickness_bottom); - - - - uint32_t rnd = (BSP::random() & 0xFFU); - -if (m_last_mine_x > 0U) { - --m_last_mine_x; // shift the last Mine 1 position to the left -} -// last mine far enough? -if ((m_last_mine_x + GAME_MINES_DIST_MIN < GAME_TUNNEL_WIDTH) - && (rnd < 8U)) // place the mines only 5% of the time -{ - uint8_t n; - for (n = 0U; n < Q_DIM(m_mines); ++n) { // look for disabled mines - if (m_mines[n] == nullptr) { - break; - } - } - if (n < Q_DIM(m_mines)) { // a disabled Mine found? - rnd = (BSP::random() & 0xFFFFU); - - if ((rnd & 1U) == 0U) { // choose the type of the mine - m_mines[n] = m_mine1_pool[n]; - } - else { - m_mines[n] = m_mine2_pool[n]; - } - - // new Mine is planted by the end of the tunnel - m_last_mine_x = GAME_TUNNEL_WIDTH - 8U; - - // choose a random y-position for the Mine in the Tunnel - rnd %= (GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom - 4U); - m_last_mine_y = (uint8_t)(m_wall_thickness_top + 2U + rnd); - - // evt to dispatch to the Mine - ObjectPosEvt const ope(MINE_PLANT_SIG, m_last_mine_x, m_last_mine_y); - m_mines[n]->dispatch(&ope, getPrio()); // direct dispatch - } -} - - - - - - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - if (m_mines[n] != nullptr) { // is the mine used? - m_mines[n]->dispatch(e, getPrio()); - } -} - - - - - - for (uint8_t n = 0; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n]->init(getPrio()); // take the initial tran. for Mine1 - m_mine2_pool[n]->init(getPrio()); // take the initial tran. for Mine2 -} - -BSP::randomSeed(1234U); // seed the pseudo-random generator - -subscribe(TIME_TICK_SIG); -subscribe(PLAYER_TRIGGER_SIG); -subscribe(PLAYER_QUIT_SIG); - -// object dictionary for Tunnel object... -QS_OBJ_DICTIONARY(&Tunnel::inst.m_blinkTimeEvt); -QS_OBJ_DICTIONARY(&Tunnel::inst.m_screenTimeEvt); - -// local signals... -QS_SIG_DICTIONARY(BLINK_TIMEOUT_SIG, this); -QS_SIG_DICTIONARY(SCREEN_TIMEOUT_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); -QS_SIG_DICTIONARY(MINE_IMG_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(EXPLOSION_SIG, this); -QS_SIG_DICTIONARY(SCORE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - Q_ASSERT((Q_EVT_CAST(MineEvt)->id < GAME_MINES_MAX) - && (m_mines[Q_EVT_CAST(MineEvt)->id] != nullptr)); -m_mines[Q_EVT_CAST(MineEvt)->id] = nullptr; - - - - - - - - - - - - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 sec -m_blink_ctr = 0U; -BSP::paintString(24U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "Quantum LeAps"); -BSP::paintString(16U, (GAME_TUNNEL_HEIGHT / 2U) + 0U, "state-machine.com"); - -BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 18U, "Fire missile: BTN0"); -BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 10U, "Fly ship up: BTN1"); - -BSP::updateScreen(); - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); - - - - - - - - - m_blink_ctr ^= 1U; // toggle the blink counter - - - m_blink_ctr == 0U - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeAps"); -BSP::updateScreen(); - - - - - - - else - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeaPs"); -BSP::updateScreen(); - - - - - - - - - - - - - - - - m_last_mine_x = 0U; // last mine at right edge of the tunnel -m_last_mine_y = 0U; -// set the tunnel properties... -m_wall_thickness_top = 0U; -m_wall_thickness_bottom = 0U; -m_wall_gap = GAME_WALLS_GAP_Y; - -BSP::clearWalls(); // erase the tunnel walls - -m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*20U, 0U); // in 20 sec - -m_blink_ctr = 0U; // init the blink counter - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); - - - m_blink_ctr ^= 1U; /* toggle the blink counter */ - - - - - - - - - - - - - advance(); -if (m_blink_ctr != 0U) { - // add the text into the frame buffer - BSP::paintString((GAME_TUNNEL_WIDTH - 10U*6U)/2U, - (GAME_TUNNEL_HEIGHT - 4U)/2U, - "Press BTN0"); -} -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - static QP::QEvt const takeoff(TAKE_OFF_SIG); -m_wall_gap = GAME_WALLS_GAP_Y; -AO_Ship->POST(&takeoff, this); // post the TAKEOFF sig - static QP::QEvt const recycle(MINE_RECYCLE_SIG); -dispatchToAllMines(&recycle); // recycle all Mines - - - // render this frame on the display -BSP::updateScreen(); -advance(); -plantMine(); -dispatchToAllMines(e); - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - -// did the Ship/Missile hit the tunnel wall? -if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Ship->POST(&hit, this); -} -BSP::paintBitmap(x, y, bmp); -dispatchToAllMines(e); // let Mines check for hits - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - -// did the Ship/Missile hit the tunnel wall? -if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Missile->POST(&hit, this); -} -BSP::paintBitmap(x, y, bmp); -dispatchToAllMines(e); // let Mines check for hits - - - - - - - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - - - - - - - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - - - - - - - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); -// increase difficulty of the game: -// the tunnel gets narrower as the score goes up -// -m_wall_gap = (uint8_t)(GAME_WALLS_GAP_Y - - Q_EVT_CAST(ScoreEvt)->score/100U); -if (m_wall_gap < GAME_WALLS_MIN_GAP_Y) { - m_wall_gap = GAME_WALLS_MIN_GAP_Y; -} - - - - - - - BSP::clearWalls(); -BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); -BSP::updateScreen(); - - - - - - - - - - - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 se -m_blink_ctr = 0U; -BSP::paintString((GAME_TUNNEL_WIDTH - 6U * 9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - "Game Over"); -BSP::updateScreen(); - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); -BSP::updateScore(0U); // update the score on the display - - - m_blink_ctr ^= 1U; // toggle the blink counter -BSP::paintString((GAME_TUNNEL_WIDTH - 6U*9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - ((m_blink_ctr == 0U) - ? "Game Over" - : " ")); -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BSP::displayOff(); // power down the display -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*3U, 0U); // in 3 sec - m_screenTimeEvt.disarm(); -BSP::displayOn(); // power up the display - - - - - - - - - - - - - - BSP::clearFB(); // clear the screen frame buffer -uint32_t rnd = BSP::random(); -BSP::paintString((uint8_t)(rnd % (GAME_TUNNEL_WIDTH - 10U*6U)), - (uint8_t) (rnd % (GAME_TUNNEL_HEIGHT - 8U)), - "Press BTN0"); -BSP::updateScreen(); -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC/3U, 0U); // in 1/3 sec - m_screenTimeEvt.disarm(); -BSP::clearFB(); -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - BSP::clearFB(); -BSP::updateScreen(); -QP::QF::stop(); // stop QF and cleanup - - - - - - - - - - Ship Active Object - - - - - vertical position of the ship in the 8s2 fixed-point notation. - - - - - - - - static instance (Singleton) - - - - : QActive(&initial), - m_x(GAME_SHIP_X), - m_y(GAME_SHIP_Y << 2) - - - - - - subscribe(TIME_TICK_SIG); -subscribe(PLAYER_TRIGGER_SIG); - -// local signals... -QS_SIG_DICTIONARY(PLAYER_SHIP_MOVE_SIG, this); -QS_SIG_DICTIONARY(TAKE_OFF_SIG, this); -QS_SIG_DICTIONARY(HIT_WALL_SIG, this); -QS_SIG_DICTIONARY(HIT_MINE_SIG, this); -QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - - - - - - - - - - - - - - - - - m_score = 0U; // reset the score -ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); -sev->score = m_score; -AO_Tunnel->POST(sev, this); - -// launch the ship from the initial position -m_x = GAME_SHIP_X; -m_y = (GAME_SHIP_Y << 2); - - - if (BSP::isThrottle()) { - if (m_y > 0U) { - m_y -= 1U; - } -} -else { - if (m_y < (GAME_TUNNEL_HEIGHT << 2)) { - m_y += 1U; - } -} - -// tell the Tunnel to draw the Ship and test for hits -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG); -oie->x = m_x; -oie->y = m_y >> 2; -oie->bmp = SHIP_BMP; -AO_Tunnel->POST(oie, this); - -++m_score; // increment the score for surviving another tick - -if ((m_score % 10U) == 0U) { // is the score "round"? - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); -} - - - - - - - ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG); -ope->x = m_x; -ope->y = (m_y >> 2) + SHIP_HEIGHT - 1U; -AO_Missile->POST(ope, this); - - - - - - - m_score += Q_EVT_CAST(ScoreEvt)->score; -// the score will be sent to the Tunnel by the next TIME_TICK - - - - - - - - - - - - - - - - - - - - - - - m_exp_ctr = 0U; - - - - - m_exp_ctr < 15U - ++m_exp_ctr; -// tell the Tunnel to draw the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -oie->x = m_x; // x of explosion -oie->y = (int8_t)((int)(m_y >> 2) - 4U + SHIP_HEIGHT); -AO_Tunnel->POST(oie, this); - - - - - - - - ScoreEvt *gameOver = Q_NEW(ScoreEvt, GAME_OVER_SIG); -gameOver->score = m_score; -AO_Tunnel->POST(gameOver, this); - - - - - - - - - - - - - - - - - - - - Missile Active Object - - - - - - - - - static instance (Singleton) - - - - : QActive(&initial) - - - - - - subscribe( TIME_TICK_SIG); - -// local signals... -QS_SIG_DICTIONARY(MISSILE_FIRE_SIG, this); -QS_SIG_DICTIONARY(HIT_WALL_SIG, this); -QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - - - - - m_x + GAME_MISSILE_SPEED_X < GAME_TUNNEL_WIDTH - m_x += GAME_MISSILE_SPEED_X; -// tell the Tunnel to draw the Missile and test for wall hits -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MISSILE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MISSILE_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - AO_Ship->POST(e, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15U) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move the explosion by one step - -// tell the Tunnel to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 3U; // x-pos of explosion -oie->y = (int8_t)((int)m_y - 4U); // y-pos -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - The Mine1 orthogonal component - - - - - - - - - static instances (Singletons) - - - - : QHsm(&initial) - - - - - - static bool dict_sent = false; -if (!dict_sent) { - dict_sent = true; - - // object dictionaries for Mine1 pool... - QS_OBJ_DICTIONARY(&Mine1::inst[0]); - QS_OBJ_DICTIONARY(&Mine1::inst[1]); - QS_OBJ_DICTIONARY(&Mine1::inst[2]); - QS_OBJ_DICTIONARY(&Mine1::inst[3]); - QS_OBJ_DICTIONARY(&Mine1::inst[4]); - - // function dictionaries for Mine1 SM - QS_FUN_DICTIONARY(&Mine1::initial); - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::planted); - QS_FUN_DICTIONARY(&Mine1::exploding); -} -// local signals -QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - // tell the Tunnel that this mine is becoming disabled -MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); -mev->id = MINE_ID(this); -AO_Tunnel->POST(mev, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move explosion by 1 step - -// tell the Game to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 1U; // x of explosion -oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - - m_x >= GAME_SPEED_X - m_x -= GAME_SPEED_X; // move the mine 1 step -// tell the Tunnel to draw the Mine -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MINE1_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y) - static MineEvt const mine1_hit(HIT_MINE_SIG, 1U); -AO_Ship->POST(&mine1_hit, this); -// go straight to 'disabled' and let the Ship do -// the exploding - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y) - static ScoreEvt const mine1_destroyed(DESTROYED_MINE_SIG, 25U); -AO_Missile->POST(&mine1_destroyed, this); - - - - - - - - - - - - - - - - - - - - The Mine2 orthogonal component - - - - - - - - - static instances (Singletons) - - - - : QHsm(&initial) - - - - - - static bool dict_sent = false; -if (!dict_sent) { - dict_sent = true; - // object dictionaries for Mine2 pool... - QS_OBJ_DICTIONARY(&Mine2::inst[0]); - QS_OBJ_DICTIONARY(&Mine2::inst[1]); - QS_OBJ_DICTIONARY(&Mine2::inst[2]); - QS_OBJ_DICTIONARY(&Mine2::inst[3]); - QS_OBJ_DICTIONARY(&Mine2::inst[4]); - - // function dictionaries for Mine2 SM... - QS_FUN_DICTIONARY(&Mine2::initial); - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::planted); - QS_FUN_DICTIONARY(&Mine2::exploding); -} -// local signals... -QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - // tell the Tunnel that this mine is becoming disabled -MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); -mev->id = MINE_ID(this); -AO_Tunnel->POST(mev, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move explosion by 1 step - -// tell the Game to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 1U; // x of explosion -oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - - m_x >= GAME_SPEED_X - m_x -= GAME_SPEED_X; // move the mine 1 step -// tell the Tunnel to draw the Mine -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MINE2_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE2_BMP, m_x, m_y, bmp, x, y) - static MineEvt const mine2_hit(HIT_MINE_SIG, 2U); -AO_Ship->POST(&mine2_hit, this); -// go straight to 'disabled' and let the Ship do -// the exploding - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE2_MISSILE_BMP, m_x, m_y, bmp, x, y) - static ScoreEvt const mine2_destroyed(DESTROYED_MINE_SIG, 45U); -AO_Missile->POST(&mine2_destroyed, this); - - - - - - - - - - - - - - - - - - - - - - - #ifndef GAME_HPP_ -#define GAME_HPP_ - -namespace GAME { - -enum GameSignals : QP::QSignal { // signals used in the game - TIME_TICK_SIG = QP::Q_USER_SIG, // published from tick ISR - PLAYER_TRIGGER_SIG, // published by Player (ISR) to trigger the Missile - PLAYER_QUIT_SIG, // published by Player (ISR) to quit the game - GAME_OVER_SIG, // published by Ship when it finishes exploding - - // insert other published signals here ... - MAX_PUB_SIG, // the last published signal - - PLAYER_SHIP_MOVE_SIG, // posted by Player (ISR) to the Ship to move it - - BLINK_TIMEOUT_SIG, // signal for Tunnel's blink timeout event - SCREEN_TIMEOUT_SIG, // signal for Tunnel's screen timeout event - - TAKE_OFF_SIG, // from Tunnel to Ship to grant permission to take off - HIT_WALL_SIG, // from Tunnel to Ship when Ship hits the wall - HIT_MINE_SIG, // from Mine to Ship or Missile when it hits the mine - SHIP_IMG_SIG, // from Ship to the Tunnel to draw and check for hits - MISSILE_IMG_SIG, // from Missile the Tunnel to draw and check for hits - MINE_IMG_SIG, // sent by Mine to the Tunnel to draw the mine - MISSILE_FIRE_SIG, // sent by Ship to the Missile to fire - DESTROYED_MINE_SIG, // from Missile to Ship when Missile destroyed Mine - EXPLOSION_SIG, // from any exploding object to render the explosion - MINE_PLANT_SIG, // from Tunnel to the Mine to plant it - MINE_DISABLED_SIG, // from Mine to Tunnel when it becomes disabled - MINE_RECYCLE_SIG, // sent by Tunnel to Mine to recycle the mine - SCORE_SIG, // from Ship to Tunnel to display the score - - MAX_SIG // the last signal (keep always last) -}; - -#define GAME_TUNNEL_WIDTH BSP::SCREEN_WIDTH -#define GAME_TUNNEL_HEIGHT (BSP::SCREEN_HEIGHT - 10U) -#define GAME_MINES_MAX 5U -#define GAME_MINES_DIST_MIN 10U -#define GAME_SPEED_X 1U -#define GAME_MISSILE_SPEED_X 2U -#define GAME_SHIP_X 10U -#define GAME_SHIP_Y (GAME_TUNNEL_HEIGHT / 2U) -#define GAME_WALLS_GAP_Y 50U -#define GAME_WALLS_MIN_GAP_Y 20U - -enum GameBitmapIds { - SHIP_BMP, - MISSILE_BMP, - MINE1_BMP, - MINE2_BMP, - MINE2_MISSILE_BMP, - EXPLOSION0_BMP, - EXPLOSION1_BMP, - EXPLOSION2_BMP, - EXPLOSION3_BMP, - MAX_BMP -}; - -} // namespace GAME - -// Shared declarations -$declare${Shared} - -#endif // GAME_HPP_ - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -$declare${AOs::Missile} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Missile} - -// Active object definition -------------------------------------------------- -$define${AOs::Missile} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -#define SHIP_WIDTH 5U -#define SHIP_HEIGHT 3U - -// encapsulated declaration of the Ship active object ------------------------ -$declare${AOs::Ship} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Ship} - -// Active object definition -------------------------------------------------- -$define${AOs::Ship} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" -#include <string.h> // for memmove() and memcpy() - -Q_DEFINE_THIS_FILE - -// declaration of the Tunnel AO ---------------------------------------------- -$declare${AOs::Tunnel} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Tunnel} - -// Active object definition ================================================== -$define${AOs::Tunnel} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine1 HSM --------------------------------- -$declare${AOs::Mine1} - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline uint8_t MINE_ID(Mine1 const * const me) { - return static_cast<uint8_t>(me - &Mine1::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -$define${Shared::Mine1_getInst} -$define${AOs::Mine1} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine2 HSM --------------------------------- -$declare${AOs::Mine2} - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline std::uint8_t MINE_ID(Mine2 const * const me) { - return static_cast<std::uint8_t>(me - &Mine2::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -$define${Shared::Mine2_getInst} -$define${AOs::Mine2} - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/main.cpp b/examples/arm-cm/game_efm32-slstk3401a/main.cpp deleted file mode 100644 index 8d768ffa8..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/main.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example -// Last updated for version 7.3.0 -// Last updated on 2023-08-06 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -static QP::QTicker l_ticker0(0); // ticker for tick rate 0 -QP::QTicker *BSP::the_Ticker0 = &l_ticker0; - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the Board Support Package - - // initialize the event pools... - //static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10]; - //QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - static QF_MPOOL_EL(GAME::ObjectImageEvt) medPoolSto[2*GAME_MINES_MAX +10]; - QP::QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0])); - - // init publish-subscribe - static QP::QSubscrList subscrSto[GAME::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // object dictionaries for AOs... - QS_OBJ_DICTIONARY(GAME::AO_Missile); - QS_OBJ_DICTIONARY(GAME::AO_Ship); - QS_OBJ_DICTIONARY(GAME::AO_Tunnel); - - // signal dictionaries for globally published events... - QS_SIG_DICTIONARY(GAME::TIME_TICK_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::PLAYER_TRIGGER_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::PLAYER_QUIT_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::GAME_OVER_SIG, nullptr); - - // start the active objects... - BSP::the_Ticker0->start(1U, // priority - 0, 0, 0, 0); - - static QP::QEvt const * tunnelQueueSto[GAME_MINES_MAX + 5]; - GAME::AO_Tunnel ->start(2U, // priority - tunnelQueueSto, Q_DIM(tunnelQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - static QP::QEvt const * shipQueueSto[3]; - GAME::AO_Ship ->start(3U, // priority - shipQueueSto, Q_DIM(shipQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - static QP::QEvt const * missileQueueSto[2]; - GAME::AO_Missile->start(4U, // priority - missileQueueSto, Q_DIM(missileQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - return QP::QF::run(); // run the QF application -} - diff --git a/examples/arm-cm/game_efm32-slstk3401a/mine1.cpp b/examples/arm-cm/game_efm32-slstk3401a/mine1.cpp deleted file mode 100644 index c2170ed71..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/mine1.cpp +++ /dev/null @@ -1,289 +0,0 @@ -//$file${.::mine1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::mine1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::mine1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine1 HSM --------------------------------- -//$declare${AOs::Mine1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine1} .............................................................. -class Mine1 : public QP::QHsm { -private: - std::uint8_t m_x; - std::uint8_t m_y; - std::uint8_t m_exp_ctr; - -public: - static Mine1 inst[GAME_MINES_MAX]; - -public: - Mine1() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(unused); - Q_STATE_DECL(used); - Q_STATE_DECL(exploding); - Q_STATE_DECL(planted); -}; // class Mine1 - -} // namespace GAME -//$enddecl${AOs::Mine1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline uint8_t MINE_ID(Mine1 const * const me) { - return static_cast(me - &Mine1::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Mine1_getInst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::Mine1_getInst} ................................................... -QP::QHsm * Mine1_getInst(std::uint8_t id) { - Q_REQUIRE(id < Q_DIM(Mine1::inst)); - return &Mine1::inst[id]; -} - -} // namespace GAME -//$enddef${Shared::Mine1_getInst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Mine1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine1} .............................................................. -Mine1 Mine1::inst[GAME_MINES_MAX]; - -//${AOs::Mine1::SM} .......................................................... -Q_STATE_DEF(Mine1, initial) { - //${AOs::Mine1::SM::initial} - static bool dict_sent = false; - if (!dict_sent) { - dict_sent = true; - - // object dictionaries for Mine1 pool... - QS_OBJ_DICTIONARY(&Mine1::inst[0]); - QS_OBJ_DICTIONARY(&Mine1::inst[1]); - QS_OBJ_DICTIONARY(&Mine1::inst[2]); - QS_OBJ_DICTIONARY(&Mine1::inst[3]); - QS_OBJ_DICTIONARY(&Mine1::inst[4]); - - // function dictionaries for Mine1 SM - QS_FUN_DICTIONARY(&Mine1::initial); - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::planted); - QS_FUN_DICTIONARY(&Mine1::exploding); - } - // local signals - QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::exploding); - QS_FUN_DICTIONARY(&Mine1::planted); - - return tran(&unused); -} - -//${AOs::Mine1::SM::unused} .................................................. -Q_STATE_DEF(Mine1, unused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::unused::MINE_PLANT} - case MINE_PLANT_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&planted); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used} .................................................... -Q_STATE_DEF(Mine1, used) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used} - case Q_EXIT_SIG: { - // tell the Tunnel that this mine is becoming disabled - MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); - mev->id = MINE_ID(this); - AO_Tunnel->POST(mev, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine1::SM::used::MINE_RECYCLE} - case MINE_RECYCLE_SIG: { - status_ = tran(&unused); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used::exploding} ......................................... -Q_STATE_DEF(Mine1, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine1::SM::used::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine1::SM::used::exploding::TIME_TICK::[stillonscreen?]} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move explosion by 1 step - - // tell the Game to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 1U; // x of explosion - oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine1::SM::used::exploding::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used::planted} ........................................... -Q_STATE_DEF(Mine1, planted) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used::planted::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine1::SM::used::planted::TIME_TICK::[m_x>=GAME_SPEED_X]} - if (m_x >= GAME_SPEED_X) { - m_x -= GAME_SPEED_X; // move the mine 1 step - // tell the Tunnel to draw the Mine - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); - oie->x = m_x; - oie->y = m_y; - oie->bmp = MINE1_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine1::SM::used::planted::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - //${AOs::Mine1::SM::used::planted::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine1::SM::used::planted::SHIP_IMG::[collisionwithMINE1_BMP?]} - if (BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y)) { - static MineEvt const mine1_hit(HIT_MINE_SIG, 1U); - AO_Ship->POST(&mine1_hit, this); - // go straight to 'disabled' and let the Ship do - // the exploding - status_ = tran(&unused); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Mine1::SM::used::planted::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine1::SM::used::planted::MISSILE_IMG::[collisionwithMINE1_BMP?]} - if (BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y)) { - static ScoreEvt const mine1_destroyed(DESTROYED_MINE_SIG, 25U); - AO_Missile->POST(&mine1_destroyed, this); - status_ = tran(&exploding); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Mine1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/game_efm32-slstk3401a/mine2.cpp b/examples/arm-cm/game_efm32-slstk3401a/mine2.cpp deleted file mode 100644 index 71e5d3b58..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/mine2.cpp +++ /dev/null @@ -1,288 +0,0 @@ -//$file${.::mine2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::mine2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::mine2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine2 HSM --------------------------------- -//$declare${AOs::Mine2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine2} .............................................................. -class Mine2 : public QP::QHsm { -private: - std::uint8_t m_x; - std::uint8_t m_y; - std::uint8_t m_exp_ctr; - -public: - static Mine2 inst[GAME_MINES_MAX]; - -public: - Mine2() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(unused); - Q_STATE_DECL(used); - Q_STATE_DECL(exploding); - Q_STATE_DECL(planted); -}; // class Mine2 - -} // namespace GAME -//$enddecl${AOs::Mine2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline std::uint8_t MINE_ID(Mine2 const * const me) { - return static_cast(me - &Mine2::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Mine2_getInst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::Mine2_getInst} ................................................... -QP::QHsm * Mine2_getInst(std::uint8_t id) { - Q_REQUIRE(id < Q_DIM(Mine2::inst)); - return &Mine2::inst[id]; -} - -} // namespace GAME -//$enddef${Shared::Mine2_getInst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Mine2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine2} .............................................................. -Mine2 Mine2::inst[GAME_MINES_MAX]; - -//${AOs::Mine2::SM} .......................................................... -Q_STATE_DEF(Mine2, initial) { - //${AOs::Mine2::SM::initial} - static bool dict_sent = false; - if (!dict_sent) { - dict_sent = true; - // object dictionaries for Mine2 pool... - QS_OBJ_DICTIONARY(&Mine2::inst[0]); - QS_OBJ_DICTIONARY(&Mine2::inst[1]); - QS_OBJ_DICTIONARY(&Mine2::inst[2]); - QS_OBJ_DICTIONARY(&Mine2::inst[3]); - QS_OBJ_DICTIONARY(&Mine2::inst[4]); - - // function dictionaries for Mine2 SM... - QS_FUN_DICTIONARY(&Mine2::initial); - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::planted); - QS_FUN_DICTIONARY(&Mine2::exploding); - } - // local signals... - QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::exploding); - QS_FUN_DICTIONARY(&Mine2::planted); - - return tran(&unused); -} - -//${AOs::Mine2::SM::unused} .................................................. -Q_STATE_DEF(Mine2, unused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::unused::MINE_PLANT} - case MINE_PLANT_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&planted); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used} .................................................... -Q_STATE_DEF(Mine2, used) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used} - case Q_EXIT_SIG: { - // tell the Tunnel that this mine is becoming disabled - MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); - mev->id = MINE_ID(this); - AO_Tunnel->POST(mev, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine2::SM::used::MINE_RECYCLE} - case MINE_RECYCLE_SIG: { - status_ = tran(&unused); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used::exploding} ......................................... -Q_STATE_DEF(Mine2, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine2::SM::used::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine2::SM::used::exploding::TIME_TICK::[stillonscreen?]} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move explosion by 1 step - - // tell the Game to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 1U; // x of explosion - oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine2::SM::used::exploding::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used::planted} ........................................... -Q_STATE_DEF(Mine2, planted) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used::planted::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine2::SM::used::planted::TIME_TICK::[m_x>=GAME_SPEED_X]} - if (m_x >= GAME_SPEED_X) { - m_x -= GAME_SPEED_X; // move the mine 1 step - // tell the Tunnel to draw the Mine - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); - oie->x = m_x; - oie->y = m_y; - oie->bmp = MINE2_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine2::SM::used::planted::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - //${AOs::Mine2::SM::used::planted::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine2::SM::used::planted::SHIP_IMG::[collisionwithMINE2_BMP?]} - if (BSP::doBitmapsOverlap(MINE2_BMP, m_x, m_y, bmp, x, y)) { - static MineEvt const mine2_hit(HIT_MINE_SIG, 2U); - AO_Ship->POST(&mine2_hit, this); - // go straight to 'disabled' and let the Ship do - // the exploding - status_ = tran(&unused); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Mine2::SM::used::planted::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine2::SM::used::planted::MISSILE_IMG::[collisionwithMINE2_MISSILE_BMP?~} - if (BSP::doBitmapsOverlap(MINE2_MISSILE_BMP, m_x, m_y, bmp, x, y)) { - static ScoreEvt const mine2_destroyed(DESTROYED_MINE_SIG, 45U); - AO_Missile->POST(&mine2_destroyed, this); - status_ = tran(&exploding); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Mine2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/game_efm32-slstk3401a/missile.cpp b/examples/arm-cm/game_efm32-slstk3401a/missile.cpp deleted file mode 100644 index a1660a57b..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/missile.cpp +++ /dev/null @@ -1,212 +0,0 @@ -//$file${.::missile.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::missile.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::missile.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -//$declare${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Missile} ............................................................ -class Missile : public QP::QActive { -private: - std::uint8_t m_x; - std::uint8_t m_y; - uint8_t m_exp_ctr; - -public: - static Missile inst; - -public: - Missile(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(armed); - Q_STATE_DECL(flying); - Q_STATE_DECL(exploding); -}; // class Missile - -} // namespace GAME -//$enddecl${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Missile} ...................................................... -QP::QActive * const AO_Missile = &Missile::inst; - -} // namespace GAME -//$enddef${Shared::AO_Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition -------------------------------------------------- -//$define${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Missile} ............................................................ -Missile Missile::inst; - -//${AOs::Missile::Missile} ................................................... -Missile::Missile() - : QActive(&initial) -{} - -//${AOs::Missile::SM} ........................................................ -Q_STATE_DEF(Missile, initial) { - //${AOs::Missile::SM::initial} - subscribe( TIME_TICK_SIG); - - // local signals... - QS_SIG_DICTIONARY(MISSILE_FIRE_SIG, this); - QS_SIG_DICTIONARY(HIT_WALL_SIG, this); - QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Missile::armed); - QS_FUN_DICTIONARY(&Missile::flying); - QS_FUN_DICTIONARY(&Missile::exploding); - - return tran(&armed); -} - -//${AOs::Missile::SM::armed} ................................................. -Q_STATE_DEF(Missile, armed) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::armed::MISSILE_FIRE} - case MISSILE_FIRE_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&flying); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Missile::SM::flying} ................................................ -Q_STATE_DEF(Missile, flying) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::flying::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Missile::SM::flying::TIME_TICK::[m_x+GAME_MISSILE_SPEED_Xx = m_x; - oie->y = m_y; - oie->bmp = MISSILE_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Missile::SM::flying::TIME_TICK::[else]} - else { - status_ = tran(&armed); - } - break; - } - //${AOs::Missile::SM::flying::HIT_WALL} - case HIT_WALL_SIG: { - status_ = tran(&exploding); - break; - } - //${AOs::Missile::SM::flying::DESTROYED_MINE} - case DESTROYED_MINE_SIG: { - AO_Ship->POST(e, this); - status_ = tran(&armed); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Missile::SM::exploding} ............................................. -Q_STATE_DEF(Missile, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Missile::SM::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Missile::SM::exploding::TIME_TICK::[(m_x>=GAME_SPEED_X)&&(m_exp_ctr~} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15U)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move the explosion by one step - - // tell the Tunnel to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 3U; // x-pos of explosion - oie->y = (int8_t)((int)m_y - 4U); // y-pos - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Missile::SM::exploding::TIME_TICK::[else]} - else { - status_ = tran(&armed); - } - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/README.txt b/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/README.txt deleted file mode 100644 index 17af30f26..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvoptx b/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvoptx deleted file mode 100644 index dd21ad42a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvoptx +++ /dev/null @@ -1,1159 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - game-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - d - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - 0 - 0 - 743 - 1 -
4686
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\game_qk\../bsp.cpp\743 -
- - 1 - 0 - 42 - 1 -
14908
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\main.cpp - - \\game_qk\../../main.cpp\42 -
-
- - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - -
-
- - - game-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 3 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGUARM - / - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - game-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 3 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - / - - - 0 - JL2CM3 - -U440060969 -O206 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\mine1.cpp - mine1.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\mine2.cpp - mine2.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\missile.cpp - missile.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\ship.cpp - ship.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\tunnel.cpp - tunnel.cpp - 0 - 0 - - - - - efm32pg1b - 0 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - efm32pg1b200f256gm48.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - startup_efm32pg1b.s - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - system_efm32pg1b.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - em_cmu.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - em_emu.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - em_int.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - em_gpio.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - em_prs.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - em_rtcc.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - em_system.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - em_usart.c - 0 - 0 - - - 2 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - display_ls013b7dh03.c - 0 - 0 - - - 2 - 20 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - displaypalemlib.c - 0 - 0 - - - 2 - 21 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - udelay.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvprojx b/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvprojx deleted file mode 100644 index 522734a37..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/armclang/game-qk.uvprojx +++ /dev/null @@ -1,1958 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - game-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - game-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\game-qk.bin .\dbg\game-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - game-rel - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - game-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\game-qk.bin .\rel\game-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - game-qk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - game-spy - 0x4 - ARM-ADS - 6130001::V6.13.1::.\ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - game-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\game-qk.bin .\spy\game-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/bsp.cpp b/examples/arm-cm/game_efm32-slstk3401a/qk/bsp.cpp deleted file mode 100644 index 7a9791cf9..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/bsp.cpp +++ /dev/null @@ -1,920 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example, EFM32-SLSTK3401A board, QK kernel -// Last updated for: @qpcpp_7_3_2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "game.hpp" // Game Application interface -#include "bsp.hpp" // Board Support Package - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -#include "display_ls013b7dh03.h" // LS013b7DH03 display (SiLabs/QL) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr GPIO_Port_TypeDef LED_PORT {gpioPortF}; -constexpr std::uint32_t LED0_PIN {4U}; -constexpr std::uint32_t LED1_PIN {5U}; - -constexpr GPIO_Port_TypeDef PB_PORT {gpioPortF}; -constexpr std::uint32_t PB0_PIN {6U}; -constexpr std::uint32_t PB1_PIN {7U}; - -/* LCD geometry and frame buffer */ -static uint32_t l_fb[BSP::SCREEN_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -/* the walls buffer */ -static uint32_t l_walls[GAME_TUNNEL_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -static unsigned l_rnd; /* random seed */ - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h); -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h); -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - - //QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - BSP::the_Ticker0->TRIG(&l_SysTick_Handler); // trigger Ticker0 - - static QP::QEvt const tickEvt(GAME::TIME_TICK_SIG); - QP::QF::PUBLISH(&tickEvt, &l_SysTick_Handler); // publish to subscribers - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((current & (1U << PB0_PIN)) != 0U) { // is PB0 depressed? - static QP::QEvt const trigEvt(GAME::PLAYER_TRIGGER_SIG); - QP::QF::PUBLISH(&trigEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call -// QK_ISR_ENTRY/QK_ISR_EXIT and they cannot post or publish events. - -void USART0_RX_IRQHandler(void); // prototype -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((l_USART0->STATUS & USART_STATUS_RXDATAV) != 0U) { - std::uint8_t b = static_cast(l_USART0->RXDATA); - QP::QS::rxPut(b); - } - - QK_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - BSP::randomSeed(1234U); - - /* Initialize the DISPLAY driver. */ - if (!Display_init()) { - Q_ERROR(); - } - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//..........................................................................*/ -void updateScreen(void) { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - Display_sendPA(&l_fb[0][0], 0, LS013B7DH03_HEIGHT); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//..........................................................................*/ -void clearFB() { - uint_fast8_t y; - for (y = 0U; y < SCREEN_HEIGHT; ++y) { - l_fb[y][0] = 0U; - l_fb[y][1] = 0U; - l_fb[y][2] = 0U; - l_fb[y][3] = 0U; - } -} -//..........................................................................*/ -void clearWalls() { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - l_walls[y][0] = 0U; - l_walls[y][1] = 0U; - l_walls[y][2] = 0U; - l_walls[y][3] = 0U; - } -} -//..........................................................................*/ -bool isThrottle(void) { // is the throttle button depressed? - return (GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) == 0U; -} -//..........................................................................*/ -void paintString(uint8_t x, uint8_t y, char const *str) { - static uint8_t const font5x7[95][7] = { - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U }, // - { 0x04U, 0x04U, 0x04U, 0x04U, 0x00U, 0x00U, 0x04U }, // ! - { 0x0AU, 0x0AU, 0x0AU, 0x00U, 0x00U, 0x00U, 0x00U }, // " - { 0x0AU, 0x0AU, 0x1FU, 0x0AU, 0x1FU, 0x0AU, 0x0AU }, // # - { 0x04U, 0x1EU, 0x05U, 0x0EU, 0x14U, 0x0FU, 0x04U }, // $ - { 0x03U, 0x13U, 0x08U, 0x04U, 0x02U, 0x19U, 0x18U }, // % - { 0x06U, 0x09U, 0x05U, 0x02U, 0x15U, 0x09U, 0x16U }, // & - { 0x06U, 0x04U, 0x02U, 0x00U, 0x00U, 0x00U, 0x00U }, // ' - { 0x08U, 0x04U, 0x02U, 0x02U, 0x02U, 0x04U, 0x08U }, // ( - { 0x02U, 0x04U, 0x08U, 0x08U, 0x08U, 0x04U, 0x02U }, // ) - { 0x00U, 0x04U, 0x15U, 0x0EU, 0x15U, 0x04U, 0x00U }, // * - { 0x00U, 0x04U, 0x04U, 0x1FU, 0x04U, 0x04U, 0x00U }, // + - { 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x04U, 0x02U }, // , - { 0x00U, 0x00U, 0x00U, 0x1FU, 0x00U, 0x00U, 0x00U }, // - - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x06U }, // . - { 0x00U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x00U }, // / - { 0x0EU, 0x11U, 0x19U, 0x15U, 0x13U, 0x11U, 0x0EU }, // 0 - { 0x04U, 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // 1 - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x02U, 0x1FU }, // 2 - { 0x1FU, 0x08U, 0x04U, 0x08U, 0x10U, 0x11U, 0x0EU }, // 3 - { 0x08U, 0x0CU, 0x0AU, 0x09U, 0x1FU, 0x08U, 0x08U }, // 4 - { 0x1FU, 0x01U, 0x0FU, 0x10U, 0x10U, 0x11U, 0x0EU }, // 5 - { 0x0CU, 0x02U, 0x01U, 0x0FU, 0x11U, 0x11U, 0x0EU }, // 6 - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x02U, 0x02U }, // 7 - { 0x0EU, 0x11U, 0x11U, 0x0EU, 0x11U, 0x11U, 0x0EU }, // 8 - { 0x0EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x08U, 0x06U }, // 9 - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x06U, 0x00U }, // : - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x04U, 0x02U }, // ; - { 0x08U, 0x04U, 0x02U, 0x01U, 0x02U, 0x04U, 0x08U }, // < - { 0x00U, 0x00U, 0x1FU, 0x00U, 0x1FU, 0x00U, 0x00U }, // = - { 0x02U, 0x04U, 0x08U, 0x10U, 0x08U, 0x04U, 0x02U }, // > - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x00U, 0x04U }, // ? - { 0x0EU, 0x11U, 0x10U, 0x16U, 0x15U, 0x15U, 0x0EU }, // @ - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U }, // A - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x11U, 0x11U, 0x0FU }, // B - { 0x0EU, 0x11U, 0x01U, 0x01U, 0x01U, 0x11U, 0x0EU }, // C - { 0x07U, 0x09U, 0x11U, 0x11U, 0x11U, 0x09U, 0x07U }, // D - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x1FU }, // E - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x01U }, // F - { 0x0EU, 0x11U, 0x01U, 0x1DU, 0x11U, 0x11U, 0x1EU }, // G - { 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U, 0x11U }, // H - { 0x0EU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // I - { 0x1CU, 0x08U, 0x08U, 0x08U, 0x08U, 0x09U, 0x06U }, // J - { 0x11U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U, 0x11U }, // K - { 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x1FU }, // L - { 0x11U, 0x1BU, 0x15U, 0x15U, 0x11U, 0x11U, 0x11U }, // M - { 0x11U, 0x11U, 0x13U, 0x15U, 0x19U, 0x11U, 0x11U }, // N - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // O - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x01U, 0x01U, 0x01U }, // P - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x15U, 0x09U, 0x16U }, // Q - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x05U, 0x09U, 0x11U }, // R - { 0x1EU, 0x01U, 0x01U, 0x0EU, 0x10U, 0x10U, 0x0FU }, // S - { 0x1FU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // T - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // U - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // V - { 0x11U, 0x11U, 0x11U, 0x15U, 0x15U, 0x15U, 0x0AU }, // W - { 0x11U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U, 0x11U }, // X - { 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U, 0x04U, 0x04U }, // Y - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x1FU }, // Z - { 0x0EU, 0x02U, 0x02U, 0x02U, 0x02U, 0x02U, 0x0EU }, // [ - { 0x00U, 0x01U, 0x02U, 0x04U, 0x08U, 0x10U, 0x00U }, // '\' - { 0x0EU, 0x08U, 0x08U, 0x08U, 0x08U, 0x08U, 0x0EU }, // ] - { 0x04U, 0x0AU, 0x11U, 0x00U, 0x00U, 0x00U, 0x00U }, // ^ - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x1FU }, // _ - { 0x02U, 0x04U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ` - { 0x00U, 0x00U, 0x0EU, 0x10U, 0x1EU, 0x11U, 0x1EU }, // a - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x0FU }, // b - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x01U, 0x11U, 0x0EU }, // c - { 0x10U, 0x10U, 0x16U, 0x19U, 0x11U, 0x11U, 0x1EU }, // d - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x1FU, 0x01U, 0x0EU }, // e - { 0x0CU, 0x12U, 0x02U, 0x07U, 0x02U, 0x02U, 0x02U }, // f - { 0x00U, 0x1EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // g - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // h - { 0x04U, 0x00U, 0x06U, 0x04U, 0x04U, 0x04U, 0x0EU }, // i - { 0x08U, 0x00U, 0x0CU, 0x08U, 0x08U, 0x09U, 0x06U }, // j - { 0x01U, 0x01U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U }, // k - { 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // l - { 0x00U, 0x00U, 0x0BU, 0x15U, 0x15U, 0x11U, 0x11U }, // m - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // n - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x11U, 0x11U, 0x0EU }, // o - { 0x00U, 0x00U, 0x0FU, 0x11U, 0x0FU, 0x01U, 0x01U }, // p - { 0x00U, 0x00U, 0x16U, 0x19U, 0x1EU, 0x10U, 0x10U }, // q - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x01U, 0x01U, 0x01U }, // r - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x0EU, 0x10U, 0x0FU }, // s - { 0x02U, 0x02U, 0x07U, 0x02U, 0x02U, 0x12U, 0x0CU }, // t - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x19U, 0x16U }, // u - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // v - { 0x00U, 0x00U, 0x11U, 0x11U, 0x15U, 0x15U, 0x0AU }, // w - { 0x00U, 0x00U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U }, // x - { 0x00U, 0x00U, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // y - { 0x00U, 0x00U, 0x1FU, 0x08U, 0x04U, 0x02U, 0x1FU }, // z - { 0x08U, 0x04U, 0x04U, 0x02U, 0x04U, 0x04U, 0x08U }, // { - { 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // | - { 0x02U, 0x04U, 0x04U, 0x08U, 0x04U, 0x04U, 0x02U }, // } - { 0x02U, 0x15U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ~ - }; - - for (; *str != '\0'; ++str, x += 6) { - uint8_t const *ch = &font5x7[*str - ' '][0]; - paintBitsClear(x, y, ch, 7); - } -} - -//==========================================================================*/ -typedef struct { // the auxiliary structure to hold const bitmaps - uint8_t const *bits; // the bits in the bitmap - uint8_t height; // the height of the bitmap -} Bitmap; - -// bitmap of the Ship: -// -// x.... -// xxx.. -// xxxxx -// -static uint8_t const ship_bits[] = { - 0x01U, 0x07U, 0x1FU -}; - -// bitmap of the Missile: -// -// xxxx -// -static uint8_t const missile_bits[] = { - 0x0FU -}; - -// bitmap of the Mine type-1: -// -// .x. -// xxx -// .x. -// -static uint8_t const mine1_bits[] = { - 0x02U, 0x07U, 0x02U -}; - -// bitmap of the Mine type-2: -// -// x..x -// .xx. -// .xx. -// x..x -// -static uint8_t const mine2_bits[] = { - 0x09U, 0x06U, 0x06U, 0x09U -}; - -// Mine type-2 is nastier than Mine type-1. The type-2 mine can -// hit the Ship with any of its "tentacles". However, it can be -// destroyed by the Missile only by hitting its center, defined as -// the following bitmap: -// -// .... -// .xx. -// .xx. -// -static uint8_t const mine2_missile_bits[] = { - 0x00U, 0x06U, 0x06U -}; - -// -// The bitmap of the explosion stage 0: -// -// ....... -// ...x... -// ..x.x.. -// ...x... -// -static uint8_t const explosion0_bits[] = { - 0x00U, 0x08U, 0x14U, 0x08U -}; - -// -// The bitmap of the explosion stage 1: -// -// ....... -// ..x.x.. -// ...x... -// ..x.x.. -// -static uint8_t const explosion1_bits[] = { - 0x00U, 0x14U, 0x08U, 0x14U -}; - -// -// The bitmap of the explosion stage 2: -// -// .x...x. -// ..x.x.. -// ...x... -// ..x.x.. -// .x...x. -// -static uint8_t const explosion2_bits[] = { - 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U -}; - -// -// The bitmap of the explosion stage 3: -// -// x..x..x -// .x.x.x. -// ..x.x.. -// xx.x.xx -// ..x.x.. -// .x.x.x. -// x..x..x -// -static uint8_t const explosion3_bits[] = { - 0x49, 0x2A, 0x14, 0x6B, 0x14, 0x2A, 0x49 -}; - -static Bitmap const l_bitmap[GAME::MAX_BMP] = { - { ship_bits, Q_DIM(ship_bits) }, - { missile_bits, Q_DIM(missile_bits) }, - { mine1_bits, Q_DIM(mine1_bits) }, - { mine2_bits, Q_DIM(mine2_bits) }, - { mine2_missile_bits, Q_DIM(mine2_missile_bits) }, - { explosion0_bits, Q_DIM(explosion0_bits) }, - { explosion1_bits, Q_DIM(explosion1_bits) }, - { explosion2_bits, Q_DIM(explosion2_bits) }, - { explosion3_bits, Q_DIM(explosion3_bits) } -}; - -//..........................................................................*/ -void paintBitmap(uint8_t x, uint8_t y, uint8_t bmp_id) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - paintBits(x, y, bmp->bits, bmp->height); -} -//..........................................................................*/ -void advanceWalls(uint8_t top, uint8_t bottom) { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - // shift the walls one pixel to the left - l_walls[y][0] = (l_walls[y][0] >> 1) | (l_walls[y][1] << 31); - l_walls[y][1] = (l_walls[y][1] >> 1) | (l_walls[y][2] << 31); - l_walls[y][2] = (l_walls[y][2] >> 1) | (l_walls[y][3] << 31); - l_walls[y][3] = (l_walls[y][3] >> 1); - - // add new column of walls at the end - if (y <= top) { - l_walls[y][3] |= (1U << 31); - } - if (y >= (GAME_TUNNEL_HEIGHT - bottom)) { - l_walls[y][3] |= (1U << 31); - } - - // copy the walls to the frame buffer - l_fb[y][0] = l_walls[y][0]; - l_fb[y][1] = l_walls[y][1]; - l_fb[y][2] = l_walls[y][2]; - l_fb[y][3] = l_walls[y][3]; - } -} -//..........................................................................*/ -bool doBitmapsOverlap(uint8_t bmp_id1, uint8_t x1, uint8_t y1, - uint8_t bmp_id2, uint8_t x2, uint8_t y2) -{ - uint8_t y; - uint8_t y0; - uint8_t h; - uint32_t bits1; - uint32_t bits2; - Bitmap const *bmp1; - Bitmap const *bmp2; - - Q_REQUIRE((bmp_id1 < Q_DIM(l_bitmap)) && (bmp_id2 < Q_DIM(l_bitmap))); - - // are the bitmaps close enough in x? - if (x1 >= x2) { - if (x1 > x2 + 8U) { - return false; - } - x1 -= x2; - x2 = 0U; - } - else { - if (x2 > x1 + 8U) { - return false; - } - x2 -= x1; - x1 = 0U; - } - - bmp1 = &l_bitmap[bmp_id1]; - bmp2 = &l_bitmap[bmp_id2]; - if ((y1 <= y2) && (y1 + bmp1->height > y2)) { - y0 = y2 - y1; - h = y1 + bmp1->height - y2; - if (h > bmp2->height) { - h = bmp2->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y + y0] << x1); - bits2 = ((uint32_t)bmp2->bits[y] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - else { - if ((y1 > y2) && (y2 + bmp2->height > y1)) { - y0 = y1 - y2; - h = y2 + bmp2->height - y1; - if (h > bmp1->height) { - h = bmp1->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y] << x1); - bits2 = ((uint32_t)bmp2->bits[y + y0] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - } - return false; // the bitmaps do not overlap -} -//..........................................................................*/ -bool isWallHit(uint8_t bmp_id, uint8_t x, uint8_t y) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - uint32_t shift = (x & 0x1FU); - uint32_t *walls = &l_walls[y][x >> 5]; - for (y = 0; y < bmp->height; ++y, walls += (SCREEN_WIDTH >> 5)) { - if (*walls & ((uint32_t)bmp->bits[y] << shift)) { - return true; - } - if (shift > 24U) { - if (*(walls + 1) & ((uint32_t)bmp->bits[y] >> (32U - shift))) { - return true; - } - } - } - return false; -} - -//..........................................................................*/ -void updateScore(uint16_t score) { - uint8_t seg[5]; - char str[5]; - - if (score == 0U) { - paintString(1U, SCREEN_HEIGHT - 8U, "SCORE:"); - } - - seg[0] = score % 10U; score /= 10U; - seg[1] = score % 10U; score /= 10U; - seg[2] = score % 10U; score /= 10U; - seg[3] = score % 10U; - - // update the SCORE area on the screeen - str[0] = seg[3] + '0'; - str[1] = seg[2] + '0'; - str[2] = seg[1] + '0'; - str[3] = seg[0] + '0'; - str[4] = '\0'; - paintString(6U*6U, SCREEN_HEIGHT - 8U, str); -} -//............................................................................ -void displayOn(void) { - Display_enable(true); -} -//............................................................................ -void displayOff(void) { - Display_enable(false); -} -//............................................................................ -uint32_t random(void) { // a very cheap pseudo-random-number generator - // some floating point code is to exercise the FPU - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // lock the scheduler around l_rnd up to the Tunnel priority - QP::QSchedStatus lockStat = QP::QK::schedLock(GAME::AO_Tunnel->getPrio()); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); // unlock sched after accessing l_rnd - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rnd = seed; -} - -} // namespace BSP - -//============================================================================ -namespace { // unnamed local namespace - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h) { - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb |= ((uint32_t)bits[y] << shift); - if (shift > 24U) { - *(fb + 1) |= ((uint32_t)bits[y] >> (32U - shift)); - } - } -} -//..........................................................................*/ -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h) -{ - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - uint32_t mask1 = ~((uint32_t)0xFFU << shift); - uint32_t mask2; - if (shift > 24U) { - mask2 = ~(0xFFU >> (32U - shift)); - } - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb = ((*fb & mask1) | ((uint32_t)bits[y] << shift)); - if (shift > 24U) { - *(fb + 1) = ((*(fb + 1) & mask2) - | ((uint32_t)bits[y] >> (32U - shift))); - } - } -} - -} // unnamed local namespace - - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE1 - QF_INT_DISABLE(); - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_USART0->TXDATA = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(l_USART0, &init); - - // enable pins at correct UART/USART location. - l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - l_USART0->ROUTELOC0 = (l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - // Finally enable the UART - USART_Enable(l_USART0, usartEnable); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -//! callback function to execute a user command -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/ -// QK_ISR_ENTRY macros or any other QF/QK services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/Makefile b/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/Makefile deleted file mode 100644 index 0d61536b9..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/Makefile +++ /dev/null @@ -1,324 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QK kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/Qtools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := game-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_int.c \ - em_prs.c \ - em_rtcc.c \ - em_system.c \ - em_usart.c \ - udelay.c \ - display_ls013b7dh03.c \ - displaypalemlib.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - mine1.cpp \ - mine2.cpp \ - missile.cpp \ - ship.cpp \ - tunnel.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/README.txt b/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/README.txt deleted file mode 100644 index b4d4451a1..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project -is located in the "3rd_party" folder in the following location: - -qpc\3rd_party\efm32pg1b\gnu\startup_efm32pg1b.c - -The file startup_efm32pg1b.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/flash.bat b/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/flash.bat deleted file mode 100644 index 23215d0ba..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/flash.bat +++ /dev/null @@ -1,49 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EFM32-SLSTK3401A board -:: -:: NOTE: requires the J-Link commander (JLink.exe) from SEGGER, see: -:: https://www.segger.com/j-link-commander.html -:: -setlocal - -@echo off -@echo Load a given binary file to the flash of EFM32-SLSTK3401A -@echo usage: flash bin-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: JLink utility on your machine -:: -if [%JLINK%] EQU [] set JLINK=%QTOOLS%\..\JLink -if not exist "%JLINK%\JLink.exe" ( - @echo The JLink tool not found. Please adjust flash.bat - @goto end -) - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -:: generate the Jlink command file depending on the first parameter %1 -@echo si 1 >flash.jlink -@echo speed 4000 >>flash.jlink -@echo r >>flash.jlink -@echo h >>flash.jlink -@echo loadbin %1, 0 >>flash.jlink -@echo exit >>flash.jlink - -@echo on -%JLINK%\JLink.exe -device EFM32PG1B200F256GM48 flash.jlink -@echo off - -@del flash.jlink - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/game-qk.ld b/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/game-qk.ld deleted file mode 100644 index 2132b696a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/gnu/game-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EFM32-SLSTK3401A, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Pearl Gecko EFM32PG1B200F256GM48 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/README.txt b/examples/arm-cm/game_efm32-slstk3401a/qk/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewd b/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewd deleted file mode 100644 index c03bfc6b8..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewp b/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewp deleted file mode 100644 index 9d8382257..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.ewp +++ /dev/null @@ -1,3382 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\game.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\mine1.cpp - - - $PROJ_DIR$\..\..\mine2.cpp - - - $PROJ_DIR$\..\..\missile.cpp - - - $PROJ_DIR$\..\..\ship.cpp - - - $PROJ_DIR$\..\..\tunnel.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.eww b/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.eww deleted file mode 100644 index ac60d2e0a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\game-qk.ewp - - - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.icf b/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qk/iar/game-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/README.txt b/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/README.txt deleted file mode 100644 index 17af30f26..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/README.txt +++ /dev/null @@ -1,50 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size (for most embedded projects -yyy should be 0, as the using the heap is not recommended). - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvoptx b/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvoptx deleted file mode 100644 index 1316127c6..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvoptx +++ /dev/null @@ -1,1121 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - game-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O207 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - game-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 3 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U440060969 -O207 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGUARM - / - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - game-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 3 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 3 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - DLGUARM - / - - - 0 - JL2CM3 - -U440060969 -O207 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC8000 -FN1 -FF0GECKOP2.FLM -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC8000 -FD20000000 -FF0GECKOP2 -FL020000 -FS00 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\mine1.cpp - mine1.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\mine2.cpp - mine2.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\..\missile.cpp - missile.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\..\ship.cpp - ship.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\..\tunnel.cpp - tunnel.cpp - 0 - 0 - - - - - efm32pg1b - 0 - 0 - 0 - 0 - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - efm32pg1b200f256gm48.h - 0 - 0 - - - 2 - 9 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - startup_efm32pg1b.s - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - system_efm32pg1b.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - em_cmu.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - em_emu.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - em_int.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - em_gpio.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - em_prs.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - em_rtcc.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - em_system.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - em_usart.c - 0 - 0 - - - 2 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - display_ls013b7dh03.c - 0 - 0 - - - 2 - 20 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - displaypalemlib.c - 0 - 0 - - - 2 - 21 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - udelay.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 38 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 39 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 40 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvprojx b/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvprojx deleted file mode 100644 index d88c7f1d8..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/armclang/game-qv.uvprojx +++ /dev/null @@ -1,1958 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - game-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - game-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\game-qv.bin .\dbg\game-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - game-rel - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - game-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\game-qv.bin .\rel\game-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - game-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - game-spy - 0x4 - ARM-ADS - 5060183::V5.06 update 2 (build 183)::ARMCC - 1 - - - EFM32PG1B200F256GM48 - Silicon Labs - SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0 - https://www.silabs.com/documents/public/cmsis-packs/ - IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0GECKOP2 -FS00 -FL020000 -FP0($$Device:EFM32PG1B200F256GM48$Flash\GECKOP2.FLM)) - 0 - $$Device:EFM32PG1B200F256GM48$Device\EFM32PG1B\Include\em_device.h - - - - - - - - - - $$Device:EFM32PG1B200F256GM48$SVD\EFM32PG1B\EFM32PG1B200F256GM48.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - game-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\game-qv.bin .\spy\game-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY EFM32PG1B200F256GM48=1 - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - mine1.cpp - 8 - ..\..\mine1.cpp - - - mine2.cpp - 8 - ..\..\mine2.cpp - - - missile.cpp - 8 - ..\..\missile.cpp - - - ship.cpp - 8 - ..\..\ship.cpp - - - tunnel.cpp - 8 - ..\..\tunnel.cpp - - - - - efm32pg1b - - - efm32pg1b200f256gm48.h - 5 - ..\..\..\..\..\3rd_party\efm32pg1b\efm32pg1b200f256gm48.h - - - startup_efm32pg1b.s - 2 - ..\..\..\..\..\3rd_party\efm32pg1b\arm\startup_efm32pg1b.s - - - system_efm32pg1b.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - em_cmu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - em_emu.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - em_int.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - em_gpio.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - em_prs.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - em_rtcc.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - em_system.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_system.c - - - em_usart.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - display_ls013b7dh03.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - displaypalemlib.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - udelay.c - 1 - ..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/bsp.cpp b/examples/arm-cm/game_efm32-slstk3401a/qv/bsp.cpp deleted file mode 100644 index 8e2bfa496..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/bsp.cpp +++ /dev/null @@ -1,924 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example, EFM32-SLSTK3401A board, QV kernel -// Last updated for: @qpcpp_7_3_2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "game.hpp" // Game Application interface -#include "bsp.hpp" // Board Support Package - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -#include "display_ls013b7dh03.h" // LS013b7DH03 display (SiLabs/QL) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr GPIO_Port_TypeDef LED_PORT {gpioPortF}; -constexpr std::uint32_t LED0_PIN {4U}; -constexpr std::uint32_t LED1_PIN {5U}; - -constexpr GPIO_Port_TypeDef PB_PORT {gpioPortF}; -constexpr std::uint32_t PB0_PIN {6U}; -constexpr std::uint32_t PB1_PIN {7U}; - -/* LCD geometry and frame buffer */ -static uint32_t l_fb[BSP::SCREEN_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -/* the walls buffer */ -static uint32_t l_walls[GAME_TUNNEL_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -static unsigned l_rnd; /* random seed */ - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h); -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h); -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - static QP::QSTimeCtr QS_tickTime_; - static QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - - //QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - BSP::the_Ticker0->TRIG(&l_SysTick_Handler); // trigger Ticker0 - - static QP::QEvt const tickEvt(GAME::TIME_TICK_SIG); - QP::QF::PUBLISH(&tickEvt, &l_SysTick_Handler); // publish to subscribers - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((current & (1U << PB0_PIN)) != 0U) { // is PB0 depressed? - static QP::QEvt const trigEvt(GAME::PLAYER_TRIGGER_SIG); - QP::QF::PUBLISH(&trigEvt, &l_SysTick_Handler); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QV and is not disabled. Such ISRs don't need to call -// QV_ISR_ENTRY/QV_ISR_EXIT and they cannot post or publish events. - -void USART0_RX_IRQHandler(void); // prototype -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((l_USART0->STATUS & USART_STATUS_RXDATAV) != 0U) { - std::uint8_t b = static_cast(l_USART0->RXDATA); - QP::QS::rxPut(b); - } - - QV_ARM_ERRATUM_838869(); -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - BSP::randomSeed(1234U); - - /* Initialize the DISPLAY driver. */ - if (!Display_init()) { - Q_ERROR(); - } - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//..........................................................................*/ -void updateScreen(void) { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - Display_sendPA(&l_fb[0][0], 0, LS013B7DH03_HEIGHT); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//..........................................................................*/ -void clearFB() { - uint_fast8_t y; - for (y = 0U; y < SCREEN_HEIGHT; ++y) { - l_fb[y][0] = 0U; - l_fb[y][1] = 0U; - l_fb[y][2] = 0U; - l_fb[y][3] = 0U; - } -} -//..........................................................................*/ -void clearWalls() { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - l_walls[y][0] = 0U; - l_walls[y][1] = 0U; - l_walls[y][2] = 0U; - l_walls[y][3] = 0U; - } -} -//..........................................................................*/ -bool isThrottle(void) { // is the throttle button depressed? - return (GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) == 0U; -} -//..........................................................................*/ -void paintString(uint8_t x, uint8_t y, char const *str) { - static uint8_t const font5x7[95][7] = { - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U }, // - { 0x04U, 0x04U, 0x04U, 0x04U, 0x00U, 0x00U, 0x04U }, // ! - { 0x0AU, 0x0AU, 0x0AU, 0x00U, 0x00U, 0x00U, 0x00U }, // " - { 0x0AU, 0x0AU, 0x1FU, 0x0AU, 0x1FU, 0x0AU, 0x0AU }, // # - { 0x04U, 0x1EU, 0x05U, 0x0EU, 0x14U, 0x0FU, 0x04U }, // $ - { 0x03U, 0x13U, 0x08U, 0x04U, 0x02U, 0x19U, 0x18U }, // % - { 0x06U, 0x09U, 0x05U, 0x02U, 0x15U, 0x09U, 0x16U }, // & - { 0x06U, 0x04U, 0x02U, 0x00U, 0x00U, 0x00U, 0x00U }, // ' - { 0x08U, 0x04U, 0x02U, 0x02U, 0x02U, 0x04U, 0x08U }, // ( - { 0x02U, 0x04U, 0x08U, 0x08U, 0x08U, 0x04U, 0x02U }, // ) - { 0x00U, 0x04U, 0x15U, 0x0EU, 0x15U, 0x04U, 0x00U }, // * - { 0x00U, 0x04U, 0x04U, 0x1FU, 0x04U, 0x04U, 0x00U }, // + - { 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x04U, 0x02U }, // , - { 0x00U, 0x00U, 0x00U, 0x1FU, 0x00U, 0x00U, 0x00U }, // - - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x06U }, // . - { 0x00U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x00U }, // / - { 0x0EU, 0x11U, 0x19U, 0x15U, 0x13U, 0x11U, 0x0EU }, // 0 - { 0x04U, 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // 1 - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x02U, 0x1FU }, // 2 - { 0x1FU, 0x08U, 0x04U, 0x08U, 0x10U, 0x11U, 0x0EU }, // 3 - { 0x08U, 0x0CU, 0x0AU, 0x09U, 0x1FU, 0x08U, 0x08U }, // 4 - { 0x1FU, 0x01U, 0x0FU, 0x10U, 0x10U, 0x11U, 0x0EU }, // 5 - { 0x0CU, 0x02U, 0x01U, 0x0FU, 0x11U, 0x11U, 0x0EU }, // 6 - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x02U, 0x02U }, // 7 - { 0x0EU, 0x11U, 0x11U, 0x0EU, 0x11U, 0x11U, 0x0EU }, // 8 - { 0x0EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x08U, 0x06U }, // 9 - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x06U, 0x00U }, // : - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x04U, 0x02U }, // ; - { 0x08U, 0x04U, 0x02U, 0x01U, 0x02U, 0x04U, 0x08U }, // < - { 0x00U, 0x00U, 0x1FU, 0x00U, 0x1FU, 0x00U, 0x00U }, // = - { 0x02U, 0x04U, 0x08U, 0x10U, 0x08U, 0x04U, 0x02U }, // > - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x00U, 0x04U }, // ? - { 0x0EU, 0x11U, 0x10U, 0x16U, 0x15U, 0x15U, 0x0EU }, // @ - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U }, // A - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x11U, 0x11U, 0x0FU }, // B - { 0x0EU, 0x11U, 0x01U, 0x01U, 0x01U, 0x11U, 0x0EU }, // C - { 0x07U, 0x09U, 0x11U, 0x11U, 0x11U, 0x09U, 0x07U }, // D - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x1FU }, // E - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x01U }, // F - { 0x0EU, 0x11U, 0x01U, 0x1DU, 0x11U, 0x11U, 0x1EU }, // G - { 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U, 0x11U }, // H - { 0x0EU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // I - { 0x1CU, 0x08U, 0x08U, 0x08U, 0x08U, 0x09U, 0x06U }, // J - { 0x11U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U, 0x11U }, // K - { 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x1FU }, // L - { 0x11U, 0x1BU, 0x15U, 0x15U, 0x11U, 0x11U, 0x11U }, // M - { 0x11U, 0x11U, 0x13U, 0x15U, 0x19U, 0x11U, 0x11U }, // N - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // O - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x01U, 0x01U, 0x01U }, // P - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x15U, 0x09U, 0x16U }, // Q - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x05U, 0x09U, 0x11U }, // R - { 0x1EU, 0x01U, 0x01U, 0x0EU, 0x10U, 0x10U, 0x0FU }, // S - { 0x1FU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // T - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // U - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // V - { 0x11U, 0x11U, 0x11U, 0x15U, 0x15U, 0x15U, 0x0AU }, // W - { 0x11U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U, 0x11U }, // X - { 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U, 0x04U, 0x04U }, // Y - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x1FU }, // Z - { 0x0EU, 0x02U, 0x02U, 0x02U, 0x02U, 0x02U, 0x0EU }, // [ - { 0x00U, 0x01U, 0x02U, 0x04U, 0x08U, 0x10U, 0x00U }, // '\' - { 0x0EU, 0x08U, 0x08U, 0x08U, 0x08U, 0x08U, 0x0EU }, // ] - { 0x04U, 0x0AU, 0x11U, 0x00U, 0x00U, 0x00U, 0x00U }, // ^ - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x1FU }, // _ - { 0x02U, 0x04U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ` - { 0x00U, 0x00U, 0x0EU, 0x10U, 0x1EU, 0x11U, 0x1EU }, // a - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x0FU }, // b - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x01U, 0x11U, 0x0EU }, // c - { 0x10U, 0x10U, 0x16U, 0x19U, 0x11U, 0x11U, 0x1EU }, // d - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x1FU, 0x01U, 0x0EU }, // e - { 0x0CU, 0x12U, 0x02U, 0x07U, 0x02U, 0x02U, 0x02U }, // f - { 0x00U, 0x1EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // g - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // h - { 0x04U, 0x00U, 0x06U, 0x04U, 0x04U, 0x04U, 0x0EU }, // i - { 0x08U, 0x00U, 0x0CU, 0x08U, 0x08U, 0x09U, 0x06U }, // j - { 0x01U, 0x01U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U }, // k - { 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // l - { 0x00U, 0x00U, 0x0BU, 0x15U, 0x15U, 0x11U, 0x11U }, // m - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // n - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x11U, 0x11U, 0x0EU }, // o - { 0x00U, 0x00U, 0x0FU, 0x11U, 0x0FU, 0x01U, 0x01U }, // p - { 0x00U, 0x00U, 0x16U, 0x19U, 0x1EU, 0x10U, 0x10U }, // q - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x01U, 0x01U, 0x01U }, // r - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x0EU, 0x10U, 0x0FU }, // s - { 0x02U, 0x02U, 0x07U, 0x02U, 0x02U, 0x12U, 0x0CU }, // t - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x19U, 0x16U }, // u - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // v - { 0x00U, 0x00U, 0x11U, 0x11U, 0x15U, 0x15U, 0x0AU }, // w - { 0x00U, 0x00U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U }, // x - { 0x00U, 0x00U, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // y - { 0x00U, 0x00U, 0x1FU, 0x08U, 0x04U, 0x02U, 0x1FU }, // z - { 0x08U, 0x04U, 0x04U, 0x02U, 0x04U, 0x04U, 0x08U }, // { - { 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // | - { 0x02U, 0x04U, 0x04U, 0x08U, 0x04U, 0x04U, 0x02U }, // } - { 0x02U, 0x15U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ~ - }; - - for (; *str != '\0'; ++str, x += 6) { - uint8_t const *ch = &font5x7[*str - ' '][0]; - paintBitsClear(x, y, ch, 7); - } -} - -//==========================================================================*/ -typedef struct { // the auxiliary structure to hold const bitmaps - uint8_t const *bits; // the bits in the bitmap - uint8_t height; // the height of the bitmap -} Bitmap; - -// bitmap of the Ship: -// -// x.... -// xxx.. -// xxxxx -// -static uint8_t const ship_bits[] = { - 0x01U, 0x07U, 0x1FU -}; - -// bitmap of the Missile: -// -// xxxx -// -static uint8_t const missile_bits[] = { - 0x0FU -}; - -// bitmap of the Mine type-1: -// -// .x. -// xxx -// .x. -// -static uint8_t const mine1_bits[] = { - 0x02U, 0x07U, 0x02U -}; - -// bitmap of the Mine type-2: -// -// x..x -// .xx. -// .xx. -// x..x -// -static uint8_t const mine2_bits[] = { - 0x09U, 0x06U, 0x06U, 0x09U -}; - -// Mine type-2 is nastier than Mine type-1. The type-2 mine can -// hit the Ship with any of its "tentacles". However, it can be -// destroyed by the Missile only by hitting its center, defined as -// the following bitmap: -// -// .... -// .xx. -// .xx. -// -static uint8_t const mine2_missile_bits[] = { - 0x00U, 0x06U, 0x06U -}; - -// -// The bitmap of the explosion stage 0: -// -// ....... -// ...x... -// ..x.x.. -// ...x... -// -static uint8_t const explosion0_bits[] = { - 0x00U, 0x08U, 0x14U, 0x08U -}; - -// -// The bitmap of the explosion stage 1: -// -// ....... -// ..x.x.. -// ...x... -// ..x.x.. -// -static uint8_t const explosion1_bits[] = { - 0x00U, 0x14U, 0x08U, 0x14U -}; - -// -// The bitmap of the explosion stage 2: -// -// .x...x. -// ..x.x.. -// ...x... -// ..x.x.. -// .x...x. -// -static uint8_t const explosion2_bits[] = { - 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U -}; - -// -// The bitmap of the explosion stage 3: -// -// x..x..x -// .x.x.x. -// ..x.x.. -// xx.x.xx -// ..x.x.. -// .x.x.x. -// x..x..x -// -static uint8_t const explosion3_bits[] = { - 0x49, 0x2A, 0x14, 0x6B, 0x14, 0x2A, 0x49 -}; - -static Bitmap const l_bitmap[GAME::MAX_BMP] = { - { ship_bits, Q_DIM(ship_bits) }, - { missile_bits, Q_DIM(missile_bits) }, - { mine1_bits, Q_DIM(mine1_bits) }, - { mine2_bits, Q_DIM(mine2_bits) }, - { mine2_missile_bits, Q_DIM(mine2_missile_bits) }, - { explosion0_bits, Q_DIM(explosion0_bits) }, - { explosion1_bits, Q_DIM(explosion1_bits) }, - { explosion2_bits, Q_DIM(explosion2_bits) }, - { explosion3_bits, Q_DIM(explosion3_bits) } -}; - -//..........................................................................*/ -void paintBitmap(uint8_t x, uint8_t y, uint8_t bmp_id) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - paintBits(x, y, bmp->bits, bmp->height); -} -//..........................................................................*/ -void advanceWalls(uint8_t top, uint8_t bottom) { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - // shift the walls one pixel to the left - l_walls[y][0] = (l_walls[y][0] >> 1) | (l_walls[y][1] << 31); - l_walls[y][1] = (l_walls[y][1] >> 1) | (l_walls[y][2] << 31); - l_walls[y][2] = (l_walls[y][2] >> 1) | (l_walls[y][3] << 31); - l_walls[y][3] = (l_walls[y][3] >> 1); - - // add new column of walls at the end - if (y <= top) { - l_walls[y][3] |= (1U << 31); - } - if (y >= (GAME_TUNNEL_HEIGHT - bottom)) { - l_walls[y][3] |= (1U << 31); - } - - // copy the walls to the frame buffer - l_fb[y][0] = l_walls[y][0]; - l_fb[y][1] = l_walls[y][1]; - l_fb[y][2] = l_walls[y][2]; - l_fb[y][3] = l_walls[y][3]; - } -} -//..........................................................................*/ -bool doBitmapsOverlap(uint8_t bmp_id1, uint8_t x1, uint8_t y1, - uint8_t bmp_id2, uint8_t x2, uint8_t y2) -{ - uint8_t y; - uint8_t y0; - uint8_t h; - uint32_t bits1; - uint32_t bits2; - Bitmap const *bmp1; - Bitmap const *bmp2; - - Q_REQUIRE((bmp_id1 < Q_DIM(l_bitmap)) && (bmp_id2 < Q_DIM(l_bitmap))); - - // are the bitmaps close enough in x? - if (x1 >= x2) { - if (x1 > x2 + 8U) { - return false; - } - x1 -= x2; - x2 = 0U; - } - else { - if (x2 > x1 + 8U) { - return false; - } - x2 -= x1; - x1 = 0U; - } - - bmp1 = &l_bitmap[bmp_id1]; - bmp2 = &l_bitmap[bmp_id2]; - if ((y1 <= y2) && (y1 + bmp1->height > y2)) { - y0 = y2 - y1; - h = y1 + bmp1->height - y2; - if (h > bmp2->height) { - h = bmp2->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y + y0] << x1); - bits2 = ((uint32_t)bmp2->bits[y] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - else { - if ((y1 > y2) && (y2 + bmp2->height > y1)) { - y0 = y1 - y2; - h = y2 + bmp2->height - y1; - if (h > bmp1->height) { - h = bmp1->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y] << x1); - bits2 = ((uint32_t)bmp2->bits[y + y0] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - } - return false; // the bitmaps do not overlap -} -//..........................................................................*/ -bool isWallHit(uint8_t bmp_id, uint8_t x, uint8_t y) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - uint32_t shift = (x & 0x1FU); - uint32_t *walls = &l_walls[y][x >> 5]; - for (y = 0; y < bmp->height; ++y, walls += (SCREEN_WIDTH >> 5)) { - if (*walls & ((uint32_t)bmp->bits[y] << shift)) { - return true; - } - if (shift > 24U) { - if (*(walls + 1) & ((uint32_t)bmp->bits[y] >> (32U - shift))) { - return true; - } - } - } - return false; -} - -//..........................................................................*/ -void updateScore(uint16_t score) { - uint8_t seg[5]; - char str[5]; - - if (score == 0U) { - paintString(1U, SCREEN_HEIGHT - 8U, "SCORE:"); - } - - seg[0] = score % 10U; score /= 10U; - seg[1] = score % 10U; score /= 10U; - seg[2] = score % 10U; score /= 10U; - seg[3] = score % 10U; - - // update the SCORE area on the screeen - str[0] = seg[3] + '0'; - str[1] = seg[2] + '0'; - str[2] = seg[1] + '0'; - str[3] = seg[0] + '0'; - str[4] = '\0'; - paintString(6U*6U, SCREEN_HEIGHT - 8U, str); -} -//............................................................................ -void displayOn(void) { - Display_enable(true); -} -//............................................................................ -void displayOff(void) { - Display_enable(false); -} -//............................................................................ -uint32_t random(void) { // a very cheap pseudo-random-number generator - // some floating point code is to exercise the FPU - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // no need to lock the scheduler around l_rnd in QV - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rnd = seed; -} - -} // namespace BSP - -//============================================================================ -namespace { // unnamed local namespace - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h) { - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb |= ((uint32_t)bits[y] << shift); - if (shift > 24U) { - *(fb + 1) |= ((uint32_t)bits[y] >> (32U - shift)); - } - } -} -//..........................................................................*/ -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h) -{ - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - uint32_t mask1 = ~((uint32_t)0xFFU << shift); - uint32_t mask2; - if (shift > 24U) { - mask2 = ~(0xFFU >> (32U - shift)); - } - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb = ((*fb & mask1) | ((uint32_t)bits[y] << shift)); - if (shift > 24U) { - *(fb + 1) = ((*(fb + 1) & mask2) - | ((uint32_t)bits[y] >> (32U - shift))); - } - } -} - -} // unnamed local namespace - - -//============================================================================ -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts disabled, see NOTE0 - // toggle the User LED on and then off, see NOTE01 - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - -#ifdef Q_SPY - // interrupts still DISABLED - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_USART0->TXDATA = b; // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(l_USART0, &init); - - // enable pins at correct UART/USART location. - l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - l_USART0->ROUTELOC0 = (l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - // Finally enable the UART - USART_Enable(l_USART0, usartEnable); - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -//! callback function to execute a user command -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// -// NOTE0: -// The QV:onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QV_ISR_ENTRY/ -// QV_ISR_ENTRY macros or any other QF/QV services. These ISRs are -// "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call ANY QF/QV services. In particular they -// can NOT call the macros QV_ISR_ENTRY/QV_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/Makefile b/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/Makefile deleted file mode 100644 index 6d7ecaf1a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/Makefile +++ /dev/null @@ -1,324 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QV kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/Qtools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := game-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_int.c \ - em_prs.c \ - em_rtcc.c \ - em_system.c \ - em_usart.c \ - udelay.c \ - display_ls013b7dh03.c \ - displaypalemlib.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - mine1.cpp \ - mine2.cpp \ - missile.cpp \ - ship.cpp \ - tunnel.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := \ - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/README.txt b/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/README.txt deleted file mode 100644 index b4d4451a1..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project -is located in the "3rd_party" folder in the following location: - -qpc\3rd_party\efm32pg1b\gnu\startup_efm32pg1b.c - -The file startup_efm32pg1b.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/flash.bat b/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/flash.bat deleted file mode 100644 index 23215d0ba..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/flash.bat +++ /dev/null @@ -1,49 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EFM32-SLSTK3401A board -:: -:: NOTE: requires the J-Link commander (JLink.exe) from SEGGER, see: -:: https://www.segger.com/j-link-commander.html -:: -setlocal - -@echo off -@echo Load a given binary file to the flash of EFM32-SLSTK3401A -@echo usage: flash bin-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: Adjust the following symbol to the location of the -:: JLink utility on your machine -:: -if [%JLINK%] EQU [] set JLINK=%QTOOLS%\..\JLink -if not exist "%JLINK%\JLink.exe" ( - @echo The JLink tool not found. Please adjust flash.bat - @goto end -) - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -:: generate the Jlink command file depending on the first parameter %1 -@echo si 1 >flash.jlink -@echo speed 4000 >>flash.jlink -@echo r >>flash.jlink -@echo h >>flash.jlink -@echo loadbin %1, 0 >>flash.jlink -@echo exit >>flash.jlink - -@echo on -%JLINK%\JLink.exe -device EFM32PG1B200F256GM48 flash.jlink -@echo off - -@del flash.jlink - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/game-qv.ld b/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/game-qv.ld deleted file mode 100644 index 2132b696a..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/gnu/game-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EFM32-SLSTK3401A, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Pearl Gecko EFM32PG1B200F256GM48 */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewd b/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewd deleted file mode 100644 index c03bfc6b8..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewp b/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewp deleted file mode 100644 index 49c12e06c..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.ewp +++ /dev/null @@ -1,3382 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\game.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\mine1.cpp - - - $PROJ_DIR$\..\..\mine2.cpp - - - $PROJ_DIR$\..\..\missile.cpp - - - $PROJ_DIR$\..\..\ship.cpp - - - $PROJ_DIR$\..\..\tunnel.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\display_ls013b7dh03.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\displaypalemlib.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_int.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_prs.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_rtcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\udelay.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.eww b/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.eww deleted file mode 100644 index a2a678d10..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\game-qv.ewp - - - - - diff --git a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.icf b/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/qv/iar/game-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/game_efm32-slstk3401a/ship.cpp b/examples/arm-cm/game_efm32-slstk3401a/ship.cpp deleted file mode 100644 index e69d2aaca..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/ship.cpp +++ /dev/null @@ -1,279 +0,0 @@ -//$file${.::ship.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::ship.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::ship.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -#define SHIP_WIDTH 5U -#define SHIP_HEIGHT 3U - -// encapsulated declaration of the Ship active object ------------------------ -//$declare${AOs::Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Ship} ............................................................... -class Ship : public QP::QActive { -private: - std::uint8_t m_x; - std::uint16_t m_y; - std::uint8_t m_exp_ctr; - std::uint16_t m_score; - -public: - static Ship inst; - -public: - Ship(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(parked); - Q_STATE_DECL(flying); - Q_STATE_DECL(exploding); -}; // class Ship - -} // namespace GAME -//$enddecl${AOs::Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Ship} ......................................................... -QP::QActive * const AO_Ship = &Ship::inst; - -} // namespace GAME -//$enddef${Shared::AO_Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition -------------------------------------------------- -//$define${AOs::Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Ship} ............................................................... -Ship Ship::inst; - -//${AOs::Ship::Ship} ......................................................... -Ship::Ship() - : QActive(&initial), - m_x(GAME_SHIP_X), - m_y(GAME_SHIP_Y << 2) -{} - -//${AOs::Ship::SM} ........................................................... -Q_STATE_DEF(Ship, initial) { - //${AOs::Ship::SM::initial} - subscribe(TIME_TICK_SIG); - subscribe(PLAYER_TRIGGER_SIG); - - // local signals... - QS_SIG_DICTIONARY(PLAYER_SHIP_MOVE_SIG, this); - QS_SIG_DICTIONARY(TAKE_OFF_SIG, this); - QS_SIG_DICTIONARY(HIT_WALL_SIG, this); - QS_SIG_DICTIONARY(HIT_MINE_SIG, this); - QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Ship::active); - QS_FUN_DICTIONARY(&Ship::parked); - QS_FUN_DICTIONARY(&Ship::flying); - QS_FUN_DICTIONARY(&Ship::exploding); - - return tran(&active); -} - -//${AOs::Ship::SM::active} ................................................... -Q_STATE_DEF(Ship, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::initial} - case Q_INIT_SIG: { - status_ = tran(&parked); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::parked} ........................................... -Q_STATE_DEF(Ship, parked) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::parked::TAKE_OFF} - case TAKE_OFF_SIG: { - status_ = tran(&flying); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::flying} ........................................... -Q_STATE_DEF(Ship, flying) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::flying} - case Q_ENTRY_SIG: { - m_score = 0U; // reset the score - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); - - // launch the ship from the initial position - m_x = GAME_SHIP_X; - m_y = (GAME_SHIP_Y << 2); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::TIME_TICK} - case TIME_TICK_SIG: { - if (BSP::isThrottle()) { - if (m_y > 0U) { - m_y -= 1U; - } - } - else { - if (m_y < (GAME_TUNNEL_HEIGHT << 2)) { - m_y += 1U; - } - } - - // tell the Tunnel to draw the Ship and test for hits - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG); - oie->x = m_x; - oie->y = m_y >> 2; - oie->bmp = SHIP_BMP; - AO_Tunnel->POST(oie, this); - - ++m_score; // increment the score for surviving another tick - - if ((m_score % 10U) == 0U) { // is the score "round"? - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG); - ope->x = m_x; - ope->y = (m_y >> 2) + SHIP_HEIGHT - 1U; - AO_Missile->POST(ope, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::DESTROYED_MINE} - case DESTROYED_MINE_SIG: { - m_score += Q_EVT_CAST(ScoreEvt)->score; - // the score will be sent to the Tunnel by the next TIME_TICK - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::HIT_WALL} - case HIT_WALL_SIG: { - status_ = tran(&exploding); - break; - } - //${AOs::Ship::SM::active::flying::HIT_MINE} - case HIT_MINE_SIG: { - status_ = tran(&exploding); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::exploding} ........................................ -Q_STATE_DEF(Ship, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Ship::SM::active::exploding::TIME_TICK::[m_exp_ctr<15U]} - if (m_exp_ctr < 15U) { - ++m_exp_ctr; - // tell the Tunnel to draw the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - oie->x = m_x; // x of explosion - oie->y = (int8_t)((int)(m_y >> 2) - 4U + SHIP_HEIGHT); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Ship::SM::active::exploding::TIME_TICK::[else]} - else { - ScoreEvt *gameOver = Q_NEW(ScoreEvt, GAME_OVER_SIG); - gameOver->score = m_score; - AO_Tunnel->POST(gameOver, this); - status_ = tran(&parked); - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/game_efm32-slstk3401a/tunnel.cpp b/examples/arm-cm/game_efm32-slstk3401a/tunnel.cpp deleted file mode 100644 index 1c6447e0f..000000000 --- a/examples/arm-cm/game_efm32-slstk3401a/tunnel.cpp +++ /dev/null @@ -1,674 +0,0 @@ -//$file${.::tunnel.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::tunnel.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::tunnel.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" -#include // for memmove() and memcpy() - -Q_DEFINE_THIS_FILE - -// declaration of the Tunnel AO ---------------------------------------------- -//$declare${AOs::Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Tunnel} ............................................................. -class Tunnel : public QP::QActive { -private: - QP::QTimeEvt m_blinkTimeEvt; - QP::QTimeEvt m_screenTimeEvt; - QP::QHsm * m_mines[GAME_MINES_MAX]; - QP::QHsm * m_mine1_pool[GAME_MINES_MAX]; - QP::QHsm * m_mine2_pool[GAME_MINES_MAX]; - std::uint8_t m_blink_ctr; - std::uint8_t m_last_mine_x; - std::uint8_t m_last_mine_y; - std::uint8_t m_wall_thickness_top; - std::uint8_t m_wall_thickness_bottom; - std::uint8_t m_wall_gap; - -public: - static Tunnel inst; - -public: - Tunnel(); - void advance(); - -private: - void plantMine(); - void dispatchToAllMines(QP::QEvt const * e); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(show_logo); - Q_STATE_DECL(demo); - Q_STATE_DECL(playing); - Q_STATE_DECL(game_over); - Q_STATE_DECL(screen_saver); - Q_STATE_DECL(screen_saver_hide); - Q_STATE_DECL(screen_saver_show); - Q_STATE_DECL(final); -}; // class Tunnel - -} // namespace GAME -//$enddecl${AOs::Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Tunnel} ....................................................... -QP::QActive * const AO_Tunnel = &Tunnel::inst; - -} // namespace GAME -//$enddef${Shared::AO_Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition ================================================== -//$define${AOs::Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Tunnel} ............................................................. -Tunnel Tunnel::inst; - -//${AOs::Tunnel::Tunnel} ..................................................... -Tunnel::Tunnel() - : QActive(&initial), - m_blinkTimeEvt(this, BLINK_TIMEOUT_SIG, 0U), - m_screenTimeEvt(this, SCREEN_TIMEOUT_SIG, 0U), - m_last_mine_x(0U), m_last_mine_y(0U) -{ - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n] = Mine1_getInst(n); // initialize mine1-type pool - m_mine2_pool[n] = Mine2_getInst(n); // initialize mine2-type pool - m_mines[n] = nullptr; // mine 'n' is unused - } -} - -//${AOs::Tunnel::advance} .................................................... -void Tunnel::advance() { - uint32_t rnd = (BSP::random() & 0xFFU); - - // reduce the top wall thickness 18.75% of the time - if ((rnd < 48U) && (m_wall_thickness_top > 0U)) { - --m_wall_thickness_top; - } - - // reduce the bottom wall thickness 18.75% of the time - if ((rnd > 208U) && (m_wall_thickness_bottom > 0U)) { - --m_wall_thickness_bottom; - } - - rnd = (BSP::random() & 0xFFU); - - // grow the bottom wall thickness 19.14% of the time - if ((rnd < 49U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) - { - ++m_wall_thickness_bottom; - } - - // grow the top wall thickness 19.14% of the time - if ((rnd > 207U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) - { - ++m_wall_thickness_top; - } - - // advance the Tunnel by 1 game step to the left - // and copy the Tunnel layer to the main frame buffer - // - BSP::advanceWalls(m_wall_thickness_top, m_wall_thickness_bottom); -} - -//${AOs::Tunnel::plantMine} .................................................. -void Tunnel::plantMine() { - uint32_t rnd = (BSP::random() & 0xFFU); - - if (m_last_mine_x > 0U) { - --m_last_mine_x; // shift the last Mine 1 position to the left - } - // last mine far enough? - if ((m_last_mine_x + GAME_MINES_DIST_MIN < GAME_TUNNEL_WIDTH) - && (rnd < 8U)) // place the mines only 5% of the time - { - uint8_t n; - for (n = 0U; n < Q_DIM(m_mines); ++n) { // look for disabled mines - if (m_mines[n] == nullptr) { - break; - } - } - if (n < Q_DIM(m_mines)) { // a disabled Mine found? - rnd = (BSP::random() & 0xFFFFU); - - if ((rnd & 1U) == 0U) { // choose the type of the mine - m_mines[n] = m_mine1_pool[n]; - } - else { - m_mines[n] = m_mine2_pool[n]; - } - - // new Mine is planted by the end of the tunnel - m_last_mine_x = GAME_TUNNEL_WIDTH - 8U; - - // choose a random y-position for the Mine in the Tunnel - rnd %= (GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom - 4U); - m_last_mine_y = (uint8_t)(m_wall_thickness_top + 2U + rnd); - - // evt to dispatch to the Mine - ObjectPosEvt const ope(MINE_PLANT_SIG, m_last_mine_x, m_last_mine_y); - m_mines[n]->dispatch(&ope, getPrio()); // direct dispatch - } - } -} - -//${AOs::Tunnel::dispatchToAllMines} ......................................... -void Tunnel::dispatchToAllMines(QP::QEvt const * e) { - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - if (m_mines[n] != nullptr) { // is the mine used? - m_mines[n]->dispatch(e, getPrio()); - } - } -} - -//${AOs::Tunnel::SM} ......................................................... -Q_STATE_DEF(Tunnel, initial) { - //${AOs::Tunnel::SM::initial} - for (uint8_t n = 0; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n]->init(getPrio()); // take the initial tran. for Mine1 - m_mine2_pool[n]->init(getPrio()); // take the initial tran. for Mine2 - } - - BSP::randomSeed(1234U); // seed the pseudo-random generator - - subscribe(TIME_TICK_SIG); - subscribe(PLAYER_TRIGGER_SIG); - subscribe(PLAYER_QUIT_SIG); - - // object dictionary for Tunnel object... - QS_OBJ_DICTIONARY(&Tunnel::inst.m_blinkTimeEvt); - QS_OBJ_DICTIONARY(&Tunnel::inst.m_screenTimeEvt); - - // local signals... - QS_SIG_DICTIONARY(BLINK_TIMEOUT_SIG, this); - QS_SIG_DICTIONARY(SCREEN_TIMEOUT_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - QS_SIG_DICTIONARY(MINE_IMG_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(EXPLOSION_SIG, this); - QS_SIG_DICTIONARY(SCORE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Tunnel::active); - QS_FUN_DICTIONARY(&Tunnel::show_logo); - QS_FUN_DICTIONARY(&Tunnel::demo); - QS_FUN_DICTIONARY(&Tunnel::playing); - QS_FUN_DICTIONARY(&Tunnel::game_over); - QS_FUN_DICTIONARY(&Tunnel::screen_saver); - QS_FUN_DICTIONARY(&Tunnel::screen_saver_hide); - QS_FUN_DICTIONARY(&Tunnel::screen_saver_show); - QS_FUN_DICTIONARY(&Tunnel::final); - - return tran(&show_logo); -} - -//${AOs::Tunnel::SM::active} ................................................. -Q_STATE_DEF(Tunnel, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::MINE_DISABLED} - case MINE_DISABLED_SIG: { - Q_ASSERT((Q_EVT_CAST(MineEvt)->id < GAME_MINES_MAX) - && (m_mines[Q_EVT_CAST(MineEvt)->id] != nullptr)); - m_mines[Q_EVT_CAST(MineEvt)->id] = nullptr; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::PLAYER_QUIT} - case PLAYER_QUIT_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::show_logo} ...................................... -Q_STATE_DEF(Tunnel, show_logo) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::show_logo} - case Q_ENTRY_SIG: { - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 sec - m_blink_ctr = 0U; - BSP::paintString(24U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "Quantum LeAps"); - BSP::paintString(16U, (GAME_TUNNEL_HEIGHT / 2U) + 0U, "state-machine.com"); - - BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 18U, "Fire missile: BTN0"); - BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 10U, "Fly ship up: BTN1"); - - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::show_logo} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::show_logo::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&demo); - break; - } - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; // toggle the blink counter - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT::[m_blink_ctr==0U]} - if (m_blink_ctr == 0U) { - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeAps"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - } - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT::[else]} - else { - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeaPs"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::demo} ........................................... -Q_STATE_DEF(Tunnel, demo) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::demo} - case Q_ENTRY_SIG: { - m_last_mine_x = 0U; // last mine at right edge of the tunnel - m_last_mine_y = 0U; - // set the tunnel properties... - m_wall_thickness_top = 0U; - m_wall_thickness_bottom = 0U; - m_wall_gap = GAME_WALLS_GAP_Y; - - BSP::clearWalls(); // erase the tunnel walls - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*20U, 0U); // in 20 sec - - m_blink_ctr = 0U; // init the blink counter - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; /* toggle the blink counter */ - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver); - break; - } - //${AOs::Tunnel::SM::active::demo::TIME_TICK} - case TIME_TICK_SIG: { - advance(); - if (m_blink_ctr != 0U) { - // add the text into the frame buffer - BSP::paintString((GAME_TUNNEL_WIDTH - 10U*6U)/2U, - (GAME_TUNNEL_HEIGHT - 4U)/2U, - "Press BTN0"); - } - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - status_ = tran(&playing); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::playing} ........................................ -Q_STATE_DEF(Tunnel, playing) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::playing} - case Q_ENTRY_SIG: { - static QP::QEvt const takeoff(TAKE_OFF_SIG); - m_wall_gap = GAME_WALLS_GAP_Y; - AO_Ship->POST(&takeoff, this); // post the TAKEOFF sig - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing} - case Q_EXIT_SIG: { - static QP::QEvt const recycle(MINE_RECYCLE_SIG); - dispatchToAllMines(&recycle); // recycle all Mines - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::TIME_TICK} - case TIME_TICK_SIG: { - // render this frame on the display - BSP::updateScreen(); - advance(); - plantMine(); - dispatchToAllMines(e); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - // did the Ship/Missile hit the tunnel wall? - if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Ship->POST(&hit, this); - } - BSP::paintBitmap(x, y, bmp); - dispatchToAllMines(e); // let Mines check for hits - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - // did the Ship/Missile hit the tunnel wall? - if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Missile->POST(&hit, this); - } - BSP::paintBitmap(x, y, bmp); - dispatchToAllMines(e); // let Mines check for hits - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::MINE_IMG} - case MINE_IMG_SIG: { - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::EXPLOSION} - case EXPLOSION_SIG: { - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::SCORE} - case SCORE_SIG: { - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); - // increase difficulty of the game: - // the tunnel gets narrower as the score goes up - // - m_wall_gap = (uint8_t)(GAME_WALLS_GAP_Y - - Q_EVT_CAST(ScoreEvt)->score/100U); - if (m_wall_gap < GAME_WALLS_MIN_GAP_Y) { - m_wall_gap = GAME_WALLS_MIN_GAP_Y; - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::GAME_OVER} - case GAME_OVER_SIG: { - BSP::clearWalls(); - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); - BSP::updateScreen(); - status_ = tran(&game_over); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::game_over} ...................................... -Q_STATE_DEF(Tunnel, game_over) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::game_over} - case Q_ENTRY_SIG: { - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 se - m_blink_ctr = 0U; - BSP::paintString((GAME_TUNNEL_WIDTH - 6U * 9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - "Game Over"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - BSP::updateScore(0U); // update the score on the display - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; // toggle the blink counter - BSP::paintString((GAME_TUNNEL_WIDTH - 6U*9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - ((m_blink_ctr == 0U) - ? "Game Over" - : " ")); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&demo); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver} ................................... -Q_STATE_DEF(Tunnel, screen_saver) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::initial} - case Q_INIT_SIG: { - status_ = tran(&screen_saver_hide); - break; - } - //${AOs::Tunnel::SM::active::screen_saver::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - status_ = tran(&demo); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} ................ -Q_STATE_DEF(Tunnel, screen_saver_hide) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} - case Q_ENTRY_SIG: { - BSP::displayOff(); // power down the display - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*3U, 0U); // in 3 sec - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} - case Q_EXIT_SIG: { - m_screenTimeEvt.disarm(); - BSP::displayOn(); // power up the display - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hid~::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver_show); - break; - } - default: { - status_ = super(&screen_saver); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} ................ -Q_STATE_DEF(Tunnel, screen_saver_show) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} - case Q_ENTRY_SIG: { - BSP::clearFB(); // clear the screen frame buffer - uint32_t rnd = BSP::random(); - BSP::paintString((uint8_t)(rnd % (GAME_TUNNEL_WIDTH - 10U*6U)), - (uint8_t) (rnd % (GAME_TUNNEL_HEIGHT - 8U)), - "Press BTN0"); - BSP::updateScreen(); - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC/3U, 0U); // in 1/3 sec - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} - case Q_EXIT_SIG: { - m_screenTimeEvt.disarm(); - BSP::clearFB(); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_sho~::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver_hide); - break; - } - default: { - status_ = super(&screen_saver); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::final} .................................................. -Q_STATE_DEF(Tunnel, final) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::final} - case Q_ENTRY_SIG: { - BSP::clearFB(); - BSP::updateScreen(); - QP::QF::stop(); // stop QF and cleanup - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/README.md b/examples/arm-cm/low-power_ek-tm4c123gxl/README.md deleted file mode 100644 index d98ec7ed9..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![EK-TM4C123GXL](../../../doxygen/images/bd_EK-TM4C123GXL.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/arm-cm_low-power.html diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/blinky0.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/blinky0.cpp deleted file mode 100644 index 6e34731f8..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/blinky0.cpp +++ /dev/null @@ -1,202 +0,0 @@ -//$file${.::blinky0.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: low-power.qm -// File: ${.::blinky0.cpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::blinky0.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//Q_DEFINE_THIS_FILE - -//$declare${AOs::Blinky0} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky0} ............................................................ -class Blinky0 : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt0; - -public: - static Blinky0 instance; - -private: - uint8_t m_count; - -public: - Blinky0(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(on); - Q_STATE_DECL(off); - Q_STATE_DECL(inactive); -}; // class Blinky0 -//$enddecl${AOs::Blinky0} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.0.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::AO_Blinky0} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky0} ......................................................... -QP::QActive * const AO_Blinky0 = &Blinky0::instance; -//$enddef${AOs::AO_Blinky0} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Blinky0} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky0} ............................................................ -Blinky0 Blinky0::instance; - -//${AOs::Blinky0::Blinky0} ................................................... -Blinky0::Blinky0() -: QActive(Q_STATE_CAST(&initial)), - m_timeEvt0(this, TIMEOUT0_SIG, 0U) -{} - -//${AOs::Blinky0::SM} ........................................................ -Q_STATE_DEF(Blinky0, initial) { - //${AOs::Blinky0::SM::initial} - (void)e; // unused parameter - subscribe(BTN_PRESSED_SIG); - - QS_FUN_DICTIONARY(&Blinky0::active); - QS_FUN_DICTIONARY(&Blinky0::on); - QS_FUN_DICTIONARY(&Blinky0::off); - QS_FUN_DICTIONARY(&Blinky0::inactive); - - return tran(&active); -} - -//${AOs::Blinky0::SM::active} ................................................ -Q_STATE_DEF(Blinky0, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky0::SM::active} - case Q_ENTRY_SIG: { - BSP_tickRate0_on(); - m_count = 4U; - m_timeEvt0.armX(2U, 2U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky0::SM::active} - case Q_EXIT_SIG: { - m_timeEvt0.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky0::SM::active::initial} - case Q_INIT_SIG: { - status_ = tran(&on); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Blinky0::SM::active::on} ............................................ -Q_STATE_DEF(Blinky0, on) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky0::SM::active::on} - case Q_ENTRY_SIG: { - BSP_led0_on(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky0::SM::active::on} - case Q_EXIT_SIG: { - BSP_led0_off(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky0::SM::active::on::TIMEOUT0} - case TIMEOUT0_SIG: { - --m_count; - //${AOs::Blinky0::SM::active::on::TIMEOUT0::[m_count>0]} - if (m_count > 0) { - status_ = tran(&off); - } - //${AOs::Blinky0::SM::active::on::TIMEOUT0::[else]} - else { - status_ = tran(&inactive); - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Blinky0::SM::active::off} ........................................... -Q_STATE_DEF(Blinky0, off) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky0::SM::active::off::TIMEOUT0} - case TIMEOUT0_SIG: { - status_ = tran(&on); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Blinky0::SM::inactive} .............................................. -Q_STATE_DEF(Blinky0, inactive) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky0::SM::inactive::BTN_PRESSED} - case BTN_PRESSED_SIG: { - status_ = tran(&active); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${AOs::Blinky0} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/blinky1.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/blinky1.cpp deleted file mode 100644 index 2c2ac967a..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/blinky1.cpp +++ /dev/null @@ -1,200 +0,0 @@ -//$file${.::blinky1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: low-power.qm -// File: ${.::blinky1.cpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::blinky1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//Q_DEFINE_THIS_FILE - -//$declare${AOs::Blinky1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky1} ............................................................ -class Blinky1 : public QP::QActive { -public: - static Blinky1 instance; - -private: - QP::QTimeEvt m_timeEvt1; - uint8_t m_count; - -public: - Blinky1(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(inactive); - Q_STATE_DECL(active); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; // class Blinky1 -//$enddecl${AOs::Blinky1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.0.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::AO_Blinky1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky1} ......................................................... -QP::QActive * const AO_Blinky1 = &Blinky1::instance; -//$enddef${AOs::AO_Blinky1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Blinky1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky1} ............................................................ -Blinky1 Blinky1::instance; - -//${AOs::Blinky1::Blinky1} ................................................... -Blinky1::Blinky1() -: QActive(Q_STATE_CAST(&initial)), - m_timeEvt1(this, TIMEOUT1_SIG, 1U) -{} - -//${AOs::Blinky1::SM} ........................................................ -Q_STATE_DEF(Blinky1, initial) { - //${AOs::Blinky1::SM::initial} - (void)e; /* unused parameter */ - subscribe(BTN_PRESSED_SIG); - - QS_FUN_DICTIONARY(&Blinky1::inactive); - QS_FUN_DICTIONARY(&Blinky1::active); - QS_FUN_DICTIONARY(&Blinky1::off); - QS_FUN_DICTIONARY(&Blinky1::on); - - return tran(&inactive); -} - -//${AOs::Blinky1::SM::inactive} .............................................. -Q_STATE_DEF(Blinky1, inactive) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky1::SM::inactive::BTN_PRESSED} - case BTN_PRESSED_SIG: { - status_ = tran(&active); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Blinky1::SM::active} ................................................ -Q_STATE_DEF(Blinky1, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky1::SM::active} - case Q_ENTRY_SIG: { - BSP_tickRate1_on(); - m_count = 13U; - m_timeEvt1.armX(2U, 2U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky1::SM::active} - case Q_EXIT_SIG: { - m_timeEvt1.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky1::SM::active::initial} - case Q_INIT_SIG: { - status_ = tran(&on); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Blinky1::SM::active::off} ........................................... -Q_STATE_DEF(Blinky1, off) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky1::SM::active::off::TIMEOUT1} - case TIMEOUT1_SIG: { - status_ = tran(&on); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Blinky1::SM::active::on} ............................................ -Q_STATE_DEF(Blinky1, on) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky1::SM::active::on} - case Q_ENTRY_SIG: { - BSP_led1_on(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky1::SM::active::on} - case Q_EXIT_SIG: { - BSP_led1_off(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky1::SM::active::on::TIMEOUT1} - case TIMEOUT1_SIG: { - --m_count; - //${AOs::Blinky1::SM::active::on::TIMEOUT1::[m_count>0]} - if (m_count > 0) { - status_ = tran(&off); - } - //${AOs::Blinky1::SM::active::on::TIMEOUT1::[else]} - else { - status_ = tran(&inactive); - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} -//$enddef${AOs::Blinky1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/bsp.hpp b/examples/arm-cm/low-power_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index 438e2a498..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,64 +0,0 @@ -//============================================================================ -// Product: "Low-Power" example -// Last updated for version: 6.6.0 -// Last updated on: 2019-12-10 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -// The following ticks-per-second constants determine the speed of the app. -// The default (#if 1) is the SLOW speed for humans to see the blinking. -// Change the #if 1 into #if 0 for FAST speed appropriate for logic analyzers. -// -#if 1 - #define BSP_TICKS0_PER_SEC 2U - #define BSP_TICKS1_PER_SEC 20U -#else - #define BSP_TICKS0_PER_SEC 200U - #define BSP_TICKS1_PER_SEC 2000U -#endif - -#if QF_MAX_TICK_RATE < 2 - #error this application requires 2 clock tick rates -#endif - -void BSP_init(void); - -void BSP_led0_on(void); -void BSP_led0_off(void); - -void BSP_led1_on(void); -void BSP_led1_off(void); - -void BSP_tickRate0_on(void); -void BSP_tickRate1_on(void); - -#endif // BSP_HPP diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/low-power.qm b/examples/arm-cm/low-power_ek-tm4c123gxl/low-power.qm deleted file mode 100644 index 97070c7f3..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/low-power.qm +++ /dev/null @@ -1,274 +0,0 @@ - - - Low-Power example - - - - - - - - - - - the sole instance of Blinky (singleton) - - - - blink counter - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt0(this, TIMEOUT0_SIG, 0U) - - - - - - (void)e; // unused parameter -subscribe(BTN_PRESSED_SIG); - - - - - - - BSP_tickRate0_on(); -m_count = 4U; -m_timeEvt0.armX(2U, 2U); - m_timeEvt0.disarm(); - - - - - - - - - BSP_led0_on(); - BSP_led0_off(); - - - --m_count; - - - - - - - - - - m_count > 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - the sole instance of Blinky1 (singleton) - - - - - - blink counter - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt1(this, TIMEOUT1_SIG, 1U) - - - - - - (void)e; /* unused parameter */ -subscribe(BTN_PRESSED_SIG); - - - - - - - - - - - - - - - - - BSP_tickRate1_on(); -m_count = 13U; -m_timeEvt1.armX(2U, 2U); - m_timeEvt1.disarm(); - - - - - - - - - - - - - - - - - - - BSP_led1_on(); - BSP_led1_off(); - - - --m_count; - - - - - - - - - - m_count > 0 - - - - - - - - - - - - - - - - - - - - - - - - = &Blinky0::instance; - - - - = &Blinky1::instance; - - - - - - - #ifndef LOW_POWER_HPP -#define LOW_POWER_HPP - -enum BlinkySignals { - BTN_PRESSED_SIG = QP::Q_USER_SIG, // button SW1 was pressed - MAX_PUB_SIG, // the last published signal - - TIMEOUT0_SIG, // timeout for Blinky0 - TIMEOUT1_SIG, // timeout for Blinky1 - MAX_SIG // the last signal -}; - -$declare${AOs::AO_Blinky0} - -#ifdef QXK_HPP_ // QXK kernel? - -extern QP::QXThread XT_Blinky1; -extern QP::QXSemaphore XSEM_sw1; - -#else // QV or QK kernels - -$declare${AOs::AO_Blinky1} - -#endif - -#endif // LOW_POWER_HPP - - - - - #include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//Q_DEFINE_THIS_FILE - -$declare${AOs::Blinky0} - -$define${AOs::AO_Blinky0} - -$define${AOs::Blinky0} - - - - - #include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//Q_DEFINE_THIS_FILE - -$declare${AOs::Blinky1} - -$define${AOs::AO_Blinky1} - -$define${AOs::Blinky1} - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/low_power.hpp b/examples/arm-cm/low-power_ek-tm4c123gxl/low_power.hpp deleted file mode 100644 index 8dc186b01..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/low_power.hpp +++ /dev/null @@ -1,65 +0,0 @@ -//$file${.::low_power.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: low-power.qm -// File: ${.::low_power.hpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::low_power.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef LOW_POWER_HPP -#define LOW_POWER_HPP - -enum BlinkySignals { - BTN_PRESSED_SIG = QP::Q_USER_SIG, // button SW1 was pressed - MAX_PUB_SIG, // the last published signal - - TIMEOUT0_SIG, // timeout for Blinky0 - TIMEOUT1_SIG, // timeout for Blinky1 - MAX_SIG // the last signal -}; - -//$declare${AOs::AO_Blinky0} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky0} ......................................................... -extern QP::QActive * const AO_Blinky0; -//$enddecl${AOs::AO_Blinky0} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ // QXK kernel? - -extern QP::QXThread XT_Blinky1; -extern QP::QXSemaphore XSEM_sw1; - -#else // QV or QK kernels - -//$declare${AOs::AO_Blinky1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky1} ......................................................... -extern QP::QActive * const AO_Blinky1; -//$enddecl${AOs::AO_Blinky1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif - -#endif // LOW_POWER_HPP - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/main.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/main.cpp deleted file mode 100644 index 0ef8ba5fc..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//============================================================================ -// DPP example -// Last updated for version 7.2.2 -// Last updated on 2023-02-28 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - static QP::QSubscrList subscrSto[MAX_PUB_SIG]; - - static QP::QEvt const *blinky0QueueSto[10]; // queue storage for Blinky0 -#ifdef QXK_HPP_ // QXK kernel? - static uint32_t const *xblinky1Stack[64]; // stack for XBlinky1 -#else - static QP::QEvt const *blinky1QueueSto[10]; // queue storage for Blinky1 -#endif // QXK_HPP_ - - QP::QF::init(); // initialize the framework and the underlying RT kernel - - BSP_init(); // initialize the BSP - - // initialize publish-subscribe - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - //QP::QF::poolInit(smlPoolSto, - // sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the xthreads/active objects... - AO_Blinky0->start(1U, // priority - blinky0QueueSto, Q_DIM(blinky0QueueSto), - 0, 0U, 0); - -#ifdef QXK_HPP_ // QXK kernel? - XSEM_sw1.init(0U, 1U); /* binary signaling semaphore */ - XT_Blinky1.start(2U, /* unique QP priority of the AO */ - 0, 0U, /* event queue (not used) */ - xblinky1Stack, /* stack storage (must provide in QXK) */ - sizeof(xblinky1Stack), /* stack size [bytes] */ - 0); /* initial event (or 0) */ -#else // QV or QK kernels - AO_Blinky1->start(2U, // priority - blinky1QueueSto, Q_DIM(blinky1QueueSto), - 0, 0U, 0); -#endif // QXK_HPP_ - - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/README.txt deleted file mode 100644 index 03fe7046e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/README.txt +++ /dev/null @@ -1,60 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvoptx b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvoptx deleted file mode 100644 index f0c9ebfa6..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvoptx +++ /dev/null @@ -1,982 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - low-power-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\blinky0.cpp - blinky0.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\blinky1.cpp - blinky1.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 0 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvprojx b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvprojx deleted file mode 100644 index fef784e7e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/armclang/low-power-qk.uvprojx +++ /dev/null @@ -1,1817 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - low-power-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - low-power-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\low-power-qk.bin .\dbg\low-power-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - low-power-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\low-power-qk.bin .\rel\low-power-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-low-power.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - low-power-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\low-power-qk.bin .\spy\low-power-qk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - low-power-qk - 1 - - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/bsp.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/bsp.cpp deleted file mode 100644 index f8e72874d..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/bsp.cpp +++ /dev/null @@ -1,263 +0,0 @@ -//============================================================================ -// Product: "Low-Power" example, preemptive QK kernel -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-01 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//Q_DEFINE_THIS_FILE - -#ifdef Q_SPY - #error The low-power example does not provide Spy build configuration -#endif - -// ISRs defined in this BSP -------------------------------------------------- -void SysTick_Handler(void); -void GPIOPortA_IRQHandler(void); - -// Local-scope objects and local definitions --------------------------------- - -// bitmask of active sub-systems needed for low-power operation. -// NOTE: shared between the idle thread application, see NOTE1 -static uint32_t volatile l_activeSet; - -// bits in the l_activeSet bitmask -enum { - SYSTICK_ACTIVE, - TIMER0_ACTIVE, - // ... -}; - -#define LED_RED (1U << 1) -#define LED_GREEN (1U << 3) -#define LED_BLUE (1U << 2) -#define BTN_SW1 (1U << 4) - -#define XTAL_HZ 16000000U - -// ISRs used in this project ================================================= -void SysTick_Handler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0 - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -void Timer0A_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - TIMER0->ICR |= (1U << 0); // clear the Timer0 interrupt source - QP::QTimeEvt::TICK_X(1U, nullptr); // process time events for rate 1 - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -void GPIOPortF_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - if ((GPIOF->RIS & BTN_SW1) != 0U) { // interrupt caused by SW1? - static QP::QEvt const pressedEvt(BTN_PRESSED_SIG); - QP::QF::PUBLISH(&pressedEvt, nullptr); - } - GPIOF->ICR = 0xFFU; // clear interrupt sources - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -// BSP functions ============================================================= -void BSP_init(void) { - // Set the clocking to run directly from the crystal - ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | - SYSCTL_XTAL_16MHZ); - SystemCoreClock = XTAL_HZ; - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - SYSCTL->RCGCTIMER |= (1U << 0); // enable Run mode for Timer0 - - // configure the Timers - TIMER0->CTL &= ~(1U << 0); // disable Timer0 before any changes - TIMER0->CFG = 0U; - TIMER0->TAMR |= (0x2 << 0); // Timer0A - TIMER0->TAMR &= ~(1U << 4); - TIMER0->TAILR = XTAL_HZ / BSP_TICKS1_PER_SEC; - TIMER0->IMR &= ~(1U << 0); // disable timer interrupt for now - SYSCTL->RCGCTIMER &= ~(1U << 0); // disable Run mode for Timer0 - - // configure the LEDs and push buttons - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - GPIOF->DIR |= (LED_RED | LED_GREEN | LED_BLUE); // direction: output - GPIOF->DEN |= (LED_RED | LED_GREEN | LED_BLUE); // digital enable - GPIOF->DATA_Bits[LED_RED | LED_GREEN | LED_BLUE] = 0U; // turn off - - // configure the button SW1 - GPIOF->DIR &= ~BTN_SW1; /* input */ - GPIOF->DEN |= BTN_SW1; /* digital enable */ - GPIOF->PUR |= BTN_SW1; /* pull-up resistor enable */ - - /* configure the GPIO interrupt for SW1 */ - GPIOF->IS &= ~BTN_SW1; /* edge detect for SW1 */ - GPIOF->IBE &= ~BTN_SW1; /* only one edge generate the interrupt */ - GPIOF->IEV &= ~BTN_SW1; /* a falling edge triggers the interrupt */ - GPIOF->IM |= BTN_SW1; /* enable GPIOF interrupt for SW1 */ -} -//............................................................................ -void BSP_led0_off(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0U; -} -//............................................................................ -void BSP_led0_on(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0xFFU; -} -//............................................................................ -void BSP_led1_off(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0U; -} -//............................................................................ -void BSP_led1_on(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0xFFU; -} -//............................................................................ -void BSP_tickRate0_on(void) { - // enable SysTick IRQ and Timer - SysTick->CTRL |= (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet |= (1U << SYSTICK_ACTIVE); -} -//............................................................................ -void BSP_tickRate1_on(void) { - SYSCTL->RCGCTIMER |= (1U << 0U); // enable Run mode for Timer0 - TIMER0->CTL &= ~(1U << 0U); // disable Timer0 before any changes - TIMER0->IMR |= (1U << 0U); // enable timer interrupt - TIMER0->CTL |= (1U << 0U); // enable Timer0 after the changes - l_activeSet |= (1U << TIMER0_ACTIVE); -} - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP_TICKS0_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP_TICKS0_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE00 - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(TIMER0A_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - NVIC_SetPriority(GPIOF_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs in the NVIC... - NVIC_EnableIRQ(GPIOF_IRQn); - NVIC_EnableIRQ(TIMER0A_IRQn); -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QK::onIdle(void) { - QF_INT_DISABLE(); - if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) // rate-0 enabled? - && QP::QTimeEvt::noActive(0U)) // no time events at rate-0? - { - // safe to disable SysTick and interrupt - SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet &= ~(1U << SYSTICK_ACTIVE); // mark rate-0 as disabled - } - if (((l_activeSet & (1U << TIMER0_ACTIVE)) != 0U) // rate-1 enabled? - && QP::QTimeEvt::noActive(1U)) // no time events at rate-1? - { - // safe to disable Timer0 and interrupt - TIMER0->CTL &= ~(1U << 0U); // disable Timer0 - TIMER0->IMR &= ~(1U << 0U); // disable timer interrupt - l_activeSet &= ~(1U << TIMER0_ACTIVE); // mark rate-1 as disabled - } - QF_INT_ENABLE(); - - GPIOF->DATA_Bits[LED_RED] = 0xFFU; // turn LED on, see NOTE2 - __WFI(); // wait for interrupt - GPIOF->DATA_Bits[LED_RED] = 0x00U; // turn LED off, see NOTE2 -} - -} // namespace QP - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; -#ifndef NDEBUG - // for debugging, hang on in an endless loop toggling the RED LED... - while (GPIOF->DATA_Bits[BTN_SW1] != 0) { - GPIOF->DATA = LED_RED; - GPIOF->DATA = 0U; - } -#endif - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -// NOTE1: -// The bitmask l_activeSet is **shared** between the QK idle thread and -// the application-level threads. Therefore this variable needs to be -// always accessed in a critical section. -// -// NOTE2: -// One of the LEDs is used to visualize the CPU sleep mode. The LED is turned -// on before entering the sleep mode and turned off after waking up, so that -// the LED stays ON when the CPU sleeps. -// -// NOTE3: -// The additional polling-delay is added to artificially extend the CPU -// activity after the sleep mode is exited, so that the time the idle-LED -// stays off for a bit longer and can be observed on the slower logic analyzer. -// diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/Makefile b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/Makefile deleted file mode 100644 index 9bff43b44..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-03 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := low-power-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - blinky0.cpp \ - blinky1.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/flash.bat b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/low-power-qk.ld b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/low-power-qk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/gnu/low-power-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewd b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewd deleted file mode 100644 index 13d732d4d..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewp b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewp deleted file mode 100644 index c6f4c7440..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.ewp +++ /dev/null @@ -1,3352 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\..\blinky0.cpp - - - $PROJ_DIR$\..\..\blinky1.cpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\low-power.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.eww b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.eww deleted file mode 100644 index a988ab7f6..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\low-power-qk.ewp - - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.icf b/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qk/iar/low-power-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qp_config.hpp b/examples/arm-cm/low-power_ek-tm4c123gxl/qp_config.hpp deleted file mode 100644 index ed39ebd52..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qp_config.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// The maximum number of system clock tick rates -#define QF_MAX_TICK_RATE 2U - -#endif // QP_CONFIG_HPP_ diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/README.txt deleted file mode 100644 index 03fe7046e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/README.txt +++ /dev/null @@ -1,60 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvoptx b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvoptx deleted file mode 100644 index 587cd72ae..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvoptx +++ /dev/null @@ -1,982 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - low-power-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\..\blinky0.cpp - blinky0.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\blinky1.cpp - blinky1.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvprojx b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvprojx deleted file mode 100644 index e95503f45..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/armclang/low-power-qv.uvprojx +++ /dev/null @@ -1,1808 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - low-power-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - low-power-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\low-power-qv.bin .\dbg\low-power-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-rel - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - low-power-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\low-power-qv.bin .\rel\low-power-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - low-power-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-spy - 0x4 - ARM-ADS - 5060020::V5.06 (build 20)::ARMCC - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - low-power-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\low-power-qv.bin .\spy\low-power-qv.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - blinky1.cpp - 8 - ..\..\blinky1.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/bsp.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/bsp.cpp deleted file mode 100644 index 2a2253bdb..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/bsp.cpp +++ /dev/null @@ -1,254 +0,0 @@ -//============================================================================ -// Product: "Low-Power" example, cooperative QV kernel -// Last Updated for Version: 6.9.2a -// Date of the Last Update: 2021-01-31 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//Q_DEFINE_THIS_FILE - -#ifdef Q_SPY - #error The low-power example does not provide Spy build configuration -#endif - -// ISRs defined in this BSP -------------------------------------------------- -void SysTick_Handler(void); -void GPIOPortA_IRQHandler(void); - -// Local-scope objects and local definitions --------------------------------- - -// bitmask of active sub-systems needed for low-power operation. -// NOTE: shared between the idle thread application, see NOTE1 -static uint32_t volatile l_activeSet; - -// bits in the l_activeSet bitmask -enum { - SYSTICK_ACTIVE, - TIMER0_ACTIVE, - // ... -}; - -#define LED_RED (1U << 1) -#define LED_GREEN (1U << 3) -#define LED_BLUE (1U << 2) -#define BTN_SW1 (1U << 4) - -#define XTAL_HZ 16000000U - -// ISRs used in this project ================================================= -void SysTick_Handler(void) { - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0 - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -void Timer0A_IRQHandler(void) { - TIMER0->ICR |= (1U << 0); // clear the Timer0 interrupt source - QP::QTimeEvt::TICK_X(1U, nullptr); // process time events for rate 1 - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -void GPIOPortF_IRQHandler(void) { - if ((GPIOF->RIS & BTN_SW1) != 0U) { // interrupt caused by SW1? - static QP::QEvt const pressedEvt(BTN_PRESSED_SIG); - QP::QF::PUBLISH(&pressedEvt,nullptr); - } - GPIOF->ICR = 0xFFU; // clear interrupt sources - QV_ARM_ERRATUM_838869(); -} - -// BSP functions ============================================================= -void BSP_init(void) { - // Set the clocking to run directly from the crystal - ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | - SYSCTL_XTAL_16MHZ); - SystemCoreClock = XTAL_HZ; - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - SYSCTL->RCGCTIMER |= (1U << 0); // enable Run mode for Timer0 - - // configure the Timers - TIMER0->CTL &= ~(1U << 0); // disable Timer0 before any changes - TIMER0->CFG = 0U; - TIMER0->TAMR |= (0x2 << 0); // Timer0A - TIMER0->TAMR &= ~(1U << 4); - TIMER0->TAILR = XTAL_HZ / BSP_TICKS1_PER_SEC; - TIMER0->IMR &= ~(1U << 0); // disable timer interrupt for now - SYSCTL->RCGCTIMER &= ~(1U << 0); // disable Run mode for Timer0 - - // configure the LEDs and push buttons - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - GPIOF->DIR |= (LED_RED | LED_GREEN | LED_BLUE); // direction: output - GPIOF->DEN |= (LED_RED | LED_GREEN | LED_BLUE); // digital enable - GPIOF->DATA_Bits[LED_RED | LED_GREEN | LED_BLUE] = 0U; // turn off - - // configure the button SW1 - GPIOF->DIR &= ~BTN_SW1; /* input */ - GPIOF->DEN |= BTN_SW1; /* digital enable */ - GPIOF->PUR |= BTN_SW1; /* pull-up resistor enable */ - - /* configure the GPIO interrupt for SW1 */ - GPIOF->IS &= ~BTN_SW1; /* edge detect for SW1 */ - GPIOF->IBE &= ~BTN_SW1; /* only one edge generate the interrupt */ - GPIOF->IEV &= ~BTN_SW1; /* a falling edge triggers the interrupt */ - GPIOF->IM |= BTN_SW1; /* enable GPIOF interrupt for SW1 */ -} -//............................................................................ -void BSP_led0_off(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0U; -} -//............................................................................ -void BSP_led0_on(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0xFFU; -} -//............................................................................ -void BSP_led1_off(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0U; -} -//............................................................................ -void BSP_led1_on(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0xFFU; -} -//............................................................................ -void BSP_tickRate0_on(void) { - // enable SysTick IRQ and Timer - SysTick->CTRL |= (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet |= (1U << SYSTICK_ACTIVE); -} -//............................................................................ -void BSP_tickRate1_on(void) { - SYSCTL->RCGCTIMER |= (1U << 0); // enable Run mode for Timer0 - TIMER0->CTL &= ~(1U << 0); // disable Timer0 before any changes - TIMER0->IMR |= (1U << 0); // enable timer interrupt - TIMER0->CTL |= (1U << 0); // enable Timer0 after the changes - l_activeSet |= (1U << TIMER0_ACTIVE); -} - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup() { - // set up the SysTick timer to fire at BSP_TICKS0_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP_TICKS0_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE00 - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(TIMER0A_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - NVIC_SetPriority(GPIOF_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs in the NVIC... - NVIC_EnableIRQ(GPIOF_IRQn); - NVIC_EnableIRQ(TIMER0A_IRQn); -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QV::onIdle() { - if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) // rate-0 enabled? - && QP::QTimeEvt::noActive(0U)) // no time events at rate-0? - { - // safe to disable SysTick and interrupt - SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet &= ~(1U << SYSTICK_ACTIVE); // mark rate-0 as disabled - } - if (((l_activeSet & (1U << TIMER0_ACTIVE)) != 0U) // rate-1 enabled? - && QP::QTimeEvt::noActive(1U)) // no time events at rate-1? - { - // safe to disable Timer0 and interrupt - TIMER0->CTL &= ~(1U << 0); // disable Timer0 - TIMER0->IMR &= ~(1U << 0); // disable timer interrupt - l_activeSet &= ~(1U << TIMER0_ACTIVE); // mark rate-1 as disabled - } - - GPIOF->DATA_Bits[LED_RED] = 0xFFU; // turn LED on, see NOTE2 - QV_CPU_SLEEP(); // atomically enter sleep mode and enable interrupts - GPIOF->DATA_Bits[LED_RED] = 0x00U; // turn LED off, see NOTE2 -} - -} // namespace QP - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; -#ifndef NDEBUG - // for debugging, hang on in an endless loop toggling the RED LED... - while (GPIOF->DATA_Bits[BTN_SW1] != 0) { - GPIOF->DATA = LED_RED; - GPIOF->DATA = 0U; - } -#endif - NVIC_SystemReset(); -} - -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -// NOTE1: -// The bitmask l_activeSet is **shared** between the QV idle thread and -// the application-level threads. Therefore this variable needs to be -// always accessed in a critical section. -// -// NOTE2: -// One of the LEDs is used to visualize the CPU sleep mode. The LED is turned -// on before entering the sleep mode and turned off after waking up, so that -// the LED stays ON when the CPU sleeps. -// diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/Makefile b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/Makefile deleted file mode 100644 index e5e916c5b..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/Makefile +++ /dev/null @@ -1,310 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QV kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-03 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := low-power-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - blinky0.cpp \ - blinky1.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/flash.bat b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/low-power-qv.ld b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/low-power-qv.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/gnu/low-power-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/README.txt deleted file mode 100644 index b4203fb7b..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewd b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewd deleted file mode 100644 index 13d732d4d..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewp b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewp deleted file mode 100644 index eb5c157d4..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.ewp +++ /dev/null @@ -1,3349 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky0.cpp - - - $PROJ_DIR$\..\..\blinky1.cpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\low-power.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.eww b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.eww deleted file mode 100644 index fb3e97b45..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\low-power-qv.ewp - - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.icf b/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qv/iar/low-power-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/README.txt deleted file mode 100644 index 03fe7046e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/README.txt +++ /dev/null @@ -1,60 +0,0 @@ -About this Example -================== -This example demonstrates how to use the uVision IDE together with -the MDK-ARM toolchain. - -*** -NOTE: This example requires installing the following Software Pack -in the Keil uVision: Keil::TM4C_DFP. -*** - - -uVision Project File -==================== -The MDK-ARM uVision project file provided with this example uses -relative paths to the QP/C framework location (includes, port, and -libraries. These relative paths must be modified when the project -is moved to different relative location. - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the -command-line options for the ARM assembler (see the Asm tab in -the "Options for Target" dialog box in uVision). Specifically, -you should define symbols: Stack_Size=xxx Heap_Size=yyy, where -xxx represents a numerical value of stack size and yyy the -numerical value of the heap size. - -*** -NOTE: -C++ programs seem not to tolerate heap size of 0. Therefore it is -recommended to set the Heap_Size symbol to a minimal value of 16. -*** - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - -The file startup_TM4C123GH6PM.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** - \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvoptx b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvoptx deleted file mode 100644 index bac0f0336..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvoptx +++ /dev/null @@ -1,1018 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - low-power-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - DLGUARM - ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈ`» -´­­ª¤ô - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - low-power-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\xblinky1.cpp - xblinky1.cpp - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\..\blinky0.cpp - blinky0.cpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\..\main.cpp - main.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 0 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 6 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 7 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - 2 - 8 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 12 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 13 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk.cpp - qxk.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - qxk_mutex.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - qxk_sema.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - qxk_xthr.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - qxk_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvprojx b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvprojx deleted file mode 100644 index 7e518450e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/armclang/low-power-qxk.uvprojx +++ /dev/null @@ -1,1862 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - low-power-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - low-power-qxk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\low-power-qxk.bin .\dbg\low-power-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - xblinky1.cpp - 8 - ..\xblinky1.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - low-power-qxk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\low-power-qxk.bin .\rel\low-power-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qxk.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - xblinky1.cpp - 8 - ..\xblinky1.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - low-power-spy - 0x4 - ARM-ADS - 5060528::V5.06 update 5 (build 528)::ARMCC - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - low-power-qxk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\low-power-qxk.bin .\spy\low-power-qxk.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qxk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - xblinky1.cpp - 8 - ..\xblinky1.cpp - - - blinky0.cpp - 8 - ..\..\blinky0.cpp - - - main.cpp - 8 - ..\..\main.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qxk.cpp - 8 - ..\..\..\..\..\src\qxk\qxk.cpp - - - qxk_mutex.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - qxk_sema.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_sema.cpp - - - qxk_xthr.cpp - 8 - ..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - - QP_port - - - qxk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qxk\armclang\qxk_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - - - - - low-power-qxk - 1 - - - - -
diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/bsp.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/bsp.cpp deleted file mode 100644 index 207e4cc94..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/bsp.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//============================================================================ -// Product: "Low-Power" example, dual-mode QXK kernel -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-01 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//Q_DEFINE_THIS_FILE - -#ifdef Q_SPY - #error The low-power example does not provide Spy build configuration -#endif - -// ISRs defined in this BSP -------------------------------------------------- -void SysTick_Handler(void); -void GPIOPortA_IRQHandler(void); - -// Local-scope objects and local definitions --------------------------------- - -// bitmask of active sub-systems needed for low-power operation. -// NOTE: shared between the idle thread application, see NOTE1 -static uint32_t volatile l_activeSet; - -// bits in the l_activeSet bitmask -enum { - SYSTICK_ACTIVE, - TIMER0_ACTIVE, - // ... -}; - -#define LED_RED (1U << 1) -#define LED_GREEN (1U << 3) -#define LED_BLUE (1U << 2) -#define BTN_SW1 (1U << 4) - -#define XTAL_HZ 16000000U - -// ISRs used in this project ================================================= -void SysTick_Handler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0 - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -void Timer0A_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - TIMER0->ICR |= (1U << 0); // clear the Timer0 interrupt source - QP::QTimeEvt::TICK_X(1U, nullptr); // process time events for rate 1 - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -void GPIOPortF_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - if ((GPIOF->RIS & BTN_SW1) != 0U) { // interrupt caused by SW1? - static QP::QEvt const pressedEvt(BTN_PRESSED_SIG); - QP::QF::PUBLISH(&pressedEvt, nullptr); - XSEM_sw1.signal(); - } - GPIOF->ICR = 0xFFU; // clear interrupt sources - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -// BSP functions ============================================================= -void BSP_init(void) { - // Set the clocking to run directly from the crystal - ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | - SYSCTL_XTAL_16MHZ); - SystemCoreClock = XTAL_HZ; - - // NOTE: The VFP (hardware Floating Point) unit is configured by QXK - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - SYSCTL->RCGCTIMER |= (1U << 0); // enable Run mode for Timer0 - - // configure the Timers - TIMER0->CTL &= ~(1U << 0); // disable Timer0 before any changes - TIMER0->CFG = 0U; - TIMER0->TAMR |= (0x2 << 0); // Timer0A - TIMER0->TAMR &= ~(1U << 4); - TIMER0->TAILR = XTAL_HZ / BSP_TICKS1_PER_SEC; - TIMER0->IMR &= ~(1U << 0); // disable timer interrupt for now - SYSCTL->RCGCTIMER &= ~(1U << 0); // disable Run mode for Timer0 - - // configure the LEDs and push buttons - SYSCTL->RCGCGPIO |= (1U << 5); // enable Run mode for GPIOF - GPIOF->DIR |= (LED_RED | LED_GREEN | LED_BLUE); // direction: output - GPIOF->DEN |= (LED_RED | LED_GREEN | LED_BLUE); // digital enable - GPIOF->DATA_Bits[LED_RED | LED_GREEN | LED_BLUE] = 0U; // turn off - - // configure the button SW1 - GPIOF->DIR &= ~BTN_SW1; /* input */ - GPIOF->DEN |= BTN_SW1; /* digital enable */ - GPIOF->PUR |= BTN_SW1; /* pull-up resistor enable */ - - /* configure the GPIO interrupt for SW1 */ - GPIOF->IS &= ~BTN_SW1; /* edge detect for SW1 */ - GPIOF->IBE &= ~BTN_SW1; /* only one edge generate the interrupt */ - GPIOF->IEV &= ~BTN_SW1; /* a falling edge triggers the interrupt */ - GPIOF->IM |= BTN_SW1; /* enable GPIOF interrupt for SW1 */ -} -//............................................................................ -void BSP_led0_off(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0U; -} -//............................................................................ -void BSP_led0_on(void) { - GPIOF->DATA_Bits[LED_GREEN] = 0xFFU; -} -//............................................................................ -void BSP_led1_off(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0U; -} -//............................................................................ -void BSP_led1_on(void) { - GPIOF->DATA_Bits[LED_BLUE] = 0xFFU; -} -//............................................................................ -void BSP_tickRate0_on(void) { - // enable SysTick IRQ and Timer - SysTick->CTRL |= (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet |= (1U << SYSTICK_ACTIVE); -} -//............................................................................ -void BSP_tickRate1_on(void) { - SYSCTL->RCGCTIMER |= (1U << 0U); // enable Run mode for Timer0 - TIMER0->CTL &= ~(1U << 0U); // disable Timer0 before any changes - TIMER0->IMR |= (1U << 0U); // enable timer interrupt - TIMER0->CTL |= (1U << 0U); // enable Timer0 after the changes - l_activeSet |= (1U << TIMER0_ACTIVE); -} - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup() { - // set up the SysTick timer to fire at BSP_TICKS0_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP_TICKS0_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE00 - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(TIMER0A_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - NVIC_SetPriority(GPIOF_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs in the NVIC... - NVIC_EnableIRQ(GPIOF_IRQn); - NVIC_EnableIRQ(TIMER0A_IRQn); -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QXK::onIdle() { - QF_INT_DISABLE(); - if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) // rate-0 enabled? - && QP::QTimeEvt::noActive(0U)) // no time events at rate-0? - { - // safe to disable SysTick and interrupt - SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); - l_activeSet &= ~(1U << SYSTICK_ACTIVE); // mark rate-0 as disabled - } - if (((l_activeSet & (1U << TIMER0_ACTIVE)) != 0U) // rate-1 enabled? - && QP::QTimeEvt::noActive(1U)) // no time events at rate-1? - { - // safe to disable Timer0 and interrupt - TIMER0->CTL &= ~(1U << 0U); // disable Timer0 - TIMER0->IMR &= ~(1U << 0U); // disable timer interrupt - l_activeSet &= ~(1U << TIMER0_ACTIVE); // mark rate-1 as disabled - } - QF_INT_ENABLE(); - - GPIOF->DATA_Bits[LED_RED] = 0xFFU; // turn LED on, see NOTE2 - __WFI(); // wait for interrupt - GPIOF->DATA_Bits[LED_RED] = 0x00U; // turn LED off, see NOTE2 -} - -} // namespace QP - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; -#ifndef NDEBUG - // for debugging, hang on in an endless loop toggling the RED LED... - while (GPIOF->DATA_Bits[BTN_SW1] != 0) { - GPIOF->DATA = LED_RED; - GPIOF->DATA = 0U; - } -#endif - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -// NOTE1: -// The bitmask l_activeSet is **shared** between the QXK idle thread and -// the application-level threads. Therefore this variable needs to be -// always accessed in a critical section. -// -// NOTE2: -// One of the LEDs is used to visualize the CPU sleep mode. The LED is turned -// on before entering the sleep mode and turned off after waking up, so that -// the LED stays ON when the CPU sleeps. -// -// NOTE3: -// The additional polling-delay is added to artificially extend the CPU -// activity after the sleep mode is exited, so that the time the idle-LED -// stays off for a bit longer and can be observed on the slower logic analyzer. -// diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/Makefile b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/Makefile deleted file mode 100644 index ee7133213..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/Makefile +++ /dev/null @@ -1,313 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, QXK kernel, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-03 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := low-power-qxk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qxk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qxk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - blinky0.cpp \ - xblinky1.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qxk.cpp \ - qxk_mutex.cpp \ - qxk_sema.cpp \ - qxk_xthr.cpp \ - qxk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/README.txt b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/README.txt deleted file mode 100644 index 18bf73076..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built in two different ways: -- from the command prompt with the provided Makefile. -- from the TI Code Composer Studio with the provided CCS project. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/flash.bat b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/low-power-qxk.ld b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/low-power-qxk.ld deleted file mode 100644 index 5139ce62b..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/gnu/low-power-qxk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for EK-TM4C123GXL, GNU-ARM linker -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewd b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewd deleted file mode 100644 index 13d732d4d..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewp b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewp deleted file mode 100644 index 7a99c126d..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.ewp +++ /dev/null @@ -1,3367 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\..\blinky0.cpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\low_power.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\xblinky1.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.eww b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.eww deleted file mode 100644 index 4959d641a..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\low-power-qxk.ewp - - - - - diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.icf b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/iar/low-power-qxk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/xblinky1.cpp b/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/xblinky1.cpp deleted file mode 100644 index d036f3c5e..000000000 --- a/examples/arm-cm/low-power_ek-tm4c123gxl/qxk/xblinky1.cpp +++ /dev/null @@ -1,68 +0,0 @@ -//============================================================================ -// Product: "Low-Power" example, dual-mode QXK kernel -// Last Updated for Version: 6.7.0 -// Date of the Last Update: 2019-12-27 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "low_power.hpp" -#include "bsp.hpp" - -//Q_DEFINE_THIS_FILE - -// local objects ------------------------------------------------------------- -static void XBlinky1_run(QP::QXThread * const me); - -// global objects ------------------------------------------------------------ -QP::QXThread XT_Blinky1(&XBlinky1_run, // thread routine - 1U); // associate the thread with tick rate-1 -QP::QXSemaphore XSEM_sw1; - -//............................................................................ -static void XBlinky1_run(QP::QXThread * const me) { - (void)me; // unused parameter - bool isActive = false; - for (;;) { - if (!isActive) { - XSEM_sw1.wait(); - isActive = true; - } - else { - BSP_tickRate1_on(); // turn on the tick rate-1 ! - for (uint8_t count = 13U; count > 0U; --count) { - BSP_led1_on(); - QP::QXThread::delay(2U); - BSP_led1_off(); - QP::QXThread::delay(2U); - } - isActive = false; - } - } -} diff --git a/examples/arm-cm/qp_arm-cm.jpg b/examples/arm-cm/qp_arm-cm.jpg deleted file mode 100644 index 5d206b5b91e0ca4ba98813822a8e0ce13b344da9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19322 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 HyovwWvWaYd diff --git a/examples/arm-cm/qspy-output.png b/examples/arm-cm/qspy-output.png deleted file mode 100644 index ee764450fc698007b726222ee98e0c4ff8a2347d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30404 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

48s!6PLv3#1J$zTBSi{a{Ql)}O! zrDpT2z@_C!k69H`L!9)4Ro-`l$OaTx^zzyVv;+ipxH|~DEff676=f`NNVV1NNnf<~ zt6yKt_*B#>IO#@hlaa(?@hNG_@)>Yy=q~Yc+ap?F>ckVt#OUrW0`E9-a{-g%I&rcB zGE1c(WYuxLTKn2Ng>SiG?AA;NK`Y?B_Ct!ex|7u1FU?UQHr+Z}H`!Q~<`hEFVs7a* zPu$RwZ0lHm$*(wRT=bGuqqUc^$bBKESG(NOEyr*$bfb;gBvam3;zgZs9ljpM&^y+u zO^;gT`oF%pcXUanENDjz`b7d*sB~U+(HW!+K?F}U43%V(VJ5xkYe3qtU8lX|AmQ_` z*g_M2=yro#YO=D9#gaEp)U|I+N*sUgWZ7%xoBtPr{0ArAPt!5o=B0w$Mr-;(Lz(?E zgaeAY$w-6tawFusOmI;Zr_&zbUl6I&i#(=}I)#(N=}AZRD(4kF3A8WtrI;y%W=2_P zT#nK=!e_s2DyCee_H2%OSmyWRL(!<`YEQ)HukA!zuhm@B>Noeho!G}5jLZBvSQ@F` zs?-PIr%dWl0tJNlN#Uy3)4$X#rjTaGzT;&D&xb87s8vKUNMAdeoo87M`Rf}ItDYK+ z|1wf-%0rU5!y+GH-hY?T{;crZcis3mlv_{~P#15sHP&8jTly07Sz(2RYwXQRLX%+8 z+Q=#mamG9Vkp-rbVml&(kImrDioeZ9t;R0Q({PH(xYL_#@4b{Et{~0uK7~OrFRjk^ zoOx@Prs6VsXl;Y3Yo&oTE`rBzgQ#Ib+=jODr(Fs{iA9=mDMJH>FzgTDm{Y$@|+Yl6_XaQYAA=TR}4KHJJ zo%@p28&87MJT9TD-=wIp1GTR_S63wE160;4m~-x71@>}}W-OM@lutIW`JvSfH%?Vj zaf?;SzYJ~1$hT@vN~YTQU5*a@iyK3}-(N~@_bi1j&f zz3w|v(I6}NDmx}Yzx{d_^!FUy=4C)#5)cV`VP(8JB>ayo>J5$i!+HDUC33f8*AMS9 ze)C&-`Y%X#90xApz(7%JWa5tQIj04K+Vb^{F5HBaUskkh=5izO1hbjt`=h^g^D8?K z$DE?q#lxl3AjWpRcak=nB_H@=vw_?;fgo;{>LaXJDN zvh`-#AD0S;OMU58TjsCH;>VEzKk5XGAf)9pdB^F{#DFu1W#Os&h98EGsc(`hQ~(KO z4MAxl;-ofX5iYyWN)?yLOY<105VLl%pP#K=?{k0XR~RgZWl$QuyYbsUI)m3FBKg}w z-Fu40jZ33}3}dzQ1;hD9h^HpQ+Bn9cDCe11UJ7C9;DA>oV32|aEK}N15EW&S8)+Wr zfaKpVO=jx}JyJJ${lmh1vJU{a3pN)HUxXddNFzHp@W7asZ|_~tnRv4}*&}X&-G_5u zS&8R=570>T1hb!;fgi0`7Lelhv+V)dg);9$E%s*5J|~jEQ}r#`q3N9ZPOa5 zt}h1-BXht|VoRUnT@B8T-Lyw&r6JuvN)14QmU(shHlwi__;nklF7In<+F!-}ToYiO za`w+U0it!HTNv|{x3K$assqY*}(+b}PR_X-xf&7))tcmw#~cIXR~x4KI* zWc072KDyA=+sDq7%`=1SPrq*at1lF*DcT4nL!TUtij2Bk%G6vl{0$K|n^ebk3dAUX zKQ=#a!coswR5PpX_i;1%mRBYspXpeXXDU{%_7j{M6c=T_x@bs`5{7n2>-^k5+FCAV znW%fpD=$nQoR2M}M7*xl%leGR+9A&fT;Z`E?=6^@6*g9;q{sXbuRLZLj4JxgiO_Y= z0*^nVEetKZwe|v`O`H$Sxt|e>Pq@K~Pr8I&u*bWQ<)+gnjXwd;8v`;GjwQ339(S8% zEP;Z9catl0#@d^v2-6Fl1@m^gM`cCgT~#xkwz)H6>TiK2q3fzHz#c#!dm5EL5~G52 zR21K3r5vL}gp~>E01suq(bCwjKEv-1g%8L3xD$*=YiX?+yzmE54XS z5rW4qj_RJBfTQa<`GMDoXXd%YGDqym(X>PB%^_ES$HY%)Nb_lcf}b!u;yUnHHza-J z3oAkt_Zj>44(@YB;X}97m7cp5*hp-lgTY`5hAo+ea@_y8`8n`wF`*u)@U(N!UmL(!qr=mK?)cqP^VmdzO>3NZExM4nu1jF zI2H1M|5=(*s9zu_8kFM*rg%PFqZ7m3N3iI&dJXl%L&b~E66*>K|3YEXNKedRe zFhVtbdL%O9K_}MR8ch+4`sc|uN^xg-;Thg6VQ$j~`<2dD6joOyX2dH)T*O5Q8lP+A zv8Xc$7U&FWpr3{En$v?U-}5oi&G1Hip#P1f{FNJa=@Ag|7C-{tN-QZn1SCk(?|VfB z!N~cXJ!ME;tXuvbFYO{C-LP7_x1gls#io3!5rVJiMJPT30{%!nDKIUCQ623H09|7tCp*sho+?=?7yTVmXni3_;7W*P0^dnqpOa|M+iB;TJs~>YMN3OeVu}i zO&o4We4w`hrZqr{EDYMHvuh=|?y8ak=S!DymJLDJEs9PHZLs>3RI_f?ID+U8h+h3h zSmQKE+AnH-SMXQD_DdPE5)CIwhbD+V43q2r-VMN??#b29htEIX`5_;5^R((~5RYA| zV5C;?K3+NGCLxYKY+pZETxJ*OFIsqj3<|Kf z+*^}%bQM1^>-Lq@=uZt-NhRvhe%i}nX>lxigG8hk(O`~@iK5G<9O%vcuhfU{=$zzS@YrJ3pRlgamltLvDX z*Au1g9_O++9d2V0s+5;K@qe@NpZE)T zD3dCsF86%t?l$x=F)nA9v?%!>OHnXkZ5p3_b6_)!IsjDuEwmw- z3<_i_hQKU}_4Eh|-5;f*qOCF?j|z>Y6OW07bp*Q>XHl*I1fZrd7S%{g$*@TArtUra z^#1X3t3EpWMAz;@F8T(p!@_GS&P;M5L`V3*G1GQ<(V;+eO|S$1%xS{?)@X+@Jw7wL z>ej9Q+t~J671I_xYCQf0Zd!-R30?smECs0wkdBBk_HzDwCImr$VDCAO4S z4AZ(+^z~l9WFiZ+S}UQLEDQ^cLkVZ1di2YGwpeT)!~S6QU}gg)a*mI{Vyxdb(Df!x zwZdMFF@MpW-)*sBiH@e+>?1#qm(xyXTkma5q(p-lObOLD) z-EA!ZNp|42;h#)X93tV3wN~+hsV5}bk(+XnA_I>ANwZ);}Wu)Mh zlAHd8zrR-IrN+~vQVmt*b%PrP=ICep=%=P-S1gcMR^?79VDn#mr>k!f8H3(U{7E`7syjkj8qz-z&asE zutJNR(rju5`nc#Z5lhfv{lCp^Cis_{o+56bHIHZ_i#am+NC1^QNj;A}Kp3d?1xLN@buJ5X@6Asd31jce_DDrB6aUr=wMdY2AHR;wE-FYY2h$MwqC55?9b4 z1i8QW>gDGhz`oV~DJWx_+jwYz%2Hh9%3opI z%ddaf;dPPTWn?2$TYIWstDP>!Vfdz-;^iDFUtVi0YEXg+M7hTCMF40LGdW1;3d{r- zq7U=#p)2+;0KO&MD?40hx!Tuo(AuV=V^DGWyof=b|IoHc01|q%$`Gf_#p~aH&f*F* zv(WuE6@k_<9ih*ZjExZCwRUhE7n%Z`(vCI{q8RjVr!C%BAHEq5O>G0+Z<%!*0<$37 zJmPmHS9*Lx@*VDpE-LxM^5={eoI$FVnONI3y4{)(jaT~jE~}jLfsWi0)o!|rMR5W( zQif$-(W#F*bNKCbHK{qC9(wa;Cbv(UhdV>8J60q|zlEJ}jzwg6)hy{{)(6X7b^b&X z>urR%%lRhoLFTPGniIkk#Rji~K~W~dBG~F9p{NqHCZ?5Kf(NWRulOpi|B3uaqxVvE zb$KW1{k~J^utBAAj^b0E{!mCOv}8TK7U$inpQ(%^zf9Ua zWYOkm2LMXCi-}XhS`e)CE&~1V_K9_Jr+T!eyA`-=JGS6YVa+bf$!nH4f4WxqV0 zSW)jO>Yj{LWxM`_Q>Savm+jT$y|mfB&nK<|jlx+Xb%YxxsstXyx&1Z~@Vl8inkAhJ zB{gV2wW5zC?Bs$^Bn9sdoTXbD@EvbvpQjzSW-J_RU(Bdu@_NNd#MGE1DJNp&P5J19t6M(o)pQ9Efoeuo4~6EzpA( zmo~2@{~I5U3C`s}ulM&TBQ8{g1Ah&0Tvu4<*LgjvZOJckdL=$Adk!spFc6iKtAXQj zfM>9xgQ0{~bb;J2?;>6SqH7ndUbQBwPw@^8Iy`8*)8G8)qRz(nI_}g0N4USgWs<&5 zSt;hvV5)nz&yRLv2tAuS^HcT1mV{qgiGKo>ru{&fVo}xE#b*D8iB@9)qk0(7&i~~S z0LnK!agtT9^YwX_vNPa7-)YB;kJ9~SWAt+mxlwAlxd#=%>{~zEIMp0H`aEK*MJD{3 zOO#`V#@96}C1C@K%YYR&3PW|yDiNN8vPlTJn3ubLVW)>ALjz?JWs z;@dn_wBeneq#Szjxl4V0y*`pmh1?JeZI#rM+~@3G--*x`Fgq(q*?tk;PD`p_QZ|st zLRqNq{J4JRns_NoY2gPhDg-m>Lpg(u$Yh_2-IHfvD!bYA!JYssqNEkx&cKA?+Zq1x z$<1ZFaxARAFefAOR3(>xR80Zhq$eR7-!<--6?OxQHQR?;H&j_9Fnus=O2uMFDdsA zsi}y#vOht`S}8t`i;K2?3{B+K^n?GqWi}1A%=qHP(3w?Z4kAF`9tSID z)@8&~-s1kn*zwaAnyHN}J22UZH>{^5GEH@4Nw+{rdkYR^UW;J_rWHR(z+tymx)Mnx$WW7W#l@qlp z7Lt9`_xAZZxRn5NQ_tg!v*-`KU$V^H&=CcjQ^s%~X}dtB^rym`aT~-bm3xK%g!gR~ z*KPz;X-c(Sa<4y6eAdyzd~fbJyqt<^s%iWbSZ2e@IfZU8?&jQ?lhl#@W#RVGbJhL* zD)N2SoIM;o##{^Y0CVgWNFPGngd%pou}%Gk^J7P|Z-?=8L?QkPFSxAuMuPilYXb|k zjN=ccw;6Cs^w5#5W!#iqVkcUiz78$gSVAFaBUGAXzrun4$`U{lw2X1Pzeqv~cy_Q` zI(o|VR_A_c!mkLa-*~+~H2ga24R=bxDUFx6_GzdGr18c%SNdqmSC}oiWaojmSNLT- zIZJDX6Z|Y2SQkypVt=f(@=%A(J%LKSg&lG%2JD`H{QK><6L3ob_M7wjax!@Ky665G zMU(C90d|rHzBH)G(Q3zqd=f>!qbVh7b~6}^=vL0PEQ&xyp^|nA(Wo(wUzx3eK(-m{+x!^?UO(!H*e9@&J_!j z3oL<`s>0u~3n*Mgm;{WGzwG*7?46_TD{j=8%***^mA`{dkej_9Ccb{#UTn+gt zV7Wg=b6a>{_vIpnN_RW9HdVEnQgaiHgB$ey`^v@Or_Y$?U!aWn@eKTZf!* zWr4Ud5isGdW9RbfGJ2tA!$$mowb=+Sp%sdGMTq(b?jS%bR?dOk%dese8?$|}0NE=i zwgFaPTmBp?@mXd8^%;m42S~*cGk8CV=;dUMKN}{482sG+3%fClg0NfvrHgOa%c^fR ztn+j=f83ouDHB=x-1umZ!U`@tJt})QI=K|wryw(gDk(%MKyb=2)8?q>8YMbdH7_|<34`AdXuWX3hW~Md?&q+y-3aQf!30HN-!AJm6MJy z#5sHp{D*oo*ru1paGUSZ{=_h$V_?n)K#lYY+JM|OpkY>9a`+1#_Kr!EFi)ZDc1lg~{9_vGqb zk}c#8kOEB+VGs}@ZY|LIO1kge>$i0;+rMc@c7=4tne9L;#KlzB6p$7jtl(l#X!Kzd z%c2xi18dp#BPIyWC)zReI4E0Ve8!I5pwAVRtBBDfWC} zjVo`(AZH{r%0ZQW$B9!&<(6h39_F(UgqL8Fx%*hyPBpb-tZzvm@`Dd<$#Yy~MOM+6 zv2q0Xn11SPz4Vn!T_fhsn9HlXfhcl!j;i@?9?Rd&no{)WVlG_yZb^GLv-6M0+62&# zZC79v{GV8^zV3_zCfhG^BmT}e>3%@^5oYip!MbcN!>jj@Y*(%bC#%p~0UpTLK+@>W zpbB{{qv&siWzsQF>Zk7CW@QJR;*k8>VzCPWwi<$E}0>&A_C;^OvS zN#M;vUQIirR9?8j5=Gmj`kG%CQFi0--Bo{9@6~1zMpH-%DbZ?FkC8UaTPl%O^)O-p z?d40X2ie*y&0yErt|H%Fkl_z6Z*Sw^7au%-aqIjQMx&CoXmYSoCxf0S_FIDTl0KUaa-S6WJN-zA1>LqF(bUanakAmPDMVAQW;NBA^# z6dzH&uEPW#xse>E5uq@#$ik|oWh zyn$0Ufr!uMjxJy_+A>g$rnJ$0Pg1XuPwg-uzS|QA;!w23osyVlcd(F7oddz2TItpWDP!3^dOUM zLCV8bkd*n)zjvVhe;yY=qu$!>eL@5GQ`9@isKxT_n;p!36TuGHFY& zzD_&C*k#N-tgVDa)BXx8=$fAW`ZnWN*jbzQ2qt7{K4Xz=KrV|q?lKyQF}x&KOW(m3 zSF6Wdy>d)KbdZ;P{8=KLmUOABE_d-tZiCHL&Yf%s1Qp`T(yp_%=9X)UvPkx4A_qm>qS55b1Ss8-kR(%{?15nJk)CvDQo~b5 zeJm_z_X#t>xnkAwbd?j-n_r+l3(CYrXXX!-uw~WrMY2r0L&d9!Ke!W#!r&_5ks36v zGST*N7}42s#=!2)gpP8f+XMGZ-X#W*9=fXo>b$gKX;p?5C~K)U!7w(N)+3Az+}X1n zFsatIxXVIG3Jmb4Ia_XLvxwNGhtqZpDNsuCC9y2*tgLEKTTMM@+THeW^Ujw3`mN!~ zGI~~^Y-zQ%5ro^kBpJ%RSFkOHcY=|iC>A7VE}v_HUfPHsB<-P{hE_D~2q zCT8}Xi*HXXDI-hl#RB;s3;O9CdM2#!C^Ia(#0@SChjd_EeWgr$X+a4FDTTs*BuT?a z(~#O!_hYc(!*goTzfVp&hRA18mi)H>T^eL3ivEF?`heaa5)y;d^0O9?ThDS z?Dvca^*aM4nejS5HT+$=IWqqiZEViLaHVK?`*!3 zT=#lNRjOQSk^xdZ<^Us$_)ZdiA!8^UFt`osvtE(MIqGo<^##6DI~8cv$?J?>-jfQ8+Ti2qig|93#tl?@Dtf|7|ym=t)jUPfT+4rxZ- zQMJhv*MV1!d^{WaB?ABEIkz>aUiz0riw*`9zS34d`W{b*IEb6^69IRx za(lmdigNV*)wIVo*94)F30FXo?c%pVe)0F_$e1+!*unnEq)-^YrFl4ZjsE7Y-P-XS z31WWv$@JrSXxMybI;eXHaD7xa+{3>~f9;P)o*0Od10+<*tB+ys5q^kv#$60;+o)%4 zRy5fq9h#Ov*#0H6!?fbB^^I4DNv9j&JAdR2i_~a3R=zP-1ZvVYU#>Rq)DQ(;*~T|Q z`(z}mJ~7{Dqsdm*U-g}#Ldaj=95n3;k z8%3j(_wDvNz~FXjuCLhs6!?$YLqL3r^12QBH@m^-3DNwcI=^&V@RNxcv*9vvWO}N+ wJ4c*?fxom~(6s+Jz(Y5*Cb*F$@S7$m!81QBzmWpmee;Z}l9nP)-YV$-0oWw=`~Uy| diff --git a/examples/arm-cm/real-time_nucleo-l053r8/README.md b/examples/arm-cm/real-time_nucleo-l053r8/README.md deleted file mode 100644 index 5af54f130..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/README.md +++ /dev/null @@ -1,64 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# Real-Time Example on NUCLEO-L053R8 -This example implements the "Periodic-Sporadic" application on the STM32 NUCLEO-L053R8 board (ARM Cortex-M0+). The example demonstrates various real-time preemption scenarios among active objects in the **QK** and **QV** kernels. The example requires a **logic analyzer**. - -

-
-STM32 NUCLEO-L053R8 -

- -

-
-Logic analyzer trace after pressing the button (QK kernel) -

- -# Code Organization -``` -examples\arm-cm\real-time_nucleo-l053r8 -| -+---qk // preemptive QK kernel -| +---armclang // ARM/KEIL MDK with Compiler 6 (ARM/CLANG) -| | rt-qk.uvprojx // uVision project -| -+---qv-ms // cooperative QV kernel (multi-stage tasks) -| +---armclang // ARM/KEIL MDK with Compiler 6 (ARM/CLANG) -| | rt-qv-ms.uvprojx // uVision project -| -+---qv-tt // cooperative QV kernel (time-triggered) -| +---armclang // ARM/KEIL MDK with Compiler 6 (ARM/CLANG) -| | rt-qv-tt.uvprojx // uVision project - -``` - -## Features Demonstrated -The example QP application consists of 2 periodic threads (Active Objects) and two sporadic, lon-running threads (Active Objects). Additionally, the Time-Triggered (TT) version has a tt-schedulier thread. - -- directory `qk`: preemptive run-to-completion QK kernel - -- directory `qv-ms`: cooperative run-to-completion QV kernel with multi-stage tasks - -- directory `qv-tt`: cooperative run-to-completion QV kernel with time-triggered tasks - -# Building the Examples - -## ARM/KEIL MDK -- Open one of the provided KEIL uVision projects (e.g., `rt-qk.uvprojx`) in Keil uVision IDE. Build/Debug/Download to the board from the IDE. - - -# Running the Examples - -## Setting up a Logic Analyzer -The NUCLEO-L053R8 needs to be conntected to a logic analyzer as shown in the picture below. - -

-
-Connecting STM32 NUCLEO-L053R8 to a logic analyzer -

- - -The logic analyzer needs to be configured as follows: -- sampling rate: several MHz (e.g., 24MHz) -- trigger: Sporadic (PC.13 on the NUCLEO-L053R8), falling edge -- pre-trigger capture ratio: 20% diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/app.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/app.hpp deleted file mode 100644 index 710622903..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/app.hpp +++ /dev/null @@ -1,97 +0,0 @@ -//$file${.::app.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::app.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::app.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef APP_HPP_ -#define APP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - -//${Shared::PeriodicSpecEvt} ................................................. -class PeriodicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint8_t ticks; - -public: - constexpr PeriodicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint8_t ti) - : QP::QEvt(s), - toggles(tg), - ticks(ti) - {} -}; // class PeriodicSpecEvt - -//${Shared::SporadicSpecEvt} ................................................. -class SporadicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint16_t rtc_toggles; - -public: - constexpr SporadicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint16_t trc_tg) - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - {} -}; // class SporadicSpecEvt - -//${Shared::AO_Periodic1} .................................................... -extern QP::QActive * const AO_Periodic1; - -//${Shared::AO_Periodic4} .................................................... -extern QP::QActive * const AO_Periodic4; - -//${Shared::AO_Sporadic2} .................................................... -extern QP::QActive * const AO_Sporadic2; - -//${Shared::AO_Sporadic3} .................................................... -extern QP::QActive * const AO_Sporadic3; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // APP_HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.sct b/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvoptx b/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvoptx deleted file mode 100644 index 61c57acfd..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvoptx +++ /dev/null @@ -1,1048 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - rt-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=979,559,1390,1061,0)(1007=2082,245,2289,466,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 0 - 1 - QK_attr_ - - - 1 - 1 - QF_readySet_ - - - - - 1 - 2 - 0x2000020C - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - rt-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -I0 -O8431 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - rt-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\app.hpp - app.hpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\periodic1.cpp - periodic1.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\periodic4.cpp - periodic4.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\sporadic2.cpp - sporadic2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\sporadic3.cpp - sporadic3.cpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qk\qk.cpp - qk.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - qk_port.cpp - 0 - 0 - - - 4 - 28 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - 4 - 29 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvprojx b/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvprojx deleted file mode 100644 index 1e26b19d0..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/armclang/rt-qk.uvprojx +++ /dev/null @@ -1,1841 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - rt-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - rt-qk - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\rt-qk.bin .\dbg\rt-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QK_USE_IRQ_HANDLER=WWDG_IRQHandler,QK_USE_IRQ_NUM=0 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - rt-qk - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\rt-qk.bin .\rel\rt-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - rt-qk - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\rt-qk.bin .\spy\rt-qk.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY QK_USE_IRQ_HANDLER=LCD_IRQHandler QK_USE_IRQ_NUM=30 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qk.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qk.cpp - 8 - ..\..\..\..\..\src\qk\qk.cpp - - - - - QP_port - - - qk_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qk_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qk\armclang\qs_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.cpp deleted file mode 100644 index fdbdcd212..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.cpp +++ /dev/null @@ -1,294 +0,0 @@ -//============================================================================ -// BSP for "real-time" Example -// Last updated for version 7.3.1 -// Last updated on 2023-11-10 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -Q_DEFINE_THIS_MODULE("bsp") // for functional-safety assertions - -// Local-scope defines ----------------------------------------------------- - -// test pins on GPIO PA (output) -#define TST1_PIN 7U -#define TST2_PIN 6U -#define TST3_PIN 4U -#define TST4_PIN 1U -#define TST5_PIN 0U -#define TST6_PIN 9U -#define TST7_PIN 5U // LED LD2-Green - -// button on GPIO PC (input) -#define B1_PIN 13U - -#ifdef Q_SPY - // QSpy source IDs - static QSpyId const l_SysTick_Handler = { 100U }; - -#endif - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << TST6_PIN); - for (;;) { // for debugging, hang on in an endless loop... - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - BSP::d1on(); - - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of sporadics. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - uint32_t depressed; - uint32_t previous; - } sporadics = { 0U, 0U }; - uint32_t current = ~GPIOC->IDR; // read Port C with state of Sporadic B1 - uint32_t tmp = sporadics.depressed; // save the depressed sporadics - sporadics.depressed |= (sporadics.previous & current); // set depressed - sporadics.depressed &= (sporadics.previous | current); // clear released - sporadics.previous = current; // update the history - tmp ^= sporadics.depressed; // changed debounced depressed - current = sporadics.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - // immutable sporadic-press event - static APP::SporadicSpecEvt const - sporadicA(APP::SPORADIC_A_SIG, 189U, 0U); - // immutable forward-press event - static APP::SporadicSpecEvt const - sporadicB(APP::SPORADIC_B_SIG, 89U, 0U); - APP::AO_Sporadic2->POST(&sporadicA, &l_SysTick_Handler); - APP::AO_Sporadic2->POST(&sporadicB, &l_SysTick_Handler); - } - else { // B1 is released - APP::AO_Periodic4->POST(BSP::getEvtPeriodic4(0U), &l_SysTick_Handler); - APP::AO_Periodic1->POST(BSP::getEvtPeriodic1(0U), &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about exiting an ISR - - BSP::d1off(); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable GPIO port PA clock - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - GPIOA->MODER |= - ((1U << 2U*TST1_PIN) | (1U << 2U*TST2_PIN) | (1U << 2U*TST3_PIN) | - (1U << 2U*TST4_PIN) | (1U << 2U*TST5_PIN) | (1U << 2U*TST6_PIN) | - (1U << 2U*TST7_PIN)); - GPIOA->OTYPER &= - ~((1U << TST1_PIN) | (1U << TST2_PIN) | (1U << TST3_PIN) | - (1U << TST4_PIN) | (1U << TST5_PIN) | (1U << TST6_PIN) | - (1U << TST7_PIN)); - GPIOA->PUPDR &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - - // enable GPIOC clock port for the Sporadic B1 - RCC->IOPENR |= (1U << 2U); - - // configure Sporadic B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // instantiate and start QP/C active objects... - static QP::QEvt const *periodic1QSto[10]; // Event queue storage - APP::AO_Periodic1->start( - Q_PRIO(1U, 1U), // QF-prio/pre-thre. - periodic1QSto, // storage for the AO's queue - Q_DIM(periodic1QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic1(0U)); // initialization param - - static QP::QEvt const *sporadic2QSto[8]; // Event queue storage - APP::AO_Sporadic2->start( - Q_PRIO(2U, 3U), // QF-prio/pre-thre. - sporadic2QSto, // storage for the AO's queue - Q_DIM(sporadic2QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *sporadic3QSto[8]; // Event queue storage - APP::AO_Sporadic3->start( - Q_PRIO(3U, 3U), // QF-prio/pre-thre. - sporadic3QSto, // storage for the AO's queue - Q_DIM(sporadic3QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *periodic4QSto[8]; // Event queue storage - APP::AO_Periodic4->start( - Q_PRIO(4U, 4U), // QF-prio/pre-thre. - periodic4QSto, // storage for the AO's queue - Q_DIM(periodic4QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic4(0U)); // initialization event -} -//............................................................................ -void d1on() { GPIOA->BSRR = (1U << TST1_PIN); } -void d1off() { GPIOA->BSRR = (1U << (TST1_PIN + 16U)); } -//............................................................................ -void d2on() { GPIOA->BSRR = (1U << TST2_PIN); } -void d2off() { GPIOA->BSRR = (1U << (TST2_PIN + 16U)); } -//............................................................................ -void d3on() { GPIOA->BSRR = (1U << TST3_PIN); } -void d3off() { GPIOA->BSRR = (1U << (TST3_PIN + 16U)); } -//............................................................................ -void d4on() { GPIOA->BSRR = (1U << TST4_PIN); } -void d4off() { GPIOA->BSRR = (1U << (TST4_PIN + 16U)); } -//............................................................................ -void d5on() { GPIOA->BSRR = (1U << TST5_PIN); } -void d5off() { GPIOA->BSRR = (1U << (TST5_PIN + 16U)); } -//............................................................................ -void d6on() { GPIOA->BSRR = (1U << TST6_PIN); } // LED2 -void d6off() { GPIOA->BSRR = (1U << (TST6_PIN + 16U)); } -//............................................................................ -void d7on() { GPIOA->BSRR = (1U << TST7_PIN); } -void d7off() { GPIOA->BSRR = (1U << (TST7_PIN + 16U)); } - -//............................................................................ -QP::QEvt const *getEvtPeriodic1(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic1 - static APP::PeriodicSpecEvt const periodicSpec1[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 40U, 5U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 30U, 7U) - }; - Q_REQUIRE_ID(500, num < Q_DIM(periodicSpec1)); // must be in range - return &periodicSpec1[num]; -} -//............................................................................ -QP::QEvt const *getEvtPeriodic4(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic4 - static APP::PeriodicSpecEvt const periodicSpec4[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 20U, 2U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 10U, 1U) - }; - Q_REQUIRE_ID(600, num < Q_DIM(periodicSpec4)); // must be in range - return &periodicSpec4[num]; -} - -} // namespace BSP - -// QF callbacks ============================================================== -namespace QP { - -void QF::onStartup() { - SystemCoreClockUpdate(); - - // set up the SysTick timer to fire at TICKS_PER_SEC rate - SysTick_Config((SystemCoreClock / BSP::TICKS_PER_SEC) + 1U); - - // set priorities of ISRs used in the system - NVIC_SetPriority(SysTick_IRQn, 0U); - // ... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - BSP::d7on(); // LED LD2 -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - BSP::d7off(); - __WFI(); // Wait-For-Interrupt - BSP::d7on(); -#endif - BSP::d7off(); -} - -} // namespace QP diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.hpp deleted file mode 100644 index 2af3c06ee..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// "real-time" example to demonstrate timing in QP/C++ -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef HPP_ -#define HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); - -void d1on(); -void d1off(); - -void d2on(); -void d2off(); - -void d3on(); -void d3off(); - -void d4on(); -void d4off(); - -void d5on(); -void d5off(); - -void d6on(); -void d6off(); - -void d7on(); -void d7off(); - -// immutable events for Periodic active objects -QP::QEvt const *getEvtPeriodic1(std::uint8_t num); -QP::QEvt const *getEvtPeriodic4(std::uint8_t num); - -} // namespace BSP - -#endif // HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/main.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/main.cpp deleted file mode 100644 index b8fdc5ea0..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.1 -// Last updated on 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -//............................................................................ -int main(void) { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic1.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic1.cpp deleted file mode 100644 index e4d4a3163..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic1.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//$file${.::periodic1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::periodic1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -//$declare${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -class Periodic1 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic1 inst; - -public: - Periodic1(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic1 - -} // namespace APP -//$enddecl${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic1} .................................................... -QP::QActive * const AO_Periodic1 {&Periodic1::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -Periodic1 Periodic1::inst; - -//${AOs::Periodic1::Periodic1} ............................................... -Periodic1::Periodic1() - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic1::SM} ...................................................... -QM_STATE_DEF(Periodic1, initial) { - //${AOs::Periodic1::SM::initial} - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic1::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic1::SM::active} .............................................. -QP::QMState const Periodic1::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic1::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic1::SM::active} -QM_STATE_DEF(Periodic1, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic1::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic1::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d6on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d6off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic4.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic4.cpp deleted file mode 100644 index 803db11e1..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/periodic4.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//$file${.::periodic4.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::periodic4.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic4.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -//$declare${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -class Periodic4 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic4 inst; - -public: - Periodic4(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic4 - -} // namespace APP -//$enddecl${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic4} .................................................... -QP::QActive * const AO_Periodic4 {&Periodic4::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -Periodic4 Periodic4::inst; - -//${AOs::Periodic4::Periodic4} ............................................... -Periodic4::Periodic4() - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic4::SM} ...................................................... -QM_STATE_DEF(Periodic4, initial) { - //${AOs::Periodic4::SM::initial} - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic4::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic4::SM::active} .............................................. -QP::QMState const Periodic4::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic4::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic4::SM::active} -QM_STATE_DEF(Periodic4, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic4::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic4::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d3on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d3off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/real-time.qm b/examples/arm-cm/real-time_nucleo-l053r8/qk/real-time.qm deleted file mode 100644 index 717a65e27..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/real-time.qm +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - - - - - - - - - : QP::QEvt(s), - toggles(tg), - ticks(ti) - - - - - - - - - - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - - - - {&Periodic1::inst}; - - - {&Periodic4::inst}; - - - {&Sporadic2::inst}; - - - {&Sporadic3::inst}; - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); -} - - - - - - BSP::d6on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d6off(); - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); -} - - - - - - BSP::d3on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d3off(); - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d5on(); -AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 -BSP::d5off(); - - - - - - BSP::d5on(); -AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); -BSP::d5off(); - -for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) -{ - BSP::d5on(); - BSP::d5off(); -} - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d4on(); -// Sporadic3 --> Periodic4 -AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); -BSP::d4off(); - -for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) -{ - BSP::d4on(); - BSP::d4off(); -} - - - - - - - - - - - - - #ifndef APP_HPP_ -#define APP_HPP_ - -$declare ${Shared} - -#endif // APP_HPP_ - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -$declare ${AOs::Periodic1} - -$define ${Shared::AO_Periodic1} -$define ${AOs::Periodic1} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -$declare ${AOs::Periodic4} - -$define ${Shared::AO_Periodic4} -$define ${AOs::Periodic4} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -$declare ${AOs::Sporadic2} - -$define ${Shared::AO_Sporadic2} -$define ${AOs::Sporadic2} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -$declare ${AOs::Sporadic3} - -$define ${Shared::AO_Sporadic3} -$define ${AOs::Sporadic3} - - - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic2.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic2.cpp deleted file mode 100644 index bce445ee2..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic2.cpp +++ /dev/null @@ -1,143 +0,0 @@ -//$file${.::sporadic2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::sporadic2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -//$declare${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -class Sporadic2 : public QP::QMActive { -public: - static Sporadic2 inst; - -public: - Sporadic2(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Sporadic2 - -} // namespace APP -//$enddecl${AOs::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic2} .................................................... -QP::QActive * const AO_Sporadic2 {&Sporadic2::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -Sporadic2 Sporadic2::inst; - -//${AOs::Sporadic2::Sporadic2} ............................................... -Sporadic2::Sporadic2() - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) -{} - -//${AOs::Sporadic2::SM} ...................................................... -QM_STATE_DEF(Sporadic2, initial) { - //${AOs::Sporadic2::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic2::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic2::SM::active} .............................................. -QP::QMState const Sporadic2::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic2::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic2::SM::active} -QM_STATE_DEF(Sporadic2, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic2::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d5on(); - AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 - BSP::d5off(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Sporadic2::SM::active::SPORADIC_B} - case SPORADIC_B_SIG: { - BSP::d5on(); - AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - BSP::d5off(); - - for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) - { - BSP::d5on(); - BSP::d5off(); - } - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic3.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic3.cpp deleted file mode 100644 index cbdc973e7..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/sporadic3.cpp +++ /dev/null @@ -1,136 +0,0 @@ -//$file${.::sporadic3.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::sporadic3.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic3.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -//$declare${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -class Sporadic3 : public QP::QMActive { -public: - static Sporadic3 inst; - -public: - Sporadic3(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Sporadic3 - -} // namespace APP -//$enddecl${AOs::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic3} .................................................... -QP::QActive * const AO_Sporadic3 {&Sporadic3::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -Sporadic3 Sporadic3::inst; - -//${AOs::Sporadic3::Sporadic3} ............................................... -Sporadic3::Sporadic3() - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) -{} - -//${AOs::Sporadic3::SM} ...................................................... -QM_STATE_DEF(Sporadic3, initial) { - //${AOs::Sporadic3::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic3::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic3::SM::active} .............................................. -QP::QMState const Sporadic3::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic3::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic3::SM::active} -QM_STATE_DEF(Sporadic3, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic3::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d4on(); - // Sporadic3 --> Periodic4 - AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - BSP::d4off(); - - for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) - { - BSP::d4on(); - BSP::d4off(); - } - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.png b/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.png deleted file mode 100644 index b8805745ca574d56b9ba436560d29924c005db9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16722 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 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.pvs b/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.pvs deleted file mode 100644 index 4aa494709..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.pvs +++ /dev/null @@ -1,77 +0,0 @@ -[D0] -name=D0 -enabled=true -color=4279638298 -conversion_type=0 -conv_options=0 - -[D1] -name=D1 -enabled=true -color=4287582722 -conversion_type=0 -conv_options=0 - -[D2] -name=D2 -enabled=true -color=4291559424 -conversion_type=0 -conv_options=0 - -[D3] -name=D3 -enabled=true -color=4294277376 -conversion_type=0 -conv_options=0 - -[D4] -name=D4 -enabled=true -color=4293776384 -conversion_type=0 -conv_options=0 - -[D5] -name=D5 -enabled=true -color=4285780502 -conversion_type=0 -conv_options=0 - -[D6] -name=D6 -enabled=true -color=4281623972 -conversion_type=0 -conv_options=0 - -[D7] -name=D7 -enabled=true -color=4285878395 -conversion_type=0 -conv_options=0 - -[General] -decode_signals=0 -generated_signals=0 -views=1 -meta_objs=0 - -[view0] -scale=2.4084778420038533e-5 -v_offset=-21 -splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0?\0\0\x6\xd3\x1\0\0\0\x1\x1\0\0\0\x1\0) -segment_display_mode=1 -offset=22 serialization::archive 14 0 0 0 0 0 0 0 0 0 0 0 0 0 6 -zero_offset=22 serialization::archive 14 0 0 0 0 0 0 0 0 0 0 0 0 0 6 -D0\trace_height=40 -D1\trace_height=40 -D2\trace_height=40 -D3\trace_height=40 -D4\trace_height=40 -D5\trace_height=40 -D6\trace_height=40 -D7\trace_height=40 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.sr b/examples/arm-cm/real-time_nucleo-l053r8/qk/traces/rt-qk.sr deleted file mode 100644 index 3ddb29c774a0a8441b29abdc438e34fe6d256179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4855 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. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::app.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef APP_HPP_ -#define APP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - TICK_SIG = QP::Q_USER_SIG, - RUN_SIG, - MODE0_SIG, - MODE1_SIG, - - PERIODIC_SPEC_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - // ... - MAX_SIG // the last signal -}; - -//${Shared::PeriodicSpecEvt} ................................................. -class PeriodicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint8_t ticks; - -public: - constexpr PeriodicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint8_t ti) - : QP::QEvt(s), - toggles(tg), - ticks(ti) - {} -}; // class PeriodicSpecEvt - -//${Shared::SporadicSpecEvt} ................................................. -class SporadicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint16_t rtc_toggles; - -public: - constexpr SporadicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint16_t trc_tg) - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - {} -}; // class SporadicSpecEvt - -//${Shared::AO_Periodic1} .................................................... -extern QP::QActive * const AO_Periodic1; - -//${Shared::AO_Periodic4} .................................................... -extern QP::QActive * const AO_Periodic4; - -//${Shared::AO_Sporadic2} .................................................... -extern QP::QActive * const AO_Sporadic2; - -//${Shared::AO_Sporadic3} .................................................... -extern QP::QActive * const AO_Sporadic3; - -//${Shared::TTSched_tick} .................................................... -void TTSched_tick(); - -//${Shared::TTSched_mode} .................................................... -void TTSched_mode(uint8_t mode); - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // APP_HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.sct b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvoptx b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvoptx deleted file mode 100644 index c45edb0af..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvoptx +++ /dev/null @@ -1,1093 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - rt-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=979,559,1390,1061,0)(1007=2082,245,2289,466,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - 0 - 0 - 65 - 1 -
134218732
- 0 - 0 - 0 - 0 - 0 - 1 - ..\bsp.cpp - - \\rt_qv_tt\../bsp.cpp\65 -
- - 1 - 0 - 112 - 1 -
134221064
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\..\..\src\qf\qf_actq.cpp - - \\rt_qv_tt\../../../../../src/qf/qf_actq.cpp\112 -
-
- - - 0 - 1 - QK_attr_ - - - 1 - 1 - QF_readySet_ - - - - - 1 - 2 - 0x2000020C - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - -
-
- - - rt-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -I0 -O8431 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - rt-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\app.hpp - app.hpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\periodic1.cpp - periodic1.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\periodic4.cpp - periodic4.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\sporadic2.cpp - sporadic2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\sporadic3.cpp - sporadic3.cpp - 0 - 0 - - - 1 - 9 - 8 - 0 - 0 - 0 - ..\ttsched.cpp - ttsched.cpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 14 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 29 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - 4 - 30 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvprojx b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvprojx deleted file mode 100644 index dc1834203..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/armclang/rt-qv-tt.uvprojx +++ /dev/null @@ -1,1856 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - rt-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - rt-qv-tt - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\rt-qv-tt.bin .\dbg\rt-qv-tt.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv-tt.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - ttsched.cpp - 8 - ..\ttsched.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - rt-qv-tt - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\rt-qv-tt.bin .\rel\rt-qv-tt.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv-tt.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - ttsched.cpp - 8 - ..\ttsched.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - rt-qv-tt - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\rt-qv-tt.bin .\spy\rt-qv-tt.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv-tt.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - ttsched.cpp - 8 - ..\ttsched.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.cpp deleted file mode 100644 index e8fa54f46..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.cpp +++ /dev/null @@ -1,296 +0,0 @@ -//============================================================================ -// BSP for "real-time" Example -// Last updated for version 7.3.1 -// Last updated on 2023-10-03 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -Q_DEFINE_THIS_MODULE("bsp") // for functional-safety assertions - -// Local-scope defines ----------------------------------------------------- - -// test pins on GPIO PA (output) -#define TST1_PIN 7U -#define TST2_PIN 6U -#define TST3_PIN 4U -#define TST4_PIN 1U -#define TST5_PIN 0U -#define TST6_PIN 9U -#define TST7_PIN 5U // LED LD2-Green - -// button on GPIO PC (input) -#define B1_PIN 13U - -#ifdef Q_SPY - // QSpy source IDs - static QSpyId const l_SysTick_Handler = { 100U }; - -#endif - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << TST6_PIN); - for (;;) { // for debugging, hang on in an endless loop... - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - BSP::d1on(); - - APP::TTSched_tick(); // run the TT scheduler - - // Perform the debouncing of sporadics. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - uint32_t depressed; - uint32_t previous; - } sporadics = { 0U, 0U }; - uint32_t current = ~GPIOC->IDR; // read Port C with state of Sporadic B1 - uint32_t tmp = sporadics.depressed; // save the depressed sporadics - sporadics.depressed |= (sporadics.previous & current); // set depressed - sporadics.depressed &= (sporadics.previous | current); // clear released - sporadics.previous = current; // update the history - tmp ^= sporadics.depressed; // changed debounced depressed - current = sporadics.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - // immutable sporadic-press event - static APP::SporadicSpecEvt const - sporadicA(APP::SPORADIC_A_SIG, 189U, 23U); - // immutable forward-press event - static APP::SporadicSpecEvt const - sporadicB(APP::SPORADIC_B_SIG, 89U, 23U); - APP::TTSched_mode(1U); - APP::AO_Sporadic2->POST(&sporadicA, &l_SysTick_Handler); - APP::AO_Sporadic2->POST(&sporadicB, &l_SysTick_Handler); - } - else { // B1 is released - APP::TTSched_mode(0U); - APP::AO_Periodic4->POST(BSP::getEvtPeriodic4(0U), &l_SysTick_Handler); - APP::AO_Periodic1->POST(BSP::getEvtPeriodic1(0U), &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); - - BSP::d1off(); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable GPIO port PA clock - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - GPIOA->MODER |= - ((1U << 2U*TST1_PIN) | (1U << 2U*TST2_PIN) | (1U << 2U*TST3_PIN) | - (1U << 2U*TST4_PIN) | (1U << 2U*TST5_PIN) | (1U << 2U*TST6_PIN) | - (1U << 2U*TST7_PIN)); - GPIOA->OTYPER &= - ~((1U << TST1_PIN) | (1U << TST2_PIN) | (1U << TST3_PIN) | - (1U << TST4_PIN) | (1U << TST5_PIN) | (1U << TST6_PIN) | - (1U << TST7_PIN)); - GPIOA->PUPDR &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - - // enable GPIOC clock port for the Sporadic B1 - RCC->IOPENR |= (1U << 2U); - - // configure Sporadic B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // instantiate and start QP/C active objects... - static QP::QEvt const *periodic1QSto[10]; // Event queue storage - APP::AO_Periodic1->start( - 1U, // QF-prio - periodic1QSto, // storage for the AO's queue - Q_DIM(periodic1QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic1(0U)); // initialization param - - static QP::QEvt const *sporadic2QSto[8]; // Event queue storage - APP::AO_Sporadic2->start( - 2U, // QF-prio - sporadic2QSto, // storage for the AO's queue - Q_DIM(sporadic2QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *sporadic3QSto[8]; // Event queue storage - APP::AO_Sporadic3->start( - 3U, // QF-prio - sporadic3QSto, // storage for the AO's queue - Q_DIM(sporadic3QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *periodic4QSto[8]; // Event queue storage - APP::AO_Periodic4->start( - 4U, // QF-prio - periodic4QSto, // storage for the AO's queue - Q_DIM(periodic4QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic4(0U)); // initialization event -} -//............................................................................ -void d1on() { GPIOA->BSRR = (1U << TST1_PIN); } -void d1off() { GPIOA->BSRR = (1U << (TST1_PIN + 16U)); } -//............................................................................ -void d2on() { GPIOA->BSRR = (1U << TST2_PIN); } -void d2off() { GPIOA->BSRR = (1U << (TST2_PIN + 16U)); } -//............................................................................ -void d3on() { GPIOA->BSRR = (1U << TST3_PIN); } -void d3off() { GPIOA->BSRR = (1U << (TST3_PIN + 16U)); } -//............................................................................ -void d4on() { GPIOA->BSRR = (1U << TST4_PIN); } -void d4off() { GPIOA->BSRR = (1U << (TST4_PIN + 16U)); } -//............................................................................ -void d5on() { GPIOA->BSRR = (1U << TST5_PIN); } -void d5off() { GPIOA->BSRR = (1U << (TST5_PIN + 16U)); } -//............................................................................ -void d6on() { GPIOA->BSRR = (1U << TST6_PIN); } // LED2 -void d6off() { GPIOA->BSRR = (1U << (TST6_PIN + 16U)); } -//............................................................................ -void d7on() { GPIOA->BSRR = (1U << TST7_PIN); } -void d7off() { GPIOA->BSRR = (1U << (TST7_PIN + 16U)); } - -//............................................................................ -QP::QEvt const *getEvtPeriodic1(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic1 - static APP::PeriodicSpecEvt const periodicSpec1[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 40U, 5U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 30U, 7U) - }; - Q_REQUIRE_ID(500, num < Q_DIM(periodicSpec1)); // must be in range - return &periodicSpec1[num]; -} -//............................................................................ -QP::QEvt const *getEvtPeriodic4(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic4 - static APP::PeriodicSpecEvt const periodicSpec4[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 20U, 2U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 10U, 1U) - }; - Q_REQUIRE_ID(600, num < Q_DIM(periodicSpec4)); // must be in range - return &periodicSpec4[num]; -} - -} // namespace BSP - -// QF callbacks ============================================================== -namespace QP { - -void QF::onStartup() { - SystemCoreClockUpdate(); - - // set up the SysTick timer to fire at TICKS_PER_SEC rate - SysTick_Config((SystemCoreClock / BSP::TICKS_PER_SEC) + 1U); - - // set priorities of ISRs used in the system - NVIC_SetPriority(SysTick_IRQn, 0U); - // ... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED - BSP::d7on(); // LED LD2 -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - BSP::d7off(); - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts - BSP::d7on(); -#else - QF_INT_ENABLE(); // just enable interrupts -#endif - BSP::d7off(); -} - -} // namespace QP diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.hpp deleted file mode 100644 index 2af3c06ee..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// "real-time" example to demonstrate timing in QP/C++ -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef HPP_ -#define HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); - -void d1on(); -void d1off(); - -void d2on(); -void d2off(); - -void d3on(); -void d3off(); - -void d4on(); -void d4off(); - -void d5on(); -void d5off(); - -void d6on(); -void d6off(); - -void d7on(); -void d7off(); - -// immutable events for Periodic active objects -QP::QEvt const *getEvtPeriodic1(std::uint8_t num); -QP::QEvt const *getEvtPeriodic4(std::uint8_t num); - -} // namespace BSP - -#endif // HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/main.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/main.cpp deleted file mode 100644 index b8fdc5ea0..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.1 -// Last updated on 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -//............................................................................ -int main(void) { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic1.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic1.cpp deleted file mode 100644 index 70a21e78c..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic1.cpp +++ /dev/null @@ -1,143 +0,0 @@ -//$file${.::periodic1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms-tt.qm -// File: ${.::periodic1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -//$declare${Components::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Periodic1} ................................................... -class Periodic1 : public QP::QMActive { -private: - std::uint16_t m_toggles; - -public: - static Periodic1 inst; - -public: - Periodic1(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic1 - -} // namespace APP -//$enddecl${Components::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic1} .................................................... -QP::QActive * const AO_Periodic1 {&Periodic1::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Components::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Periodic1} ................................................... -Periodic1 Periodic1::inst; - -//${Components::Periodic1::Periodic1} ........................................ -Periodic1::Periodic1() - : QMActive(Q_STATE_CAST(&Periodic1::initial)) -{} - -//${Components::Periodic1::SM} ............................................... -QM_STATE_DEF(Periodic1, initial) { - //${Components::Periodic1::SM::initial} - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic1::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${Components::Periodic1::SM::active} ....................................... -QP::QMState const Periodic1::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic1::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Periodic1::SM::active} -QM_STATE_DEF(Periodic1, active) { - QP::QState status_; - switch (e->sig) { - //${Components::Periodic1::SM::active::RUN} - case RUN_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${Components::Periodic1::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d6on(); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d6off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${Components::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic4.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic4.cpp deleted file mode 100644 index aeb15730b..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/periodic4.cpp +++ /dev/null @@ -1,143 +0,0 @@ -//$file${.::periodic4.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms-tt.qm -// File: ${.::periodic4.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic4.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -//$declare${Components::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Periodic4} ................................................... -class Periodic4 : public QP::QMActive { -private: - std::uint16_t m_toggles; - -public: - static Periodic4 inst; - -public: - Periodic4(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic4 - -} // namespace APP -//$enddecl${Components::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic4} .................................................... -QP::QActive * const AO_Periodic4 {&Periodic4::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Components::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Periodic4} ................................................... -Periodic4 Periodic4::inst; - -//${Components::Periodic4::Periodic4} ........................................ -Periodic4::Periodic4() - : QMActive(Q_STATE_CAST(&Periodic4::initial)) -{} - -//${Components::Periodic4::SM} ............................................... -QM_STATE_DEF(Periodic4, initial) { - //${Components::Periodic4::SM::initial} - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic4::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${Components::Periodic4::SM::active} ....................................... -QP::QMState const Periodic4::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic4::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Periodic4::SM::active} -QM_STATE_DEF(Periodic4, active) { - QP::QState status_; - switch (e->sig) { - //${Components::Periodic4::SM::active::RUN} - case RUN_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${Components::Periodic4::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d3on(); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d3off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${Components::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/real-time-ms-tt.qm b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/real-time-ms-tt.qm deleted file mode 100644 index 09c3271d7..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/real-time-ms-tt.qm +++ /dev/null @@ -1,507 +0,0 @@ - - - - - - : QP::QSignal { - TICK_SIG = QP::Q_USER_SIG, - RUN_SIG, - MODE0_SIG, - MODE1_SIG, - - PERIODIC_SPEC_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - // ... - MAX_SIG // the last signal -}; - - - - - - - - - : QP::QEvt(s), - toggles(tg), - ticks(ti) - - - - - - - - - - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - - - - {&Periodic1::inst}; - - - {&Periodic4::inst}; - - - {&Sporadic2::inst}; - - - {&Sporadic3::inst}; - - - static QP::QEvt const tickEvt(TICK_SIG); -TTSched::inst.dispatch(&tickEvt, 0U); - - - - static QP::QEvt const modeEvt[2] { - QP::QEvt(MODE0_SIG), - QP::QEvt(MODE1_SIG), -}; -TTSched::inst.dispatch(&modeEvt[mode], 0U); - - - - - - - : QMsm(Q_STATE_CAST(&TTSched::initial)) - -init(0U); - - - - - - - - - - - - - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); - - - - - - - - - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic1->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Sporadic3->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Sporadic3->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Sporadic2->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Sporadic3->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Periodic1->POST(&runEvt, 0U); - - - - - - - - - AO_Periodic4->POST(&runEvt, 0U); -AO_Sporadic3->POST(&runEvt, 0U); - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic1::initial)) - - - - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); -} - - - - - - BSP::d6on(); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d6off(); - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic4::initial)) - - - - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); -} - - - - - - BSP::d3on(); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d3off(); - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d5on(); -AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 -BSP::d5off(); - - - - - - BSP::d5on(); -AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - -m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; -m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; -m_done = 0U; -BSP::d5off(); - - - - - - BSP::d5on(); -BSP::d5off(); - - - - - - std::uint16_t toggles = m_total - m_done; -if (toggles > m_per_rtc) { - toggles = m_per_rtc; -} -m_done += toggles; -for (; toggles > 0U; --toggles) { - BSP::d5on(); - BSP::d5off(); -} - - - m_done < m_total - - - - - - - BSP::d5on(); -BSP::d5off(); - - - - - - - - - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d4on(); -AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - -m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; -m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; -m_done = 0U; -BSP::d4off(); - - - - - - BSP::d4on(); -BSP::d4off(); - - - - - - std::uint16_t toggles = m_total - m_done; -if (toggles > m_per_rtc) { - toggles = m_per_rtc; -} -m_done += toggles; -for (; toggles > 0U; --toggles) { - BSP::d4on(); - BSP::d4off(); -} - - - m_done < m_total - - - - - - - BSP::d4on(); -BSP::d4off(); - - - - - - - - - - - - - - - - - - - - - #ifndef APP_HPP_ -#define APP_HPP_ - -$declare ${Shared} - -#endif // APP_HPP_ - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -$declare ${Components::TTSched} - -Q_DEFINE_THIS_MODULE("ttsched") - -static QP::QEvt const runEvt(APP::RUN_SIG); - -$define ${Shared::TTSched_tick} -$define ${Shared::TTSched_mode} -$define ${Components::TTSched} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -$declare ${Components::Periodic1} - -$define ${Shared::AO_Periodic1} -$define ${Components::Periodic1} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -$declare ${Components::Periodic4} - -$define ${Shared::AO_Periodic4} -$define ${Components::Periodic4} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -$declare ${Components::Sporadic2} - -$define ${Shared::AO_Sporadic2} -$define ${Components::Sporadic2} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -$declare ${Components::Sporadic3} - -$define ${Shared::AO_Sporadic3} -$define ${Components::Sporadic3} - - - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/sporadic2.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/sporadic2.cpp deleted file mode 100644 index a8ff40a79..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/sporadic2.cpp +++ /dev/null @@ -1,228 +0,0 @@ -//$file${.::sporadic2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms-tt.qm -// File: ${.::sporadic2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -//$declare${Components::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Sporadic2} ................................................... -class Sporadic2 : public QP::QMActive { -public: - std::uint16_t m_per_rtc; - std::uint16_t m_total; - std::uint16_t m_done; - static Sporadic2 inst; - -public: - Sporadic2(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( busy); - QM_ACTION_DECL(busy_e); -}; // class Sporadic2 - -} // namespace APP -//$enddecl${Components::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic2} .................................................... -QP::QActive * const AO_Sporadic2 {&Sporadic2::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Components::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Sporadic2} ................................................... -Sporadic2 Sporadic2::inst; - -//${Components::Sporadic2::Sporadic2} ........................................ -Sporadic2::Sporadic2() - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) -{} - -//${Components::Sporadic2::SM} ............................................... -QM_STATE_DEF(Sporadic2, initial) { - //${Components::Sporadic2::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic2::active); - QS_FUN_DICTIONARY(&Sporadic2::busy); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${Components::Sporadic2::SM::active} ....................................... -QP::QMState const Sporadic2::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic2::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Sporadic2::SM::active} -QM_STATE_DEF(Sporadic2, active) { - QP::QState status_; - switch (e->sig) { - //${Components::Sporadic2::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d5on(); - AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 - BSP::d5off(); - status_ = Q_RET_HANDLED; - break; - } - //${Components::Sporadic2::SM::active::SPORADIC_B} - case SPORADIC_B_SIG: { - BSP::d5on(); - AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - - m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; - m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; - m_done = 0U; - BSP::d5off(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &busy_s, // target state - { - &busy_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${Components::Sporadic2::SM::active::RUN} - case RUN_SIG: { - BSP::d5on(); - BSP::d5off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::Sporadic2::SM::active::busy} ................................. -QP::QMState const Sporadic2::busy_s = { - &Sporadic2::active_s, // superstate - &Sporadic2::busy, - &Sporadic2::busy_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Sporadic2::SM::active::busy} -QM_ACTION_DEF(Sporadic2, busy_e) { - std::uint16_t toggles = m_total - m_done; - if (toggles > m_per_rtc) { - toggles = m_per_rtc; - } - m_done += toggles; - for (; toggles > 0U; --toggles) { - BSP::d5on(); - BSP::d5off(); - } - return qm_entry(&busy_s); -} -//${Components::Sporadic2::SM::active::busy} -QM_STATE_DEF(Sporadic2, busy) { - QP::QState status_; - switch (e->sig) { - //${Components::Sporadic2::SM::active::busy::RUN} - case RUN_SIG: { - //${Components::Sporadic2::SM::active::busy::RUN::[m_done. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic3.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -//$declare${Components::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Sporadic3} ................................................... -class Sporadic3 : public QP::QMActive { -public: - std::uint16_t m_per_rtc; - std::uint16_t m_total; - std::uint16_t m_done; - static Sporadic3 inst; - -public: - Sporadic3(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( busy); - QM_ACTION_DECL(busy_e); -}; // class Sporadic3 - -} // namespace APP -//$enddecl${Components::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic3} .................................................... -QP::QActive * const AO_Sporadic3 {&Sporadic3::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Components::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::Sporadic3} ................................................... -Sporadic3 Sporadic3::inst; - -//${Components::Sporadic3::Sporadic3} ........................................ -Sporadic3::Sporadic3() - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) -{} - -//${Components::Sporadic3::SM} ............................................... -QM_STATE_DEF(Sporadic3, initial) { - //${Components::Sporadic3::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic3::active); - QS_FUN_DICTIONARY(&Sporadic3::busy); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${Components::Sporadic3::SM::active} ....................................... -QP::QMState const Sporadic3::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic3::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Sporadic3::SM::active} -QM_STATE_DEF(Sporadic3, active) { - QP::QState status_; - switch (e->sig) { - //${Components::Sporadic3::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d4on(); - AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - - m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; - m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; - m_done = 0U; - BSP::d4off(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &busy_s, // target state - { - &busy_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${Components::Sporadic3::SM::active::RUN} - case RUN_SIG: { - BSP::d4on(); - BSP::d4off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::Sporadic3::SM::active::busy} ................................. -QP::QMState const Sporadic3::busy_s = { - &Sporadic3::active_s, // superstate - &Sporadic3::busy, - &Sporadic3::busy_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::Sporadic3::SM::active::busy} -QM_ACTION_DEF(Sporadic3, busy_e) { - std::uint16_t toggles = m_total - m_done; - if (toggles > m_per_rtc) { - toggles = m_per_rtc; - } - m_done += toggles; - for (; toggles > 0U; --toggles) { - BSP::d4on(); - BSP::d4off(); - } - return qm_entry(&busy_s); -} -//${Components::Sporadic3::SM::active::busy} -QM_STATE_DEF(Sporadic3, busy) { - QP::QState status_; - switch (e->sig) { - //${Components::Sporadic3::SM::active::busy::RUN} - case RUN_SIG: { - //${Components::Sporadic3::SM::active::busy::RUN::[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 QNhxq!LHSnx%?B_352~sSx&QzG diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/traces/rt-qv-tt.sr b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms-tt/traces/rt-qv-tt.sr deleted file mode 100644 index 48752545a6f2d38ff9e43cd8aea0b5be4f4af81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4267 zcmZ`-3sh5A7QG=tq(T&MP=q)s#2{-ae=DEZ20=*_BvKrIEXqeHsK_sT9MKgT6{%Js zSc#|%AVqQ6s_ls40D`0f#cB|-P6fyE7ZHWjF0i6=?tL#I*kxEbym#Nd=bpRIKA#uK zYUZ>L5dPfAT(RD?wtXH0uJM-z-?ZrDl(>W)t`e9v8yTSKWL8m}z^wqDw!?QieB+~~ z5nCdp5sO<~%;nr!!qz=O^@dVEMttRIQND$Te5 zXVt;nhB;G>Ke6jS=1LQ!PD$To+k z5S8kQXgm@NqEPP{HP#$+0Zz7gyv781v~Ct~q)m@}j5yLglAm z&{K%@<88@i)b_!4IeZ1)(*D$iwrVD91fM$A%?Yy!19T|KaKq27AE3G`Hi*~fX^4#X zWVgb$Tgm2lOOAOuwgX@O{oGGp+) z1^{miBWO6|hr~}|%sHSw8HO6=y~T32S5vY4OgXvo;7600cU^jC!1UO<1v7K+{!NxF zs6pI@3mMvD)k2p&WF>VDHiz}$a=Rk-PVXl5euvNCR=93QT4>)BvQ%HN zeX%L*u!~^Jn1O~;1gK^I4vN-+qE%J<^2@>qX({GX%sYAESPpOZ@p0PJ#+o9EXoPJF zj{u;01o)qA(SoU)RJ)0fkmShP5--Ynd|j36lbv4iR-Z_i30f|^?$ZuIAINH z&Yk)*kkg?tKuE6iFT+S;TL!pC*^#j$1rWyK zR=(nar$W@_d?{eVfITP{GV`COcRUq$t?bY&??jup_rzZf7NPn|NgjNwFu3*G-bdy`{rz8sj}tPw$`Sy@q}+mdBUK<0Cx5>IyFK z+^}{Jlp&$Osby8EE+N_COar+u@;J^nR9d1kQlzB^HZ?vbi-~s5jdCDv#-bQ}eLf~_ zsk6MmUYDUUtrg95-koGRT*0w0==br3m^ad_ay8!7r|dBW<&wkVM@Tq7Mlwi|2y2I7 zR9CajgU&tb5~+@hG%L|q!Sl$~w#`rI{0)_0_mK$ZB@EC{F0-tWsDbBCqlWVr1ap;L z(ST6!e2q5O0!wtKrBbf$HdY^r*>RDFFujDHH!}bQrLaOyYcN*)C3J?+;wUtq?nw`8r+(*Q^LS;8W_=pc6JdZCKgbaXFF9_JO#j3~j*5h7d z@jsU4scz?iV@N^*j%Hql+(R7I^w)i07HDtw6q}41ftH0$HVKGpYPT?zlnEk$qrLDn z=EWa-^+S;Yo{)_e+M22xn=Ou15UiJV4@(`9Fbrq`_L8Li#BCrPKMehD#1BeKxUo~` zswsN(h)cG@;&i_98-l?}<6lu-Sj;D&j>IsH0mu3*Tc!C!l^@6(dFDws8|2VLP?1P> zDbYb z(Pm{Lmkz+fkif|8B=~%~9aCQ~Ge_obuYw^FH047EU(Vv#%rrW{MCzMnLDFz$LXb#@ zq4tV^3%t}fTz4{ehkVtd1Ta$eg^9)pjXLiS&aQ!Qs~^Gi@Zg)mV6lB$b(UH6vJ%>6 zh3IZMMRAHESeYONlf6}i2~N|H>|v!=xl`%`K$E%4fndD|MrgwwkA!fe=h$kB1K4+9 ztN!ie16^4Zf6Xi3iNobylyWJAi^EZx&e&*38Ogt7lrpU|b}fG=LZ}L=J3JLVNy=E* zj=~3cca-qXhY$MWls*vSlxkAd&Zk2NKB#+Yfi0W@=_KltFi%biUXZi#5txe%kN29Q zvXK~*-tXA=F~IW|fh!XQN*G3;r5&^vS83fvR!8>Z3ee>YChLM5ClytMYl*RQK7&Q| z2%=K48*V|-%c>p*y1k|AG)~QQK}P6e2atnX3AfL2FhmJh8C#iNT;M31@ z`OzA7C@xMa@S20TP8JK(qt*4YO`PpBaEG~^6;;hZ11&ZXmOO@(*g;$6pYE)$I z3x+`x>!QLv0?=>rbq(luc^mlCwA%YaZDPG$Z$N474WS|); z;^6oU$!dndC(QT1^utv0sm#Lv=$`. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::ttsched.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -//$declare${Components::TTSched} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::TTSched} ..................................................... -class TTSched : public QP::QMsm { -public: - static TTSched inst; - -public: - TTSched(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( m0tick0); - QM_STATE_DECL( m0tick1); - QM_STATE_DECL( m0tick2); - QM_STATE_DECL( m0tick3); - QM_STATE_DECL( m1tick0); - QM_STATE_DECL( m1tick1); - QM_STATE_DECL( m1tick2); - QM_STATE_DECL( m1tick3); - QM_STATE_DECL( m1tick4); - QM_STATE_DECL( m1tick5); -}; // class TTSched - -} // namespace APP -//$enddecl${Components::TTSched} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Q_DEFINE_THIS_MODULE("ttsched") - -static QP::QEvt const runEvt(APP::RUN_SIG); - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::TTSched_tick} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::TTSched_tick} .................................................... -void TTSched_tick() { - static QP::QEvt const tickEvt(TICK_SIG); - TTSched::inst.dispatch(&tickEvt, 0U); -} - -} // namespace APP -//$enddef${Shared::TTSched_tick} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Shared::TTSched_mode} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::TTSched_mode} .................................................... -void TTSched_mode(uint8_t mode) { - static QP::QEvt const modeEvt[2] { - QP::QEvt(MODE0_SIG), - QP::QEvt(MODE1_SIG), - }; - TTSched::inst.dispatch(&modeEvt[mode], 0U); -} - -} // namespace APP -//$enddef${Shared::TTSched_mode} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Components::TTSched} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Components::TTSched} ..................................................... -TTSched TTSched::inst; - -//${Components::TTSched::TTSched} ............................................ -TTSched::TTSched() - : QMsm(Q_STATE_CAST(&TTSched::initial)) -{ - init(0U); -} - -//${Components::TTSched::SM} ................................................. -QM_STATE_DEF(TTSched, initial) { - //${Components::TTSched::SM::initial} - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick0_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${Components::TTSched::SM::active} ......................................... -QP::QMState const TTSched::active_s = { - QM_STATE_NULL, // superstate (top) - &TTSched::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active} -QM_STATE_DEF(TTSched, active) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::MODE0} - case MODE0_SIG: { - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick0_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${Components::TTSched::SM::active::MODE1} - case MODE1_SIG: { - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick0_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m0tick0} ................................ -QP::QMState const TTSched::m0tick0_s = { - &TTSched::active_s, // superstate - &TTSched::m0tick0, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m0tick0} -QM_STATE_DEF(TTSched, m0tick0) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m0tick0::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick1_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m0tick1} ................................ -QP::QMState const TTSched::m0tick1_s = { - &TTSched::active_s, // superstate - &TTSched::m0tick1, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m0tick1} -QM_STATE_DEF(TTSched, m0tick1) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m0tick1::TICK} - case TICK_SIG: { - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick2_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m0tick2} ................................ -QP::QMState const TTSched::m0tick2_s = { - &TTSched::active_s, // superstate - &TTSched::m0tick2, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m0tick2} -QM_STATE_DEF(TTSched, m0tick2) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m0tick2::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick3_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m0tick3} ................................ -QP::QMState const TTSched::m0tick3_s = { - &TTSched::active_s, // superstate - &TTSched::m0tick3, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m0tick3} -QM_STATE_DEF(TTSched, m0tick3) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m0tick3::TICK} - case TICK_SIG: { - AO_Periodic1->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m0tick0_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick0} ................................ -QP::QMState const TTSched::m1tick0_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick0, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick0} -QM_STATE_DEF(TTSched, m1tick0) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick0::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Sporadic3->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick1_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick1} ................................ -QP::QMState const TTSched::m1tick1_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick1, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick1} -QM_STATE_DEF(TTSched, m1tick1) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick1::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Sporadic3->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick2_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick2} ................................ -QP::QMState const TTSched::m1tick2_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick2, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick2} -QM_STATE_DEF(TTSched, m1tick2) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick2::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Sporadic2->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick3_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick3} ................................ -QP::QMState const TTSched::m1tick3_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick3, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick3} -QM_STATE_DEF(TTSched, m1tick3) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick3::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Sporadic3->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick4_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick4} ................................ -QP::QMState const TTSched::m1tick4_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick4, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick4} -QM_STATE_DEF(TTSched, m1tick4) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick4::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Periodic1->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick5_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${Components::TTSched::SM::active::m1tick5} ................................ -QP::QMState const TTSched::m1tick5_s = { - &TTSched::active_s, // superstate - &TTSched::m1tick5, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${Components::TTSched::SM::active::m1tick5} -QM_STATE_DEF(TTSched, m1tick5) { - QP::QState status_; - switch (e->sig) { - //${Components::TTSched::SM::active::m1tick5::TICK} - case TICK_SIG: { - AO_Periodic4->POST(&runEvt, 0U); - AO_Sporadic3->POST(&runEvt, 0U); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &m1tick0_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${Components::TTSched} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/app.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/app.hpp deleted file mode 100644 index 0283fa54c..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/app.hpp +++ /dev/null @@ -1,97 +0,0 @@ -//$file${.::app.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms.qm -// File: ${.::app.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::app.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef APP_HPP_ -#define APP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - -//${Shared::PeriodicSpecEvt} ................................................. -class PeriodicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint8_t ticks; - -public: - constexpr PeriodicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint8_t ti) - : QP::QEvt(s), - toggles(tg), - ticks(ti) - {} -}; // class PeriodicSpecEvt - -//${Shared::SporadicSpecEvt} ................................................. -class SporadicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint16_t rtc_toggles; - -public: - constexpr SporadicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint16_t trc_tg) - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - {} -}; // class SporadicSpecEvt - -//${Shared::AO_Periodic1} .................................................... -extern QP::QActive * const AO_Periodic1; - -//${Shared::AO_Periodic4} .................................................... -extern QP::QActive * const AO_Periodic4; - -//${Shared::AO_Sporadic2} .................................................... -extern QP::QActive * const AO_Sporadic2; - -//${Shared::AO_Sporadic3} .................................................... -extern QP::QActive * const AO_Sporadic3; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // APP_HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.sct b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvoptx b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvoptx deleted file mode 100644 index 0861ab103..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvoptx +++ /dev/null @@ -1,1048 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - rt-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=979,559,1390,1061,0)(1007=2082,245,2289,466,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 0 - 1 - QK_attr_ - - - 1 - 1 - QF_readySet_ - - - - - 1 - 2 - 0x2000020C - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - rt-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -I0 -O8431 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - rt-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\app.hpp - app.hpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\periodic1.cpp - periodic1.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\periodic4.cpp - periodic4.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\sporadic2.cpp - sporadic2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\sporadic3.cpp - sporadic3.cpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 28 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - 4 - 29 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvprojx b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvprojx deleted file mode 100644 index e6571e986..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/armclang/rt-qv.uvprojx +++ /dev/null @@ -1,1841 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - rt-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - rt-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\rt-qv.bin .\dbg\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - rt-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\rt-qv.bin .\rel\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - rt-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\rt-qv.bin .\spy\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,USE_SCHED_DISABLE - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.cpp deleted file mode 100644 index 8aedcc9c9..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.cpp +++ /dev/null @@ -1,297 +0,0 @@ -//============================================================================ -// BSP for "real-time" Example -// Last updated for version 7.3.1 -// Last updated on 2023-10-03 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -Q_DEFINE_THIS_MODULE("bsp") // for functional-safety assertions - -// Local-scope defines ----------------------------------------------------- - -// test pins on GPIO PA (output) -#define TST1_PIN 7U -#define TST2_PIN 6U -#define TST3_PIN 4U -#define TST4_PIN 1U -#define TST5_PIN 0U -#define TST6_PIN 9U -#define TST7_PIN 5U // LED LD2-Green - -// button on GPIO PC (input) -#define B1_PIN 13U - -#ifdef Q_SPY - // QSpy source IDs - static QSpyId const l_SysTick_Handler = { 100U }; - -#endif - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << TST6_PIN); - for (;;) { // for debugging, hang on in an endless loop... - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - BSP::d1on(); - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 -#ifdef USE_SCHED_DISABLE - QP::QV::schedEnable(); // <== enable the scheduler to process next clock tick -#endif - - // Perform the debouncing of sporadics. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - uint32_t depressed; - uint32_t previous; - } sporadics = { 0U, 0U }; - uint32_t current = ~GPIOC->IDR; // read Port C with state of Sporadic B1 - uint32_t tmp = sporadics.depressed; // save the depressed sporadics - sporadics.depressed |= (sporadics.previous & current); // set depressed - sporadics.depressed &= (sporadics.previous | current); // clear released - sporadics.previous = current; // update the history - tmp ^= sporadics.depressed; // changed debounced depressed - current = sporadics.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - // immutable sporadic-press event - static APP::SporadicSpecEvt const - sporadicA(APP::SPORADIC_A_SIG, 189U, 23U); - // immutable forward-press event - static APP::SporadicSpecEvt const - sporadicB(APP::SPORADIC_B_SIG, 89U, 23U); - APP::AO_Sporadic2->POST(&sporadicA, &l_SysTick_Handler); - APP::AO_Sporadic2->POST(&sporadicB, &l_SysTick_Handler); - } - else { // B1 is released - APP::AO_Periodic4->POST(BSP::getEvtPeriodic4(0U), &l_SysTick_Handler); - APP::AO_Periodic1->POST(BSP::getEvtPeriodic1(0U), &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); - - BSP::d1off(); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable GPIO port PA clock - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - GPIOA->MODER |= - ((1U << 2U*TST1_PIN) | (1U << 2U*TST2_PIN) | (1U << 2U*TST3_PIN) | - (1U << 2U*TST4_PIN) | (1U << 2U*TST5_PIN) | (1U << 2U*TST6_PIN) | - (1U << 2U*TST7_PIN)); - GPIOA->OTYPER &= - ~((1U << TST1_PIN) | (1U << TST2_PIN) | (1U << TST3_PIN) | - (1U << TST4_PIN) | (1U << TST5_PIN) | (1U << TST6_PIN) | - (1U << TST7_PIN)); - GPIOA->PUPDR &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - - // enable GPIOC clock port for the Sporadic B1 - RCC->IOPENR |= (1U << 2U); - - // configure Sporadic B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // instantiate and start QP/C active objects... - static QP::QEvt const *periodic1QSto[10]; // Event queue storage - APP::AO_Periodic1->start( - 1U, // QF-prio - periodic1QSto, // storage for the AO's queue - Q_DIM(periodic1QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic1(0U)); // initialization param - - static QP::QEvt const *sporadic2QSto[8]; // Event queue storage - APP::AO_Sporadic2->start( - 2U, // QF-prio - sporadic2QSto, // storage for the AO's queue - Q_DIM(sporadic2QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *sporadic3QSto[8]; // Event queue storage - APP::AO_Sporadic3->start( - 3U, // QF-prio - sporadic3QSto, // storage for the AO's queue - Q_DIM(sporadic3QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *periodic4QSto[8]; // Event queue storage - APP::AO_Periodic4->start( - 4U, // QF-prio - periodic4QSto, // storage for the AO's queue - Q_DIM(periodic4QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic4(0U)); // initialization event -} -//............................................................................ -void d1on() { GPIOA->BSRR = (1U << TST1_PIN); } -void d1off() { GPIOA->BSRR = (1U << (TST1_PIN + 16U)); } -//............................................................................ -void d2on() { GPIOA->BSRR = (1U << TST2_PIN); } -void d2off() { GPIOA->BSRR = (1U << (TST2_PIN + 16U)); } -//............................................................................ -void d3on() { GPIOA->BSRR = (1U << TST3_PIN); } -void d3off() { GPIOA->BSRR = (1U << (TST3_PIN + 16U)); } -//............................................................................ -void d4on() { GPIOA->BSRR = (1U << TST4_PIN); } -void d4off() { GPIOA->BSRR = (1U << (TST4_PIN + 16U)); } -//............................................................................ -void d5on() { GPIOA->BSRR = (1U << TST5_PIN); } -void d5off() { GPIOA->BSRR = (1U << (TST5_PIN + 16U)); } -//............................................................................ -void d6on() { GPIOA->BSRR = (1U << TST6_PIN); } // LED2 -void d6off() { GPIOA->BSRR = (1U << (TST6_PIN + 16U)); } -//............................................................................ -void d7on() { GPIOA->BSRR = (1U << TST7_PIN); } -void d7off() { GPIOA->BSRR = (1U << (TST7_PIN + 16U)); } - -//............................................................................ -QP::QEvt const *getEvtPeriodic1(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic1 - static APP::PeriodicSpecEvt const periodicSpec1[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 40U, 5U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 30U, 7U) - }; - Q_REQUIRE_ID(500, num < Q_DIM(periodicSpec1)); // must be in range - return &periodicSpec1[num]; -} -//............................................................................ -QP::QEvt const *getEvtPeriodic4(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic4 - static APP::PeriodicSpecEvt const periodicSpec4[] { - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 20U, 2U), - APP::PeriodicSpecEvt(APP::PERIODIC_SPEC_SIG, 10U, 1U) - }; - Q_REQUIRE_ID(600, num < Q_DIM(periodicSpec4)); // must be in range - return &periodicSpec4[num]; -} - -} // namespace BSP - -// QF callbacks ============================================================== -namespace QP { - -void QF::onStartup() { - SystemCoreClockUpdate(); - - // set up the SysTick timer to fire at TICKS_PER_SEC rate - SysTick_Config((SystemCoreClock / BSP::TICKS_PER_SEC) + 1U); - - // set priorities of ISRs used in the system - NVIC_SetPriority(SysTick_IRQn, 0U); - // ... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED - BSP::d7on(); // LED LD2 -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - BSP::d7off(); - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts - BSP::d7on(); -#else - QF_INT_ENABLE(); // just enable interrupts -#endif - BSP::d7off(); -} - -} // namespace QP diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.hpp deleted file mode 100644 index 2af3c06ee..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// "real-time" example to demonstrate timing in QP/C++ -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef HPP_ -#define HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); - -void d1on(); -void d1off(); - -void d2on(); -void d2off(); - -void d3on(); -void d3off(); - -void d4on(); -void d4off(); - -void d5on(); -void d5off(); - -void d6on(); -void d6off(); - -void d7on(); -void d7off(); - -// immutable events for Periodic active objects -QP::QEvt const *getEvtPeriodic1(std::uint8_t num); -QP::QEvt const *getEvtPeriodic4(std::uint8_t num); - -} // namespace BSP - -#endif // HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/main.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/main.cpp deleted file mode 100644 index b8fdc5ea0..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.1 -// Last updated on 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -//............................................................................ -int main(void) { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic1.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic1.cpp deleted file mode 100644 index a7895d9ae..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic1.cpp +++ /dev/null @@ -1,154 +0,0 @@ -//$file${.::periodic1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms.qm -// File: ${.::periodic1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -//$declare${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -class Periodic1 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic1 inst; - -public: - Periodic1(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic1 - -} // namespace APP -//$enddecl${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic1} .................................................... -QP::QActive * const AO_Periodic1 {&Periodic1::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -Periodic1 Periodic1::inst; - -//${AOs::Periodic1::Periodic1} ............................................... -Periodic1::Periodic1() - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic1::SM} ...................................................... -QM_STATE_DEF(Periodic1, initial) { - //${AOs::Periodic1::SM::initial} - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic1::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic1::SM::active} .............................................. -QP::QMState const Periodic1::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic1::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic1::SM::active} -QM_STATE_DEF(Periodic1, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic1::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); - } - - #ifdef USE_SCHED_DISABLE - QP::QV::schedDisable(1U); // <== disable scheduler up to given prio. - #endif - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic1::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d6on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d6off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic4.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic4.cpp deleted file mode 100644 index f6655680a..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/periodic4.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//$file${.::periodic4.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms.qm -// File: ${.::periodic4.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic4.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -//$declare${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -class Periodic4 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic4 inst; - -public: - Periodic4(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic4 - -} // namespace APP -//$enddecl${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic4} .................................................... -QP::QActive * const AO_Periodic4 {&Periodic4::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -Periodic4 Periodic4::inst; - -//${AOs::Periodic4::Periodic4} ............................................... -Periodic4::Periodic4() - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic4::SM} ...................................................... -QM_STATE_DEF(Periodic4, initial) { - //${AOs::Periodic4::SM::initial} - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic4::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic4::SM::active} .............................................. -QP::QMState const Periodic4::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic4::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic4::SM::active} -QM_STATE_DEF(Periodic4, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic4::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic4::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d3on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d3off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/real-time-ms.qm b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/real-time-ms.qm deleted file mode 100644 index df923b1d6..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/real-time-ms.qm +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - - - - - - - - - : QP::QEvt(s), - toggles(tg), - ticks(ti) - - - - - - - - - - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - - - - {&Periodic1::inst}; - - - {&Periodic4::inst}; - - - {&Sporadic2::inst}; - - - {&Sporadic3::inst}; - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); -} - -#ifdef USE_SCHED_DISABLE -QP::QV::schedDisable(1U); // <== disable scheduler up to given prio. -#endif - - - - - - BSP::d6on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d6off(); - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); -} - - - - - - BSP::d3on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d3off(); - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d5on(); -AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 -BSP::d5off(); - - - - - - BSP::d5on(); -AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - -m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; -m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; -m_done = 0U; - -#ifdef USE_SCHED_DISABLE -QP::QV::schedDisable(2U); // <== disable scheduler up to given prio. -#endif - -BSP::d5off(); - - - - - - BSP::d5on(); -static QP::QEvt const reminderEvt(REMINDER_SIG); -postLIFO(&reminderEvt); -BSP::d5off(); - - std::uint16_t toggles = m_total - m_done; -if (toggles > m_per_rtc) { - toggles = m_per_rtc; -} -m_done += toggles; -for (; toggles > 0U; --toggles) { - BSP::d5on(); - BSP::d5off(); -} - -#ifdef USE_SCHED_DISABLE -QP::QV::schedDisable(2U); // <== disable scheduler up to given prio. -#endif - - m_done < m_total - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d4on(); -AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - -m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; -m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; -m_done = 0U; - -#ifdef USE_SCHED_DISABLE -QP::QV::schedDisable(3U); // <== disable scheduler up to given prio. -#endif - -BSP::d4off(); - - - - - - BSP::d4on(); -static QP::QEvt const reminderEvt(REMINDER_SIG); -postLIFO(&reminderEvt); -BSP::d4off(); - - std::uint16_t toggles = m_total - m_done; -if (toggles > m_per_rtc) { - toggles = m_per_rtc; -} -m_done += toggles; -for (; toggles > 0U; --toggles) { - BSP::d4on(); - BSP::d4off(); -} - -#ifdef USE_SCHED_DISABLE -QP::QV::schedDisable(3U); // <== disable scheduler up to given prio. -#endif - - m_done < m_total - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef APP_HPP_ -#define APP_HPP_ - -$declare ${Shared} - -#endif // APP_HPP_ - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -$declare ${AOs::Periodic1} - -$define ${Shared::AO_Periodic1} -$define ${AOs::Periodic1} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -$declare ${AOs::Periodic4} - -$define ${Shared::AO_Periodic4} -$define ${AOs::Periodic4} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -$declare ${AOs::Sporadic2} - -$define ${Shared::AO_Sporadic2} -$define ${AOs::Sporadic2} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -$declare ${AOs::Sporadic3} - -$define ${Shared::AO_Sporadic3} -$define ${AOs::Sporadic3} - - - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/sporadic2.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/sporadic2.cpp deleted file mode 100644 index dc66ed847..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/sporadic2.cpp +++ /dev/null @@ -1,232 +0,0 @@ -//$file${.::sporadic2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time-ms.qm -// File: ${.::sporadic2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -//$declare${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -class Sporadic2 : public QP::QMActive { -public: - std::uint16_t m_per_rtc; - std::uint16_t m_total; - std::uint16_t m_done; - static Sporadic2 inst; - -public: - Sporadic2(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( busy); - QM_ACTION_DECL(busy_e); -}; // class Sporadic2 - -} // namespace APP -//$enddecl${AOs::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic2} .................................................... -QP::QActive * const AO_Sporadic2 {&Sporadic2::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -Sporadic2 Sporadic2::inst; - -//${AOs::Sporadic2::Sporadic2} ............................................... -Sporadic2::Sporadic2() - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) -{} - -//${AOs::Sporadic2::SM} ...................................................... -QM_STATE_DEF(Sporadic2, initial) { - //${AOs::Sporadic2::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic2::active); - QS_FUN_DICTIONARY(&Sporadic2::busy); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic2::SM::active} .............................................. -QP::QMState const Sporadic2::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic2::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic2::SM::active} -QM_STATE_DEF(Sporadic2, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic2::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d5on(); - AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 - BSP::d5off(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Sporadic2::SM::active::SPORADIC_B} - case SPORADIC_B_SIG: { - BSP::d5on(); - AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - - m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; - m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; - m_done = 0U; - - #ifdef USE_SCHED_DISABLE - QP::QV::schedDisable(2U); // <== disable scheduler up to given prio. - #endif - - BSP::d5off(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &busy_s, // target state - { - &busy_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Sporadic2::SM::active::busy} ........................................ -QP::QMState const Sporadic2::busy_s = { - &Sporadic2::active_s, // superstate - &Sporadic2::busy, - &Sporadic2::busy_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic2::SM::active::busy} -QM_ACTION_DEF(Sporadic2, busy_e) { - BSP::d5on(); - static QP::QEvt const reminderEvt(REMINDER_SIG); - postLIFO(&reminderEvt); - BSP::d5off(); - return qm_entry(&busy_s); -} -//${AOs::Sporadic2::SM::active::busy} -QM_STATE_DEF(Sporadic2, busy) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic2::SM::active::busy::REMINDER} - case REMINDER_SIG: { - std::uint16_t toggles = m_total - m_done; - if (toggles > m_per_rtc) { - toggles = m_per_rtc; - } - m_done += toggles; - for (; toggles > 0U; --toggles) { - BSP::d5on(); - BSP::d5off(); - } - - #ifdef USE_SCHED_DISABLE - QP::QV::schedDisable(2U); // <== disable scheduler up to given prio. - #endif - //${AOs::Sporadic2::SM::active::busy::REMINDER::[m_done. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic3.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -//$declare${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -class Sporadic3 : public QP::QMActive { -public: - std::uint16_t m_per_rtc; - std::uint16_t m_total; - std::uint16_t m_done; - static Sporadic3 inst; - -public: - Sporadic3(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( busy); - QM_ACTION_DECL(busy_e); -}; // class Sporadic3 - -} // namespace APP -//$enddecl${AOs::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic3} .................................................... -QP::QActive * const AO_Sporadic3 {&Sporadic3::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -Sporadic3 Sporadic3::inst; - -//${AOs::Sporadic3::Sporadic3} ............................................... -Sporadic3::Sporadic3() - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) -{} - -//${AOs::Sporadic3::SM} ...................................................... -QM_STATE_DEF(Sporadic3, initial) { - //${AOs::Sporadic3::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic3::active); - QS_FUN_DICTIONARY(&Sporadic3::busy); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic3::SM::active} .............................................. -QP::QMState const Sporadic3::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic3::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic3::SM::active} -QM_STATE_DEF(Sporadic3, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic3::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d4on(); - AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - - m_per_rtc = Q_EVT_CAST(SporadicSpecEvt)->rtc_toggles; - m_total = Q_EVT_CAST(SporadicSpecEvt)->toggles; - m_done = 0U; - - #ifdef USE_SCHED_DISABLE - QP::QV::schedDisable(3U); // <== disable scheduler up to given prio. - #endif - - BSP::d4off(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &busy_s, // target state - { - &busy_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Sporadic3::SM::active::busy} ........................................ -QP::QMState const Sporadic3::busy_s = { - &Sporadic3::active_s, // superstate - &Sporadic3::busy, - &Sporadic3::busy_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic3::SM::active::busy} -QM_ACTION_DEF(Sporadic3, busy_e) { - BSP::d4on(); - static QP::QEvt const reminderEvt(REMINDER_SIG); - postLIFO(&reminderEvt); - BSP::d4off(); - return qm_entry(&busy_s); -} -//${AOs::Sporadic3::SM::active::busy} -QM_STATE_DEF(Sporadic3, busy) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic3::SM::active::busy::REMINDER} - case REMINDER_SIG: { - std::uint16_t toggles = m_total - m_done; - if (toggles > m_per_rtc) { - toggles = m_per_rtc; - } - m_done += toggles; - for (; toggles > 0U; --toggles) { - BSP::d4on(); - BSP::d4off(); - } - - #ifdef USE_SCHED_DISABLE - QP::QV::schedDisable(3U); // <== disable scheduler up to given prio. - #endif - //${AOs::Sporadic3::SM::active::busy::REMINDER::[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 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.pvs b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.pvs deleted file mode 100644 index be3041ffd..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.pvs +++ /dev/null @@ -1,83 +0,0 @@ -[D0] -name=D0 -enabled=true -color=4279638298 -conversion_type=0 -conv_options=0 - -[D1] -name=D1 -enabled=true -color=4287582722 -conversion_type=0 -conv_options=0 - -[D2] -name=D2 -enabled=true -color=4291559424 -conversion_type=0 -conv_options=0 - -[D3] -name=D3 -enabled=true -color=4294277376 -conversion_type=0 -conv_options=0 - -[D4] -name=D4 -enabled=true -color=4293776384 -conversion_type=0 -conv_options=0 - -[D5] -name=D5 -enabled=true -color=4285780502 -conversion_type=0 -conv_options=0 - -[D6] -name=D6 -enabled=true -color=4281623972 -conversion_type=0 -conv_options=0 - -[D7] -name=D7 -enabled=true -color=4285878395 -conversion_type=0 -conv_options=0 - -[General] -decode_signals=0 -generated_signals=0 -views=1 -meta_objs=1 - -[view0] -scale=2.4084778420038533e-5 -v_offset=-21 -splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0?\0\0\x6\xd3\x1\0\0\0\x1\x1\0\0\0\x1\0) -segment_display_mode=3 -offset=22 serialization::archive 14 0 0 0 0 0 0 0 0 0 0 0 0 0 6 -zero_offset=22 serialization::archive 14 0 0 0 0 0 0 0 0 0 0 0 0 0 6 -D0\trace_height=40 -D1\trace_height=40 -D2\trace_height=40 -D3\trace_height=40 -D4\trace_height=40 -D5\trace_height=40 -D6\trace_height=40 -D7\trace_height=40 - -[meta_obj0] -type=selection -assoc_view=0 -start_time=22 serialization::archive 14 0 0 0 0 571733 33333333 32948122 95122255 81856909 58237950 -8 0 0 6 -end_time=22 serialization::archive 14 0 0 0 0 2019200 0 1613820 18859512 75471597 8624548 -8 0 0 6 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.sr b/examples/arm-cm/real-time_nucleo-l053r8/qv-ms/traces/rt-qv-ms.sr deleted file mode 100644 index fbf9e08311030bc3e363ba8a48c03b1e5161737f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4054 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 c)akc|V5. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::app.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef APP_HPP_ -#define APP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - -//${Shared::PeriodicSpecEvt} ................................................. -class PeriodicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint8_t ticks; - -public: - constexpr PeriodicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint8_t ti) - : QP::QEvt(s), - toggles(tg), - ticks(ti) - {} -}; // class PeriodicSpecEvt - -//${Shared::SporadicSpecEvt} ................................................. -class SporadicSpecEvt : public QP::QEvt { -public: - std::uint16_t toggles; - std::uint16_t rtc_toggles; - -public: - constexpr SporadicSpecEvt( - QP::QSignal s, - std::uint16_t tg, - std::uint16_t trc_tg) - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - {} -}; // class SporadicSpecEvt - -//${Shared::AO_Periodic1} .................................................... -extern QP::QActive * const AO_Periodic1; - -//${Shared::AO_Periodic4} .................................................... -extern QP::QActive * const AO_Periodic4; - -//${Shared::AO_Sporadic2} .................................................... -extern QP::QActive * const AO_Sporadic2; - -//${Shared::AO_Sporadic3} .................................................... -extern QP::QActive * const AO_Sporadic3; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // APP_HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.sct b/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.sct deleted file mode 100644 index 04d0dc68b..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.sct +++ /dev/null @@ -1,20 +0,0 @@ -; ************************************************************* -; *** Scatter-Loading Description File generated by uVision *** -; -; Adapted by Quantum Leaps: -; moved STACK as the first section in RW_IRAM1 -; ************************************************************* - -LR_IROM1 0x08000000 0x00010000 { ; load region size_region - ER_IROM1 0x08000000 0x00010000 { ; load address = execution address - *.o (RESET, +First) - *(InRoot$$Sections) - .ANY (+RO) - .ANY (+XO) - } - RW_IRAM1 0x20000000 0x00002000 { ; RW data - *.o (STACK, +First) - .ANY (+RW +ZI) - } -} - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvoptx b/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvoptx deleted file mode 100644 index 0861ab103..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvoptx +++ /dev/null @@ -1,1048 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - rt-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(0BC11477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=979,559,1390,1061,0)(1007=2082,245,2289,466,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 0 - 1 - QK_attr_ - - - 1 - 1 - QF_readySet_ - - - - - 1 - 2 - 0x2000020C - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - rt-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -I0 -O8431 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - rt-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U066CFF484951775087074312 -O8431 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64.FLM -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Application - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\app.hpp - app.hpp - 0 - 0 - - - 1 - 2 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\periodic1.cpp - periodic1.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\periodic4.cpp - periodic4.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\sporadic2.cpp - sporadic2.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\sporadic3.cpp - sporadic3.cpp - 0 - 0 - - - - - nucleo-l053r8 - 1 - 0 - 0 - 0 - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - stm32l0xx.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - stm32l053xx.h - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - system_stm32l0xx.c - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - system_stm32l0xx.h - 0 - 0 - - - 2 - 13 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - startup_stm32l053xx.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 14 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_actq.cpp - qf_actq.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qv\qv.cpp - qv.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - qv_port.cpp - 0 - 0 - - - 4 - 28 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - qp_port.hpp - 0 - 0 - - - 4 - 29 - 5 - 0 - 0 - 0 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - qs_port.hpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvprojx b/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvprojx deleted file mode 100644 index 09710afc6..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/armclang/rt-qv.uvprojx +++ /dev/null @@ -1,1841 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - rt-dbg - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - rt-qv - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\rt-qv.bin .\dbg\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 5 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QK_USE_IRQ_HANDLER=WWDG_IRQHandler,QK_USE_IRQ_NUM=0 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - rt-qv - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\rt-qv.bin .\rel\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - rt-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32L053R8Tx - STMicroelectronics - Keil.STM32L0xx_DFP.2.2.0 - http://www.keil.com/pack/ - IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM)) - 0 - $$Device:STM32L053R8Tx$Device\Include\stm32l0xx.h - - - - - - - - - - $$Device:STM32L053R8Tx$SVD\STM32L053x.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - rt-qv - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\rt-qv.bin .\spy\rt-qv.axf - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DARMCM1.DLL - -pCM0+ - SARMCM3.DLL - - TARMCM1.DLL - -pCM0+ - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0+" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY QK_USE_IRQ_HANDLER=LCD_IRQHandler QK_USE_IRQ_NUM=30 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\nucleo-l053r8 - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - rt-qv.sct - - - --entry Reset_Handler - - - - - - - - Application - - - app.hpp - 5 - ..\app.hpp - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - main.cpp - 8 - ..\main.cpp - - - periodic1.cpp - 8 - ..\periodic1.cpp - - - periodic4.cpp - 8 - ..\periodic4.cpp - - - sporadic2.cpp - 8 - ..\sporadic2.cpp - - - sporadic3.cpp - 8 - ..\sporadic3.cpp - - - - - nucleo-l053r8 - - - stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l0xx.h - - - stm32l053xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\stm32l053xx.h - - - system_stm32l0xx.c - 1 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.c - - - system_stm32l0xx.h - 5 - ..\..\..\..\..\3rd_party\nucleo-l053r8\system_stm32l0xx.h - - - startup_stm32l053xx.s - 2 - ..\..\..\..\..\3rd_party\nucleo-l053r8\arm\startup_stm32l053xx.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_actq.cpp - 8 - ..\..\..\..\..\src\qf\qf_actq.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qv.cpp - 8 - ..\..\..\..\..\src\qv\qv.cpp - - - - - QP_port - - - qv_port.cpp - 8 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qv_port.cpp - - - qp_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qp_port.hpp - - - qs_port.hpp - 5 - ..\..\..\..\..\ports\arm-cm\qv\armclang\qs_port.hpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - - - - - - - - - -
diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.cpp deleted file mode 100644 index 46fb31823..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.cpp +++ /dev/null @@ -1,294 +0,0 @@ -//============================================================================ -// BSP for "real-time" Example -// Last updated for version 7.3.1 -// Last updated on 2023-10-03 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -#include "stm32l0xx.h" // CMSIS-compliant header file for the MCU used -// add other drivers if necessary... - -Q_DEFINE_THIS_MODULE("bsp") // for functional-safety assertions - -// Local-scope defines ----------------------------------------------------- - -// test pins on GPIO PA (output) -#define TST1_PIN 7U -#define TST2_PIN 6U -#define TST3_PIN 4U -#define TST4_PIN 1U -#define TST5_PIN 0U -#define TST6_PIN 9U -#define TST7_PIN 5U // LED LD2-Green - -// button on GPIO PC (input) -#define B1_PIN 13U - -#ifdef Q_SPY - // QSpy source IDs - static QSpyId const l_SysTick_Handler = { 100U }; - -#endif - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up the user LED - GPIOA->BSRR = (1U << TST6_PIN); - for (;;) { // for debugging, hang on in an endless loop... - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in the application ========================================== - -void SysTick_Handler(); // prototype -void SysTick_Handler() { - BSP::d1on(); - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // time events at rate 0 - - // Perform the debouncing of sporadics. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - uint32_t depressed; - uint32_t previous; - } sporadics = { 0U, 0U }; - uint32_t current = ~GPIOC->IDR; // read Port C with state of Sporadic B1 - uint32_t tmp = sporadics.depressed; // save the depressed sporadics - sporadics.depressed |= (sporadics.previous & current); // set depressed - sporadics.depressed &= (sporadics.previous | current); // clear released - sporadics.previous = current; // update the history - tmp ^= sporadics.depressed; // changed debounced depressed - current = sporadics.depressed; - - if ((tmp & (1U << B1_PIN)) != 0U) { // debounced B1 state changed? - if ((current & (1U << B1_PIN)) != 0U) { // is B1 depressed? - // immutable sporadic-press event - static APP::SporadicSpecEvt const - sporadicA(APP::SPORADIC_A_SIG, 189U, 0U); - // immutable forward-press event - static APP::SporadicSpecEvt const - sporadicB(APP::SPORADIC_B_SIG, 89U, 0U); - APP::AO_Sporadic2->POST(&sporadicA, &l_SysTick_Handler); - APP::AO_Sporadic2->POST(&sporadicB, &l_SysTick_Handler); - } - else { // B1 is released - APP::AO_Periodic4->POST(BSP::getEvtPeriodic4(0U), &l_SysTick_Handler); - APP::AO_Periodic1->POST(BSP::getEvtPeriodic1(0U), &l_SysTick_Handler); - } - } - - QV_ARM_ERRATUM_838869(); - - BSP::d1off(); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable GPIO port PA clock - RCC->IOPENR |= (1U << 0U); - - // set all used GPIOA pins as push-pull output, no pull-up, pull-down - GPIOA->MODER &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - GPIOA->MODER |= - ((1U << 2U*TST1_PIN) | (1U << 2U*TST2_PIN) | (1U << 2U*TST3_PIN) | - (1U << 2U*TST4_PIN) | (1U << 2U*TST5_PIN) | (1U << 2U*TST6_PIN) | - (1U << 2U*TST7_PIN)); - GPIOA->OTYPER &= - ~((1U << TST1_PIN) | (1U << TST2_PIN) | (1U << TST3_PIN) | - (1U << TST4_PIN) | (1U << TST5_PIN) | (1U << TST6_PIN) | - (1U << TST7_PIN)); - GPIOA->PUPDR &= - ~((3U << 2U*TST1_PIN) | (3U << 2U*TST2_PIN) | (3U << 2U*TST3_PIN) | - (3U << 2U*TST4_PIN) | (3U << 2U*TST5_PIN) | (3U << 2U*TST6_PIN) | - (3U << 2U*TST7_PIN)); - - // enable GPIOC clock port for the Sporadic B1 - RCC->IOPENR |= (1U << 2U); - - // configure Sporadic B1 pin on GPIOC as input, no pull-up, pull-down - GPIOC->MODER &= ~(3U << 2U*B1_PIN); - GPIOC->PUPDR &= ~(3U << 2U*B1_PIN); -} -//............................................................................ -void start() { - // instantiate and start QP/C active objects... - static QP::QEvt const *periodic1QSto[10]; // Event queue storage - APP::AO_Periodic1->start( - 1U, // QF-prio - periodic1QSto, // storage for the AO's queue - Q_DIM(periodic1QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic1(0U)); // initialization param - - static QP::QEvt const *sporadic2QSto[8]; // Event queue storage - APP::AO_Sporadic2->start( - 2U, // QF-prio - sporadic2QSto, // storage for the AO's queue - Q_DIM(sporadic2QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *sporadic3QSto[8]; // Event queue storage - APP::AO_Sporadic3->start( - 3U, // QF-prio - sporadic3QSto, // storage for the AO's queue - Q_DIM(sporadic3QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - (void const *)0); // initialization param -- not used - - static QP::QEvt const *periodic4QSto[8]; // Event queue storage - APP::AO_Periodic4->start( - 4U, // QF-prio - periodic4QSto, // storage for the AO's queue - Q_DIM(periodic4QSto), // queue length - nullptr, 0U, // stack storage, size (not used) - getEvtPeriodic4(0U)); // initialization event -} -//............................................................................ -void d1on() { GPIOA->BSRR = (1U << TST1_PIN); } -void d1off() { GPIOA->BSRR = (1U << (TST1_PIN + 16U)); } -//............................................................................ -void d2on() { GPIOA->BSRR = (1U << TST2_PIN); } -void d2off() { GPIOA->BSRR = (1U << (TST2_PIN + 16U)); } -//............................................................................ -void d3on() { GPIOA->BSRR = (1U << TST3_PIN); } -void d3off() { GPIOA->BSRR = (1U << (TST3_PIN + 16U)); } -//............................................................................ -void d4on() { GPIOA->BSRR = (1U << TST4_PIN); } -void d4off() { GPIOA->BSRR = (1U << (TST4_PIN + 16U)); } -//............................................................................ -void d5on() { GPIOA->BSRR = (1U << TST5_PIN); } -void d5off() { GPIOA->BSRR = (1U << (TST5_PIN + 16U)); } -//............................................................................ -void d6on() { GPIOA->BSRR = (1U << TST6_PIN); } // LED2 -void d6off() { GPIOA->BSRR = (1U << (TST6_PIN + 16U)); } -//............................................................................ -void d7on() { GPIOA->BSRR = (1U << TST7_PIN); } -void d7off() { GPIOA->BSRR = (1U << (TST7_PIN + 16U)); } - -//............................................................................ -QP::QEvt const *getEvtPeriodic1(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic1 - static APP::PeriodicSpecEvt const periodicSpec1[] = { - { APP::PERIODIC_SPEC_SIG, 40U, 5U }, - { APP::PERIODIC_SPEC_SIG, 30U, 7U } - }; - Q_REQUIRE_ID(500, num < Q_DIM(periodicSpec1)); // must be in range - return &periodicSpec1[num]; -} -//............................................................................ -QP::QEvt const *getEvtPeriodic4(uint8_t num) { - // immutable PERIODIC_SPEC events for Periodic4 - static APP::PeriodicSpecEvt const periodicSpec4[] = { - { APP::PERIODIC_SPEC_SIG, 20U, 2U }, - { APP::PERIODIC_SPEC_SIG, 10U, 1U } - }; - Q_REQUIRE_ID(600, num < Q_DIM(periodicSpec4)); // must be in range - return &periodicSpec4[num]; -} - -} // namespace BSP - -// QF callbacks ============================================================== -namespace QP { - -void QF::onStartup() { - SystemCoreClockUpdate(); - - // set up the SysTick timer to fire at TICKS_PER_SEC rate - SysTick_Config((SystemCoreClock / BSP::TICKS_PER_SEC) + 1U); - - // set priorities of ISRs used in the system - NVIC_SetPriority(SysTick_IRQn, 0U); - // ... -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED - BSP::d7on(); // LED LD2 -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - BSP::d7off(); - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts - BSP::d7on(); -#else - QF_INT_ENABLE(); // just enable interrupts -#endif - BSP::d7off(); -} - -} // namespace QP diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.hpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.hpp deleted file mode 100644 index 2af3c06ee..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// "real-time" example to demonstrate timing in QP/C++ -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef HPP_ -#define HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); - -void d1on(); -void d1off(); - -void d2on(); -void d2off(); - -void d3on(); -void d3off(); - -void d4on(); -void d4off(); - -void d5on(); -void d5off(); - -void d6on(); -void d6off(); - -void d7on(); -void d7off(); - -// immutable events for Periodic active objects -QP::QEvt const *getEvtPeriodic1(std::uint8_t num); -QP::QEvt const *getEvtPeriodic4(std::uint8_t num); - -} // namespace BSP - -#endif // HPP_ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/main.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/main.cpp deleted file mode 100644 index b8fdc5ea0..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.1 -// Last updated on 2023-10-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -//............................................................................ -int main(void) { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic1.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic1.cpp deleted file mode 100644 index e4d4a3163..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic1.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//$file${.::periodic1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::periodic1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -//$declare${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -class Periodic1 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic1 inst; - -public: - Periodic1(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic1 - -} // namespace APP -//$enddecl${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic1} .................................................... -QP::QActive * const AO_Periodic1 {&Periodic1::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic1} .......................................................... -Periodic1 Periodic1::inst; - -//${AOs::Periodic1::Periodic1} ............................................... -Periodic1::Periodic1() - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic1::SM} ...................................................... -QM_STATE_DEF(Periodic1, initial) { - //${AOs::Periodic1::SM::initial} - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic1::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic1::SM::active} .............................................. -QP::QMState const Periodic1::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic1::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic1::SM::active} -QM_STATE_DEF(Periodic1, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic1::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic1::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d6on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d6off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic4.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic4.cpp deleted file mode 100644 index 803db11e1..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/periodic4.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//$file${.::periodic4.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::periodic4.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::periodic4.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -//$declare${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -class Periodic4 : public QP::QMActive { -private: - QP::QTimeEvt m_te; - std::uint16_t m_toggles; - -public: - static Periodic4 inst; - -public: - Periodic4(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Periodic4 - -} // namespace APP -//$enddecl${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Periodic4} .................................................... -QP::QActive * const AO_Periodic4 {&Periodic4::inst}; - -} // namespace APP -//$enddef${Shared::AO_Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Periodic4} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Periodic4} .......................................................... -Periodic4 Periodic4::inst; - -//${AOs::Periodic4::Periodic4} ............................................... -Periodic4::Periodic4() - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Periodic4::SM} ...................................................... -QM_STATE_DEF(Periodic4, initial) { - //${AOs::Periodic4::SM::initial} - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - QS_FUN_DICTIONARY(&Periodic4::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Periodic4::SM::active} .............................................. -QP::QMState const Periodic4::active_s = { - QM_STATE_NULL, // superstate (top) - &Periodic4::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Periodic4::SM::active} -QM_STATE_DEF(Periodic4, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Periodic4::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Periodic4::SM::active::PERIODIC_SPEC} - case PERIODIC_SPEC_SIG: { - BSP::d3on(); - m_te.disarm(); - m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); - m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - BSP::d3off(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Periodic4} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/real-time.qm b/examples/arm-cm/real-time_nucleo-l053r8/qv/real-time.qm deleted file mode 100644 index 717a65e27..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/real-time.qm +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - : QP::QSignal { - PERIODIC_SPEC_SIG = QP::Q_USER_SIG, - TIMEOUT_SIG, - SPORADIC_A_SIG, - SPORADIC_B_SIG, - REMINDER_SIG, - // ... - MAX_SIG // the last signal -}; - - - - - - - - - : QP::QEvt(s), - toggles(tg), - ticks(ti) - - - - - - - - - - : QP::QEvt(s), - toggles(tg), - rtc_toggles(trc_tg) - - - - {&Periodic1::inst}; - - - {&Periodic4::inst}; - - - {&Sporadic2::inst}; - - - {&Sporadic3::inst}; - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic1::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, (QP::QEvt::verify_(e)) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d6on(); - BSP::d6off(); -} - - - - - - BSP::d6on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d6off(); - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Periodic4::initial)), - m_te(this, TIMEOUT_SIG, 0U) - - - - Q_REQUIRE_ID(300, QP::QEvt::verify_(e) - && (e->sig == PERIODIC_SPEC_SIG)); - -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; - - - - - - - for (std::uint16_t i = m_toggles; i > 0U; --i) { - BSP::d3on(); - BSP::d3off(); -} - - - - - - BSP::d3on(); -m_te.disarm(); -m_te.armX(Q_EVT_CAST(PeriodicSpecEvt)->ticks, - Q_EVT_CAST(PeriodicSpecEvt)->ticks); -m_toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles; -BSP::d3off(); - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d5on(); -AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 -BSP::d5off(); - - - - - - BSP::d5on(); -AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); -BSP::d5off(); - -for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) -{ - BSP::d5on(); - BSP::d5off(); -} - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) - - - - Q_UNUSED_PAR(e); - - - - - - - BSP::d4on(); -// Sporadic3 --> Periodic4 -AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); -BSP::d4off(); - -for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) -{ - BSP::d4on(); - BSP::d4off(); -} - - - - - - - - - - - - - #ifndef APP_HPP_ -#define APP_HPP_ - -$declare ${Shared} - -#endif // APP_HPP_ - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic1") -} - -$declare ${AOs::Periodic1} - -$define ${Shared::AO_Periodic1} -$define ${AOs::Periodic1} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("periodic4") -} - -$declare ${AOs::Periodic4} - -$define ${Shared::AO_Periodic4} -$define ${AOs::Periodic4} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -$declare ${AOs::Sporadic2} - -$define ${Shared::AO_Sporadic2} -$define ${AOs::Sporadic2} - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -$declare ${AOs::Sporadic3} - -$define ${Shared::AO_Sporadic3} -$define ${AOs::Sporadic3} - - - diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic2.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic2.cpp deleted file mode 100644 index bce445ee2..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic2.cpp +++ /dev/null @@ -1,143 +0,0 @@ -//$file${.::sporadic2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::sporadic2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic2") -} - -//$declare${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -class Sporadic2 : public QP::QMActive { -public: - static Sporadic2 inst; - -public: - Sporadic2(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Sporadic2 - -} // namespace APP -//$enddecl${AOs::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic2} .................................................... -QP::QActive * const AO_Sporadic2 {&Sporadic2::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic2} .......................................................... -Sporadic2 Sporadic2::inst; - -//${AOs::Sporadic2::Sporadic2} ............................................... -Sporadic2::Sporadic2() - : QMActive(Q_STATE_CAST(&Sporadic2::initial)) -{} - -//${AOs::Sporadic2::SM} ...................................................... -QM_STATE_DEF(Sporadic2, initial) { - //${AOs::Sporadic2::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic2::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic2::SM::active} .............................................. -QP::QMState const Sporadic2::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic2::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic2::SM::active} -QM_STATE_DEF(Sporadic2, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic2::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d5on(); - AO_Sporadic3->POST(e, this); // Sporadic2 --> Sporadic3 - BSP::d5off(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Sporadic2::SM::active::SPORADIC_B} - case SPORADIC_B_SIG: { - BSP::d5on(); - AO_Periodic1->POST(BSP::getEvtPeriodic1(1U), this); - BSP::d5off(); - - for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) - { - BSP::d5on(); - BSP::d5off(); - } - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Sporadic2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic3.cpp b/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic3.cpp deleted file mode 100644 index cbdc973e7..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/sporadic3.cpp +++ /dev/null @@ -1,136 +0,0 @@ -//$file${.::sporadic3.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: real-time.qm -// File: ${.::sporadic3.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::sporadic3.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "bsp.hpp" // Board Support Package -#include "app.hpp" // Application interface - -namespace { -Q_DEFINE_THIS_MODULE("sporadic3") -} - -//$declare${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -class Sporadic3 : public QP::QMActive { -public: - static Sporadic3 inst; - -public: - Sporadic3(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); -}; // class Sporadic3 - -} // namespace APP -//$enddecl${AOs::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Sporadic3} .................................................... -QP::QActive * const AO_Sporadic3 {&Sporadic3::inst}; - -} // namespace APP -//$enddef${Shared::AO_Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Sporadic3} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Sporadic3} .......................................................... -Sporadic3 Sporadic3::inst; - -//${AOs::Sporadic3::Sporadic3} ............................................... -Sporadic3::Sporadic3() - : QMActive(Q_STATE_CAST(&Sporadic3::initial)) -{} - -//${AOs::Sporadic3::SM} ...................................................... -QM_STATE_DEF(Sporadic3, initial) { - //${AOs::Sporadic3::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Sporadic3::active); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &active_s, // target state - { - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Sporadic3::SM::active} .............................................. -QP::QMState const Sporadic3::active_s = { - QM_STATE_NULL, // superstate (top) - &Sporadic3::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Sporadic3::SM::active} -QM_STATE_DEF(Sporadic3, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Sporadic3::SM::active::SPORADIC_A} - case SPORADIC_A_SIG: { - BSP::d4on(); - // Sporadic3 --> Periodic4 - AO_Periodic4->POST(BSP::getEvtPeriodic4(1U), this); - BSP::d4off(); - - for (std::uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles; - i > 0U; --i) - { - BSP::d4on(); - BSP::d4off(); - } - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Sporadic3} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.png b/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.png deleted file mode 100644 index 50ddad120e5a3066dbe6af1c3d4ed8630d692ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15256 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 TNdW(&kV9Qn`&PjX>nHyQLlmUm diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.pvs b/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.pvs deleted file mode 100644 index b0a4a1de1..000000000 --- a/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.pvs +++ /dev/null @@ -1,77 +0,0 @@ -[D0] -name=D0 -enabled=true -color=4279638298 -conversion_type=0 -conv_options=0 - -[D1] -name=D1 -enabled=true -color=4287582722 -conversion_type=0 -conv_options=0 - -[D2] -name=D2 -enabled=true -color=4291559424 -conversion_type=0 -conv_options=0 - -[D3] -name=D3 -enabled=true -color=4294277376 -conversion_type=0 -conv_options=0 - -[D4] -name=D4 -enabled=true -color=4293776384 -conversion_type=0 -conv_options=0 - -[D5] -name=D5 -enabled=true -color=4285780502 -conversion_type=0 -conv_options=0 - -[D6] -name=D6 -enabled=true -color=4281623972 -conversion_type=0 -conv_options=0 - -[D7] -name=D7 -enabled=true -color=4285878395 -conversion_type=0 -conv_options=0 - -[General] -decode_signals=0 -generated_signals=0 -views=1 -meta_objs=0 - -[view0] -scale=1.6056518946692354e-5 -v_offset=-21 -splitter_state=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0?\0\0\x6\xd3\x1\0\0\0\x1\x1\0\0\0\x1\0) -segment_display_mode=1 -offset=22 serialization::archive 14 0 0 0 0 251284 52151573 54278773 55316617 8066100 16139919 -8 0 0 6 -zero_offset=22 serialization::archive 14 0 0 0 0 0 0 0 0 0 0 0 0 0 6 -D0\trace_height=40 -D1\trace_height=40 -D2\trace_height=40 -D3\trace_height=40 -D4\trace_height=40 -D5\trace_height=40 -D6\trace_height=40 -D7\trace_height=40 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.sr b/examples/arm-cm/real-time_nucleo-l053r8/qv/traces/rt-qv.sr deleted file mode 100644 index d6f2057183054dda0c0d2b46dae8b3e997465a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4083 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 diff --git a/examples/arm-cm/real-time_nucleo-l053r8/real-time_trace.png b/examples/arm-cm/real-time_nucleo-l053r8/real-time_trace.png deleted file mode 100644 index 749dbad653691464808d07a3bee1883b442eadda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11808 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%0Dj$kee`gzI-^^Eah6eicS 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 diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/README.md b/examples/arm-cr/blinky_launchxl2-tms57012/README.md deleted file mode 100644 index 7f84df1a9..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/README.md +++ /dev/null @@ -1,61 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# Blinky on LAUNCHXL2-TMS57012 board -This example implements the simple [Blinky application](https://www.state-machine.com/qpc/tut_blinky.html) on the LAUNCHXL2-TMS57012 board (ARM Cortex-R4F). The example blinks the LED -on the LAUNCHXL2-TMS57012 board at 1Hz (0.5 seconds on, 0.5 seconds off). - -

-
-LAUNCHXL2-TMS57012 board -

- -## Features Demonstrated -- cooperative QV kernel - + with IAR-ARM toolchain - + with TI-ARM toolchain (in Code Composer Studio) -- preemptive run-to-completion QK kernel - + with IAR-ARM toolchain - + with TI-ARM toolchain (in Code Composer Studio) - -## Build Configurations -- Debug -- Release -- Spy - NOT supported for the simple Blinky example - -# Code Organization -``` -examples\arm-cr\blinky_launchxl2-tms57012 -| -+---qk // preemptive QK kernel -| +---iar // IAR EWARM -| | blinky-qk.eww // IAR EW-ARM workspace -| \---ti // TI CCS -| \---targetConfigs // CCS project (target config) -| .ccsproject // CCS project -| .cproject // CCS project -| .project // CCS project -| -\---qv // cooperative QV kernel -| +---iar // IAR EWARM -| | blinky-qv.eww // IAR EW-ARM workspace -| \---ti // TI CCS -| \---targetConfigs // CCS project (target config) -| .ccsproject // CCS project -| .cproject // CCS project -| .project // CCS project -``` - -# Building the example - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `blinky-qk.eww` or `blinky-qv.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - -### TI CCS -- Import the provided CCS project (either `examples\arm-cr\blinky_launchxl2-tms57012\qk\ti` -or `examples\arm-cr\blinky_launchxl2-tms57012\qv\ti`). -- Change the build configuration in the "Build" drop-down menu. - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/blinky.cpp b/examples/arm-cr/blinky_launchxl2-tms57012/blinky.cpp deleted file mode 100644 index 983a60ae5..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/blinky.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last updated for version: 6.8.0 -// Last updated on: 2020-01-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -//Q_DEFINE_THIS_FILE - -//............................................................................ -class Blinky : public QActive { -private: - QTimeEvt m_timeEvt; - -public: - Blinky(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; - -// local objects ------------------------------------------------------------- -Blinky l_blinky; - -// global objects ------------------------------------------------------------ -QActive * const AO_Blinky = &l_blinky; // opaque pointer - -//............................................................................ -Blinky::Blinky() - : QActive(Q_STATE_CAST(&Blinky::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{ - // empty -} - -// HSM definition ------------------------------------------------------------ -Q_STATE_DEF(Blinky, initial) { - (void)e; // unused parameter - - // arm the time event to expire in half a second and every half second - m_timeEvt.armX(BSP_TICKS_PER_SEC/2U, BSP_TICKS_PER_SEC/2U); - return tran(&off); -} -//............................................................................ -Q_STATE_DEF(Blinky, off) { - QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP_ledOff(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&on); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} -//............................................................................ -Q_STATE_DEF(Blinky, on) { - QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP_ledOn(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&off); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/blinky.hpp b/examples/arm-cr/blinky_launchxl2-tms57012/blinky.hpp deleted file mode 100644 index 3a71fa24d..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/blinky.hpp +++ /dev/null @@ -1,49 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last Updated for Version: 5.8.0 -// Date of the Last Update: 2016-11-30 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BLINKY_HPP -#define BLINKY_HPP - -using namespace QP; - -enum BlinkySignals { - DUMMY_SIG = Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -extern QActive * const AO_Blinky; // opaque pointer - -#endif // BLINKY_HPP diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/bsp.hpp b/examples/arm-cr/blinky_launchxl2-tms57012/bsp.hpp deleted file mode 100644 index a07805273..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/bsp.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last Updated for Version: 5.4.0 -// Date of the Last Update: 2015-05-04 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -uint32_t const BSP_TICKS_PER_SEC = static_cast(100); - -void BSP_init(void); -void BSP_ledOff(void); -void BSP_ledOn(void); - -#endif // BSP_HPP diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/launchxl2-tms57012.png b/examples/arm-cr/blinky_launchxl2-tms57012/launchxl2-tms57012.png deleted file mode 100644 index 04766ae75bfb3eed3b8f778aebfed384af2f23a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136290 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 diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/main.cpp b/examples/arm-cr/blinky_launchxl2-tms57012/main.cpp deleted file mode 100644 index daf362a13..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/main.cpp +++ /dev/null @@ -1,53 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last Updated for Version: 5.4.0 -// Date of the Last Update: 2015-05-04 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -int main() { - static QEvt const *blinkyQSto[10]; // Event queue storage for Blinky - - BSP_init(); // initialize the Board Support Package - QF::init(); // initialize the framework and the underlying RT kernel - - // publish-subscribe not used, no call to QActive::psInit() - // dynamic event allocation not used, no call to QF::poolInit() - - // instantiate and start the active objects... - AO_Blinky->start(1U, // priority - blinkyQSto, Q_DIM(blinkyQSto), // event queue - nullptr, 0U); // stack (unused) - - return QF::run(); // run the QF application -} diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/bsp.cpp b/examples/arm-cr/blinky_launchxl2-tms57012/qk/bsp.cpp deleted file mode 100644 index ffe5f6d74..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/bsp.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//============================================================================ -// Product: "Blinky" on LAUCHXL2-TMS570LS12 board, preemptive QK kernel -// Last Updated for Version: 5.8.1 -// Date of the Last Update: 2016-12-12 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "blinky.hpp" -#include "bsp.hpp" - -#include "sys_common.h" -#include "sys_core.h" -#include "sys_vim.h" -#include "system.h" -#include "gio.h" -#include "rti.h" -#include "het.h" -// add other drivers if necessary... - -//Q_DEFINE_THIS_FILE - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -// Local-scope objects ------------------------------------------------------- -#define LED2_PIN 1 -#define LED2_PORT gioPORTB - -#define LED3_PIN 2 -#define LED3_PORT gioPORTB - -// NOTE: Switch-A is multiplexed on the same port/pin as LED3, -// so you can use one or the other but not both simultaneously. -// -#define SWA_PIN 2 -#define SWA_PORT gioPORTB - -#define SWB_PIN 15 -#define SWB_PORT hetREG1 - -#define VIM_RAM ((t_isrFuncPTR *)0xFFF82000U) - -// ISRs used in this project ================================================= -extern "C" { - -//............................................................................ -QK_IRQ_BEGIN(rtiCompare0) - rtiREG1->INTFLAG = 1U; // clear the interrutp source - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0 -QK_IRQ_END() - -} // extern "C" - -// BSP functions ============================================================= -void BSP_init(void) { - // configure the LEDs - gioInit(); - LED2_PORT->DIR |= (1U << LED2_PIN); // set as output - LED3_PORT->DIR |= (1U << LED3_PIN); // set as output - - // configure the Buttons - SWB_PORT->DIR &= (1U << SWB_PIN); // set as input -} -//............................................................................ -void BSP_ledOff(void) { - LED2_PORT->DCLR = (1U << LED2_PIN); -} -//............................................................................ -void BSP_ledOn(void) { - // exercise the FPU with some floating point computations - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - LED2_PORT->DSET = (1U << LED2_PIN); -} - - -// QF callbacks ============================================================== -void QF::onStartup(void) { - rtiInit(); // configure RTI with UC counter of 7 - rtiSetPeriod(rtiCOUNTER_BLOCK0, - (uint32)((RTI_FREQ*1E6/(7+1))/BSP_TICKS_PER_SEC)); - rtiEnableNotification(rtiNOTIFICATION_COMPARE0); // enable interrupt - rtiStartCounter(rtiCOUNTER_BLOCK0); - - VIM_RAM[2 + 1] = (t_isrFuncPTR)&rtiCompare0; // install the IRQ - vimREG->FIRQPR0 &= ~(1U << 2); // designate interrupt as IRQ, NOTE00 - vimREG->REQMASKSET0 = (1U << 2); // enable RTI interrupt - - QF_INT_ENABLE_ALL(); // enable all interrupts (IRQ and FIQ) -} -//............................................................................ -void QF::onCleanup(void) { -} - -//............................................................................ -void QK::onIdle(void) { - // toggle LED1 on and then off, see NOTE01 - QF_INT_DISABLE(); - LED3_PORT->DSET = (1U << LED3_PIN); - LED3_PORT->DCLR = (1U << LED3_PIN); - QF_INT_ENABLE(); - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-R MCU. - // - _gotoCPUIdle_(); // wait for interrupt -#endif -} - -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)loc; - QS_ASSERTION(module, loc, static_cast(10000U)); - systemREG1->SYSECR = 0; // perform system reset - for (;;) { // explicitly no return - } -} - -//============================================================================ -// NOTE00: -// The FIQ-type interrupts are never disabled in this QP port, therefore -// they can always preempt any code, including the IRQ-handlers (ISRs). -// Therefore, FIQ-type interrupts are "kernel-unaware" and must NEVER call -// any QP services, such as posting events. -// -// NOTE01: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewd b/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewd deleted file mode 100644 index 05b9e883e..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewp b/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewp deleted file mode 100644 index f18c8fe22..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.ewp +++ /dev/null @@ -1,3394 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - launchxl2-tms57012 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\dabort.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\esm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\exceptions.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\gio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\het.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\notification.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\pinmux.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\rti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sci.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_core.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_intvecs.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_mpu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pcr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_phantom.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_selftest.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_startup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_vim.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\system.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qk\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qk\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.eww b/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.eww deleted file mode 100644 index c99248567..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qk.ewp - - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.icf b/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.icf deleted file mode 100644 index 46b1bf98b..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/iar/blinky-qk.icf +++ /dev/null @@ -1,46 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; -define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x1000; -define symbol __ICFEDIT_size_svcstack__ = 0x100; -define symbol __ICFEDIT_size_irqstack__ = 0; -define symbol __ICFEDIT_size_fiqstack__ = 0x100; -define symbol __ICFEDIT_size_undstack__ = 0x100; -define symbol __ICFEDIT_size_abtstack__ = 0x100; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define symbol __region_DRAM_start__ = 0x80000000; -define symbol __region_DRAM_end__ = 0x83FFFFFF; -define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; -define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; -define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; -define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; -define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvecs }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, - block UND_STACK, block ABT_STACK, block HEAP }; -place in DRAM_region { section DRAM }; \ No newline at end of file diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.ccsproject b/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.ccsproject deleted file mode 100644 index 47581724f..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.cproject b/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.cproject deleted file mode 100644 index 5379bea44..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.cproject +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.project b/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.project deleted file mode 100644 index 5d38a34ad..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qk/ti/.project +++ /dev/null @@ -1,74 +0,0 @@ - - - blinky-qk - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QK - 2 - PARENT-5-PROJECT_LOC/src/qk - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - blinky.cpp - 1 - PARENT-2-PROJECT_LOC/blinky.cpp - - - blinky.hpp - 1 - PARENT-2-PROJECT_LOC/blinky.hpp - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.hpp - 1 - PARENT-2-PROJECT_LOC/bsp.hpp - - - launchxl2-tms57012 - 2 - PARENT-5-PROJECT_LOC/3rd_party/launchxl2-tms57012/ti/source - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/bsp.cpp b/examples/arm-cr/blinky_launchxl2-tms57012/qv/bsp.cpp deleted file mode 100644 index 9c0319a10..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/bsp.cpp +++ /dev/null @@ -1,180 +0,0 @@ -//============================================================================ -// Product: "Blinky" on LAUCHXL2-TMS570LS12 board, cooperative QV kernel -// Last Updated for Version: 5.7.0 -// Date of the Last Update: 2016-08-31 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "blinky.hpp" -#include "bsp.hpp" - -#include "sys_common.h" -#include "sys_core.h" -#include "sys_vim.h" -#include "system.h" -#include "gio.h" -#include "rti.h" -#include "het.h" -// add other drivers if necessary... - -//Q_DEFINE_THIS_FILE - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -// Local-scope objects ------------------------------------------------------- -#define LED2_PIN 1 -#define LED2_PORT gioPORTB - -#define LED3_PIN 2 -#define LED3_PORT gioPORTB - -// NOTE: Switch-A is multiplexed on the same port/pin as LED3, -// so you can use one or the other but not both simultaneously. -// -#define SWA_PIN 2 -#define SWA_PORT gioPORTB - -#define SWB_PIN 15 -#define SWB_PORT hetREG1 - -#define VIM_RAM ((t_isrFuncPTR *)0xFFF82000U) - -// ISRs used in this project ================================================= -extern "C" { - -//............................................................................ -// NOTE: -// The QV kernel can use the standard interrupt implementation generated -// by the HALCoGen. Here the RTI COMPARE0 is handled in a "notification" -// function called from rtiCompare0Interrupt() in the rti.c module. -// -void rtiNotification(uint32 notification) { - if (notification == rtiNOTIFICATION_COMPARE0) { - QP::QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0 - } -} - -} // extern "C" - -// BSP functions ============================================================= -void BSP_init(void) { - // configure the LEDs - gioInit(); - LED2_PORT->DIR |= (1U << LED2_PIN); // set as output - LED3_PORT->DIR |= (1U << LED3_PIN); // set as output - - // configure the Buttons - SWB_PORT->DIR &= (1U << SWB_PIN); // set as input -} -//............................................................................ -void BSP_ledOff(void) { - LED2_PORT->DCLR = (1U << LED2_PIN); -} -//............................................................................ -void BSP_ledOn(void) { - // exercise the FPU with some floating point computations - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - LED2_PORT->DSET = (1U << LED2_PIN); -} - - -// QF callbacks ============================================================== -void QF::onStartup(void) { - rtiInit(); // configure RTI with UC counter of 7 - rtiSetPeriod(rtiCOUNTER_BLOCK0, - (uint32)((RTI_FREQ*1E6/(7+1))/BSP_TICKS_PER_SEC)); - rtiEnableNotification(rtiNOTIFICATION_COMPARE0); // enable interrupt - rtiStartCounter(rtiCOUNTER_BLOCK0); - - // NOTE: don't need to install the IRQ handler in VIM_RAM, because - // the standard handler rtiCompare0Interrupt() installed in the - // HALCoGen code is adequate - // - vimREG->FIRQPR0 &= ~(1U << 2); // designate interrupt as IRQ, NOTE00 - vimREG->REQMASKSET0 = (1U << 2); // enable RTI interrupt - - QF_INT_ENABLE_ALL(); // enable all interrupts (IRQ and FIQ) -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QV::onIdle(void) { // CATION: called with interrupts DISABLED, NOTE01 - // toggle LED1 on and then off, see NOTE01 - LED3_PORT->DSET = (1U << LED3_PIN); - LED3_PORT->DCLR = (1U << LED3_PIN); - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-R MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)loc; - QS_ASSERTION(module, loc, static_cast(10000U)); - systemREG1->SYSECR = 0; // perform system reset - for (;;) { // explicitly no return - } -} - -//============================================================================ -// NOTE00: -// The FIQ-type interrupts are never disabled in this QP port, therefore -// they can always preempt any code, including the IRQ-handlers (ISRs). -// Therefore, FIQ-type interrupts are "kernel-unaware" and must NEVER call -// any QP services, such as posting events. -// -// NOTE01: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE02: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewd b/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewd deleted file mode 100644 index 5f85ef1de..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewp b/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewp deleted file mode 100644 index 05d8befa2..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.ewp +++ /dev/null @@ -1,3388 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\..\blinky.cpp - - - $PROJ_DIR$\..\..\blinky.hpp - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - - launchxl2-tms57012 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\dabort.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\esm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\exceptions.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\gio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\notification.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\pinmux.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\rti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sci.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_core.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_intvecs.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_mpu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pcr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_phantom.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_selftest.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_startup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_vim.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\system.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qv\iar\qf_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qv\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.eww b/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.eww deleted file mode 100644 index fa7c77317..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\blinky-qv.ewp - - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.icf b/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.icf deleted file mode 100644 index 31a2ad662..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/iar/blinky-qv.icf +++ /dev/null @@ -1,46 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; -define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x1000; -define symbol __ICFEDIT_size_svcstack__ = 0x100; -define symbol __ICFEDIT_size_irqstack__ = 0x200; -define symbol __ICFEDIT_size_fiqstack__ = 0x100; -define symbol __ICFEDIT_size_undstack__ = 0x100; -define symbol __ICFEDIT_size_abtstack__ = 0x100; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define symbol __region_DRAM_start__ = 0x80000000; -define symbol __region_DRAM_end__ = 0x83FFFFFF; -define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; -define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; -define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; -define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; -define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvecs }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, - block UND_STACK, block ABT_STACK, block HEAP }; -place in DRAM_region { section DRAM }; \ No newline at end of file diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.ccsproject b/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.ccsproject deleted file mode 100644 index 47581724f..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.cproject b/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.cproject deleted file mode 100644 index 39fb8d7a6..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.cproject +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.project b/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.project deleted file mode 100644 index fcbe21ddd..000000000 --- a/examples/arm-cr/blinky_launchxl2-tms57012/qv/ti/.project +++ /dev/null @@ -1,74 +0,0 @@ - - - blinky-qv - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - QV - 2 - PARENT-5-PROJECT_LOC/src/qv - - - blinky.cpp - 1 - PARENT-2-PROJECT_LOC/blinky.cpp - - - blinky.hpp - 1 - PARENT-2-PROJECT_LOC/blinky.hpp - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.hpp - 1 - PARENT-2-PROJECT_LOC/bsp.hpp - - - launchxl2-tms57012 - 2 - PARENT-5-PROJECT_LOC/3rd_party/launchxl2-tms57012/ti/source - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/README.md b/examples/arm-cr/dpp_launchxl2-tms57012/README.md deleted file mode 100644 index 757e8aa05..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/README.md +++ /dev/null @@ -1,88 +0,0 @@ -> **NOTE** -This file is best viewed in a **markdown viewer**, such as the one built into GitHub. Markdown viewers are also available as plug-ins to popular Internet browsers. - -# DPP on LAUNCHXL2-TMS57012 board -This example implements the [Dining Philosophers Problem (DPP) application](https://www.state-machine.com/qpc/tut_dpp.html) on the LAUNCHXL2-TMS57012 board (ARM Cortex-R4F). The example blinks the LED on the LAUNCHXL2-TMS57012 board at 1Hz (0.5 seconds on, 0.5 seconds off). - -

-
-LAUNCHXL2-TMS57012 board -

- -## Features Demonstrated -- multiple cooperating active objects -- immutable (const) events -- mutable (dynamic) events -- time events -- direct event posting -- publish-subscribe event delivery -- cooperative QV kernel - + with IAR-ARM toolchain - + with TI-ARM toolchain (in Code Composer Studio) -- preemptive run-to-completion QK kernel - + with IAR-ARM toolchain - + with TI-ARM toolchain (in Code Composer Studio) - -## Build Configurations -- Debug -- Release -- Spy - software tracing with the built-in virtual COM port - -# Code Organization -``` -examples\arm-cr\dpp_launchxl2-tms57012 -| -+---qk // preemptive QK kernel -| +---iar // IAR EWARM -| | blinky-qk.eww // IAR EW-ARM workspace -| \---ti // TI CCS -| \---targetConfigs // CCS project (target config) -| .ccsproject // CCS project -| .cproject // CCS project -| .project // CCS project -| -\---qv // cooperative QV kernel -| +---iar // IAR EWARM -| | blinky-qv.eww // IAR EW-ARM workspace -| \---ti // TI CCS -| \---targetConfigs // CCS project (target config) -| .ccsproject // CCS project -| .cproject // CCS project -| .project // CCS project -``` - -# Building the example - -### IAR EWARM -- Open the provided IAR EWARM workspace (either `blinky-qk.eww` or `blinky-qv.eww`) -in IAR EWARM IDE. Build/Debug/Download to the board from the IDE. -- Change the build configuration in the "Project Configuration" drop-down menu. - -### TI CCS -- Import the provided CCS project (either `examples\arm-cr\dpp_launchxl2-tms57012\qk\ti` -or `examples\arm-cr\dpp_launchxl2-tms57012\qv\ti`). -- Change the build configuration in the "Build" drop-down menu. - -# Tracing with QP/Spy -When the board is flashed with the Spy build configuration, it produces the QP/Spy software tracing output to the built-in virtual COM port of the LAUNCHXL2-TMS57012 board. The trace is binary rather than ASCII, and therefore requires a special host-based application called QSPY. - -> **NOTE** QSPY host application is available in the QTools collection. - -To launch the QSPY host application: -- open terminal window -- type: - -``` -qspy -c COM5 -``` - -where "COM5" is an example virtual COM port enumerated by the board. You need to check the specific COM port number on your host computer using the Device Manager application, Ports (COM and LPT) section. - - -The following screen shot shows a typical output from QSPY: - -

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

- diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/bsp.hpp b/examples/arm-cr/dpp_launchxl2-tms57012/bsp.hpp deleted file mode 100644 index 2479d54c1..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/bsp.hpp +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void wait4SW1(); -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/dpp.hpp b/examples/arm-cr/dpp_launchxl2-tms57012/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm b/examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/launchxl2-tms57012.png b/examples/arm-cr/dpp_launchxl2-tms57012/launchxl2-tms57012.png deleted file mode 100644 index 04766ae75bfb3eed3b8f778aebfed384af2f23a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136290 zcmcFqV|Qjvu#N4BZQHhOPi)&0+s?!jCr|7rwr$(i#F^ygy=&c{a6j}~r~BjXt~#}M z?TS)XltP5Vg#!TrL6ngeR|Nq9Ck6ol?S}#XJ|XV<`SyJPqAag2@%8nE4ht6@9TONB z*vP|Gq0`J?&Ef_ zzFF?-IoQ^-I!Zy6cD{R zzdGAL%32gdhJA@^2h$vE-Iel982CM7Wjm-v< zQY)h4BxTf=42&17?W@9~GgC9Pv9Kz51TQxhU8Q9ke+92j&6{!aPWBEpYU&*?wDs9I zR27uqqoJn?h!%%Mb+~zk{R;Sd^LIKcCskT8R9C-&TVPU47a*fp862LChVy>E6%UDE zTeap!P9+~&Cn~0}GCZC_Ld}kg*Pib4@bJFg*R{HJ(NM=zY6M_xhuaBIK(S8%6-%963!Xl$IQS79k7eUpM}@B01zWXqte z;^ETzVq-%T4AOw6uDGNMJvmjA&#%tv`bq&&XJfO)qSAG5KRYPcjM(@p1+`Q}bS@6Q zzF)!RnK=tSzowE?Geg5Bc?EI|^w-2BfyrrYS-G3zliWXk*iuqU@r(RDTIkf!i4_n{ zvbKvQp&D`XoTNJUAV#?uu-RyzRj<*24lJ8k?(y%Ofhx6<$H78W#1}uOqWe8 zZszOO{qWC!<~4WcHAHB)F9aHykl*X}|Lep50h^}U?p7-ZIw1fudVYAN`!X-pB)@O_;&K)~zPi)ckQOgLS#eBKw4;djUe*>TE2yQU(VODbW)KFKyl#rCKH(`0<_*}nz z`F$WuQ?GB#VYz6FrlMq!UJaAL#i)_jS`i^ORAm>|Bg`+@eY$h;Ws|1CK>LEjwU3Mq zt>3rNf70IGZbK)BSo&th@{agPdiU}>`9QYtR$e(BZEDS`RY=$?%nK=)m;%s76?<27yX#bF--!yB18s#>l`)SfO;XTqNHJ-_S|uIj*Hj zBK^4f$I|}Yo$O&r+)AMhTTYG3E5)$Dv=O~uO-rS%mU+)Ic}0W9)m9qNMZydq2bXL* zw9EE^ad21P7bjdmuJ;FAyQ_CE zGh@w12+Co!J*g!~Nbn(L`uC3wv{?iF7Apo&K1PLb-1XE@EeoT-v=1^wz6ZI zcWXH<)Yo^R&!3@6sVOENtu1?ap*~PG9%9l1cA4Rxl}5#h_9aj=&;}WGRo2$md+}NSuA17uBDMSiG#vB!J^j=+Kbvp zEMglhG8|^33{jAn2tNwBV5Lg!H*OWoTrRe*Ok&i?9h`weNaRos7iM0` zk##GjFpi#k>oc^Eu+(yDCTqeMsLgRmuw1!hyDb0bkcwRdH*l`RL8#N03pWA$Y*yGM z(2_Z5aE=&J9ux6JWG|5gY|Z);?ct@)q__#SPIn0-tRsB^vqfO+3X#jh-93u!$2KUx z4nP|)n%cDN7EANS)y_kV3^5C*fN~lkY3bCVl0^(NY{U%W0n#|s29VW2NJNo50D}mU zZjV&^Fh9O4kU!M=V9k^dWyol70+-w~{pyfj|JM zL2UZ7yOJ+Z!KFP8uGUjf7(<>#lET5x#^xM>+rsmF=`3;$pWu#4tyjH7H4vXYrRrV@ zpiU7WXvxg%90Cf>-&>-}e}?-&#rlwmef`oRZ znoQO@M{J*45%z+@ekqLNHf>zCo}Ht z38s}cK7T0+W@1$NW;4WsLAe$Q>mU~^zO+g!!B)-)If({+7$Sm-byQm(x~Of46|xgZ zanh_B-%n#L)FCwo+N})RqmPrWj5|GqQlk(N7OJn$+-K-TNE9w^pdDYMUc$NRe;oX$ zf8Clv8J0eLQ*&+6%u$!ukU$}3-nx=wi|jl>1-}m@2n0gppbbCX=~dhuD32%{`pDY9 zhf4Ja)IqJs?4k-?%O@k97gS*xLt;IQS!5JBQCw6#`Sh4cFk#2BDdUMzs@g_nNO#>1 z0P7s=?X0F&v`VOktXlK);o#r^G&}mLcSJptQ-ULJ00%KSh72J$#m5P5tY#opr`MaP!lHVr0tbmV|NdXwtBs5XAf3g?>VV;E={diikJpT4Q6DwHbj zJ&Mqg8{1QmZop#oooRA$yqvna8KvHvf?9duy}p)O#;=O@sbbAaHqvI^!k+z9*^=xD ztQz8IzS8)e*9Rp6?)!F=;KCe(M8@9L{8q<8XBmX8MV}H(5fJduSrgFXKrOlx%aa`T zAYvNaD5?ixf9gSrTeU8J|1YPZ8zr-EfI(x)FfHv>+>?`Azi%~H9*U>ObpDC~ z%ekqnjM>iF@03DK&FnBIVKwv!!+^cATEh#Qw+qvamMxy6)NPPU5OkbYrnMb#`J)SS zSWwVzaP8Xf%jMXy<3KapcOWH%CWYwvsfu!W5`fR|pZ{n57P@1}+P05rH2rVLZ^6Ox ze&oChfB+Vu4fC>Ef*N89Kz#AAa{8zkDMCsXw&-y379D>^-TB~epHw`-`&nB_K@X4D zZGL!8ykRPVrn!annO`QsNe1fyaYW?6i5No86v3R-35n40OzV|Cz7r`s;(ZM0$i&AV zQJMakFKMrj?a=tKv^2Z(U^#+{{q|?g$=VnUvUHL|POHkdtWHIWj?z}ZI% zlv=YNGyD4b)>Q0P|5A>=Af(VXlBu`Y$@l{@Ms6VAoUm2A`>r{bkpOm0s()n-q|M&mkh#-oPxUM1w2nt@-K9U9)1rOU1SqOiDb&|7n#ZCF8IYu6 z(2zmtanXZHw+X{48rBhR7Or1&V#TsZQlE4_$6oQTJsUx9~i@O&u zUG9dW&nO^V^W62e_PAevs6F#9rF!p5|BL@+?Cf2gLqQ@U-O_17jg(E5SWT>`;wa(w zj*iH(CnF4->I8`@E6mgUPgg1uj)b`EL5Pg-OGNsG3k;`{SAdVy*xq5F#_8n63+S{} zIr1R4KU`8WKK-jyT1@ot3a1-=;Gli+t3xjXyvd1VR{y9x2iEKXfEO`P7TDqe@c`+~0zJmn^%4Mh{rqQv0OOy&P!mx_;aKtJt7& zq=|uH-cRsk`D_zvrq|$g_&mmP#?tE(tBGclwG+-{-Nq z+jZBs>v6pAg6dh1>t{MJ)r z*X6!@Z$hWspFLOJgdGM(3U&WAQQC1p!?pESG|`QHwrhKHDfD~R8(|uqD5YHKRrG$i z_#qn|K7s->?_wf2SYNTxzr7~tC_F1%9zU;VOTExW)UmS)rDsK&^(kHQ=8d$^fge&g zet&NCuiDnv+uzSA@u&N4HCZs}wa~S~2XIJ^z}`a0VMSPloF3!2;$ux#l^d`-&@c!L z$sa=w4Uy{v=U|r@3`7QEwFeLcy_Zpvh+#IJSPwF9U z9wZ&>Dk9Yv@d^I3xJcqdGVsiC(`Wy>`X%&lxy{wGmB{ZfNeLh53P$d2E&mArKL0YG zEbs@n2nAGR79r~ad-nVx9zd z{mYdY#~Op)EPcuZMNomwKt6)GpJMAg`{K%?2HkaJ=KNc-0yj^x%EX3K>fE3Nxp#Fq zN6!%{cR0%-e;&T5ElfLPD^IAMt@tz{+#&|AcUucd|DeW_; zO2ssOwS(`z^I?w7-N;LqV6ka2^|(G=27zz1?l|(_`b3ar6jAdd^`eA^8*NJ0K%&xD zQVZkB0yOx4n%*r}c~2D$dy-Z8Ij?5Y&(mm86VcX|gnac^Y-haWlO*h*Y2Mt|((5f@ z1c@6hPb|Y&_q}<2vmaA)`DSho1_te`rzIPVjo8ETu`~zJ5C=*Z2xH~-tN0TaDCUNc zSUd??6_o+&hSGJj_LQO6VkJ6AIMTzE$?Ky)7Z?i z#-Pl_>$PJ}9F7_qCAo7RK%I2Y8!bvLyUOCz)26niRzWEJtRQHe~KV#eb8RLG+_VCUpX*nfD*7{+8XyikyQFS}*srh0$ zT$c1P@0HT!ym^jL7oyobL#vgYo#u@Q>=Tn5R0)SdT}M;}176s=Eij~-N)TO8J)$mi zQ91fY>8qtw{(y@pqZkT8pAVKJ;crWMT-SziCZTCnYclPzK52BP>It}aeo?SO=V%&4 zMK^l@2IpqubdSH)AkuU4nZd)48M~b1@?C#^PUO$1)Jb6`K~~vnW4ePoYB1^y28AA` ztgXBdQ77!+ufu=NyM!%uc6zR5ab|^yJ9jr$RLn3g%hHPuXj}MO)1b^ZykR0Yv(7UQ z7qp{qiXgoc%vYr1-9wPyFG8|&ahh;$S&_vx-n(rX`TVAMuKm3s31KBSeZ*SqG^lnp znMMU{{%~=AXtY2@ z^r3J8w;TqVMnEX6T?C9j^d6R)97nsGgfl{1@j+SeUuebPm64F1CLvYGFbs^P9<6bAaNhALW8`_hi?y=i)jt0%auv7m^G9ucFBcf5SlnNKB> zHEN7P)Mjd8)tF@;K;u~S`0((sv*V-7dQ_}NZ*@a`qV;Z}7+(Xx>B(nyE5ea$&=p4Z zN0v(pVd7|GR%(Gcu9;bXE-@L$J=Mi(o2}0Ug>4g7nbCZ2!9P|IA`7y59!`P9fK5HM z+Qi@$P!VeW3UMb`+w}^MV9%r3)MD>OXFi2h;cxr&}1LT+)VND3g0i<`b5?t_y4{ySk{fGO&Fq>hutkmC<;y(LP zrSU2C7Ct`*Ewz>WC@Da_ake_{Mfa7PNLNe#_=%5i3HMR|!2%Rg%TLQ*?P1jTq@$@|LzWora%Ex<2He0}##SHQ?f8+8nCHuZmjBRfmOB3^~><-kL6T%)T}*bhjzfOB~TE{Ou@T?I<% zrZIXZoJ2g|A#vuoVp%Dww}@`DAx)>29?5)E<@jQ9 zTwI!cS3qH*dnApAtj?1%Wc-g~EK8VtbuYjc8yt;cUx74eO1C!yl zpr4j7(O1L~GHfv+;OOVNf!t!>@tpmSqY?SF#q#hju> z^PMh-qQZ8mjk3;yJNnZ61@%oTD%QWY`$h%<0;6dHQ`G4E1$TphU%Kf?_(j3X4NS|B)SDqs|N9W%R{M>o6niCsYDX+gDkyor1b?5Ae8Nq( z=w_3V76P98E~QvPPgT53)YJOFzHzZ&AcVx{t|;M`Mbjfz`i+l5X?+cBX8N_TMAPA1 z!^m7`Yi(_PrBYQL4%WhP5?!+NjGb$&Y`AE4rIQTOvY7pHG73C=gtbLgu?99v{+*0K z+bQ^=k)*agynZW46Lqa2N_jRVvCypoXwuWuG1ZUp!&=!xiVCXKit@-|#b{DB7;_^l zN#ap884*_G3p7-4g^VqX!ntA;a!(hHCSA|X_v0t~=g-}3BD?pZ6X|4r#iLwzv76GH z9?P1vq18Dq5YKCY34@fTOzkIjH?4kUs|73A2EUjegkPAQ#c=eNRhsU)j9{$}xN8{c z8&_$|7so2lF4>-b{+pF=O-o!QR%|zmDWU^a^=RSgTd0T04H$ zU!ks6AOo?Nmj3L|X|*3#Geq`6&bKkpqeDC%C-@x}6JNMvhuVq%RjEDSqT4VVUSX3) z>aCVW^e?|W$O|WO#+T(72pVHKN}=H#^i1*mT zZumZsHXO~ZA&3BIH3U_Ytkj~H^P-J5=<(bHTH{x?356aeA5B&cMdMjiT3puET^{}R zDbvX=w@l^QbL!VrTiG(vVQ7L%iVHOjnlYy0&;-LyF0mU4Pl9dK?1D&sR#{2(dB!)= z4fE=J^L#DfasvJ)U{SRcI`t~p7MA^WI;oIQ7ZWpF=_4b+uB9w!q>M$LB7w6LojURb zp#>LaX$HTg=~xjxjhPOQrw+Q{!g`?e-X;YF2M`K$+cvx1acVd2D<|w*& z13UwAA?H|ud#K%!dZj@A&ru>1Hp-McseC^o!`DM9BzlwKIXp2W%aO~-#vCzD3UOkX zd%ZHR59HY-X?ig|^Plkzj|fTS=uGaKlJ?soa4OXa2?;S$*YVQ?wM6GQh_}_2}Fj_L?A*YEOyshEpOOsvNgP1 zYpB75a=rgCyA@&@fksf#2=~{Uf1ka$JinP@K8( zi&KX+w&u7D*qAr}EB0rlb+)y3q>up|`3F)&dwAjcVFD+|($g3L1zJq`{kpJt4Q4gY z(m&DAb$Oz?Z2e5KTNpP5?+Xl2s>bBSAv_Lj-`l{u+zHQEgD$@tuGX!N>ZO-7L%b>_ ze**t|vLaZvtG@Xie-9117bAHr^w*r}190UuFw#m~@_X|qD6yMrbkArycorkeWE>;c z%l$r@q>3$@q?rn6r49Tx@=J+PNMmb^It_g3V_w~&AP?AKSFZC?Yie3*6@QkJA5L|< zn3@}CDWBK04s>G~BS3UTt=B`;D3fJR0z?VAkqq7wQ@9qwdL6#2r#soJRGN84mB#d6 zWU}KamAEWdbggoJJrx{Au*5Kt@3*LCsN_ImwPbSd$Fw4$9>0Z5vTi;k`yRjJvZ|X7 zA~R_nQQe^M$)6qU6eagVhqXAQAP7nSk;!rGwN>r#h;d5JCyV(*C&5*MmKBdj_ppl% z%$?{64-GRgtsMJHifAa2eHuHU39!r`Ojn&&~QNDgX21fa|*M&oRTNrY!kV0h@^qnLce)n-O1JF!Dp& zkJ*>i1M9Kv6*Kq-YRp?p*nq-9QMzcDsPNm6I>QEX^>^Q0|R!Kc-8EaBKl%ha^ zv$Ha5qE}A1YkN5!BpFdTgwgm_2NQ7b0zSgAOs&oY0?5#M9gM{27C5^XPFn=7lJ^6+ z&tn~#>_e@$UIp{W3rOux;hX@GfIR+!SOqZFHU`N{J+Fr%ChNrLI-nsoWMC^|U@|d8 z(bXWoQI2QlfRH4TlS{wyh?*TRQr3{5h@VLMl&wqY?BG2U`W&UT8nSN-Mc2m&b-rE@ zr6S*sO+8QkmXDE4-ejYYrc6nlef{LuWT8G#SRTP6BMT}Y)kR&EPNcPQ4D}@g$u!me!Ndjj0{6S9ecYwC(J}|m6)ERfbm#jt6m>lf;)vl%QrG~Qs&U4Nv7*u z_RE@PbFWGAZ3)|ghR7=05H(3)$!*&jtG<;G97d?Sc^}A zl2FOMaOrw|;)Gm-Kbd90pOo!UAG5j*NL0$!@X%c-z8TU=+rxWJWduPRU{Y10Nralk z#?{;QfY*Is>^k--<*H9d{nsR)}MitJ*4SiuT($K7q;mqvjZ zGbZpNAw-^Es4z-2-QOix$nO%!SIoao_ethF3+-QwZ$iimsI07L@z|~)ey*_N**J`( zwr7&ua+WA_k53}ymB-=Pv8-)iRa z`w_>DqOy8~w4jr9pgkqrht=zEV|P}RQ8U_WxSF~$m3Bb?Mw_7FQtvX`*8XtKcc>S6 z5@{}&Mr(JSPe%5PvVeh>px2)V60K7UWykkTw-Nuj;G_WqDXZXI>9?-wG-XEW)S@*9 zN&4vdwG1M~^g}!|YydvCSBNzFG)+CVn(a{bVO#O0p$M_Dt$D9h(%1B8R7OQNUo(5b zT17bOC8N4(MiQp$yA|3ot>Hmk=Rte&B|+H^(7<7fChY?vIovm{qDN_VOslap*wbGVGs#4}40eR!~fW^Gzsr z37|?Z8sho#AQv?AEkC}PC$zY&K;u=^T2qd_A}iuvsq4?5`=_bT6__FO>pcFS<723% zcDl@RPYEP#`{6DFr;<1%gJash8Jtbv(jY z84)oiiiFemr-B>ym=sdC>kdHxyu9Ycw4Os74vOgyuCLp4C8NvJKGThO`-drh9uXcu zcD2$C$xUXq?@vLS!SK++g+2`bML&H^-j5kSk(St~bS|qbu^3nn;lOLSo~4!5XG@dn zbb?3)NVLcGg=E666fqYl^&be^-M*f1G}@z?%QK0^x@qXrqrZaDbq(mC`#~whprgP# z(?BT^R-w5Z0>?@8KqjNg*t5x27Yd8iB-*TvR9BN{T4AJCpU54E0?=0ht}bQKKdZ+d zc}-I6QPVLLY}PcQH9f-lR_NeKZtNm)D?+=P(*YXV0mAkTb%zK#Y7zC-y7<>)!9O~k zz-&_(q-CLC`hogm#kMI#kCL%nZ(Z+%f_Fm_WYQ$vMB6SC$N^ptOpe_+vj^!)^ewp0 zIjf(;Pgg~Ur>%V9b;~MGc|&tUnfc$K=uNq%5_?4x@eqOQ%bztOA$iDVRP(zkUfD)TEC3C@H#k_isC>=~_HA39nHS z5kNt}ZZgL$({WLGaxq|dQI7UoTZW53?7TqL=@$4IaHBF;7z%m44o1B*=2Nf;2P%CG z1%OV1khdMB3w=5uTd>Ca-`qc$GG$$R*FbN0yE~_DzLLILO!fNPb5LN@!8NdUlV6Y_ z$;dS88*6AqR$*4Eq^`Kd9L0UNOFL%SrAb=7hjMdIayg$$qJGP=ce*+lrE%DDK!nT+ zi`*v^@EUEb3j3_^?o|9r7*lK4nov+B=_rOdOe2|Osd7NGvXR5eDtLK_Ps>3{@5%TPYZ zNLk&y9x#1O;ceW26Y=TA&DisK-LwdGza|JdKTLh6lk&~g@#)D+@4LK{_)gbj=?Bj` zEUYzw`$i@OnTld~#?l1XXbr=o4xNC|w4$av4xL`Jsm-(!oJA%UgMFa*QT|_!CEEUa zjFz1zZj1$+=BrX;XepVJROjv6Q!p_Y=0i3%y9)%(1eEMdaDFf* z$Q0@ET-`)xXV1-FdlOEXn?pe;Ok#)&3)e==ELOOR>M9Hg&zdr;a$slP??pdyq{j0}?-Ufb1cp&f!R4g@10Dk`JkKaK~dm#^Cw7-FJRDZaz;RDJ2#? z6Y{lOZG*e|UiSpd;B&Htyc+l&?ml@c=Cqy7W|Eb@*YDvGtb~!!R1J;8gWLz3XbuzU zzs!lhOOv8#pDmNG3aexws;jG)yUcNrRKw+8*qqzu_mu?u=OGI#$4*11MOLA>%bB-s(G*#!KreLyGrHKsqYu)C2 z5;|;L4N=ggqQBLlLHwevyLSS^FHFoX)q~@VH!!As=oqyV#6@M#=;F zjTB5oAQ7}5#Pe;pmDYOl7S}BfrnicOlc$W4n!)5R2)S74>A?2RSw4QC`8k$;Qok`KQq3^owgb{aH_P6 zNWPL1?FkHc`eT}WiE{ZfyF!IVY*9NeI?5w>6ZNwZI=g+FcgI8Js&eM}i5CwH$6G0O zlr+y8e1HO!XFRy?aHPRd06{(G0J}GmcnY|`t3m7|EI#f~i4dBN?ZAPvHW#vS?R)wf z(c^g=_haKZ)}Z^@7rIqQs=@U+zw7xvlP!XA$9bfHEs!{ZF~80A2?*|T(4|}Dhvr2e zSQyJR_9neYvGlW7)4MvemkmN|)7JbVX0rj@ z>wXUg_{-MKfgrj?T0W^9F#fboxm|+l9^`Bv>Oa6C5$?_swtg~9o%pj(*QxF$m;ZB zE5E2OF#E(<+ex?g&H%Civg#Y1BT(apbE{3+nw97|hmy}pj2aj5vJgLA#kj`tbFQ>T zw_^*3LO}qngcgu4wazxoPMLt}z1q-Z?boI2=t5fXuzxrGP@i(1%Xhm9C?=6)aYiqP zK&-48*8zuv0q6PaqOKcdFS!vnMzZgWLyQ$oIB$|GD*3;Rw!~KjXI0PLbBw#Kc*| zSBjw7{a$Zl9MxnZ(;6oxHuI|qr5`q`=m#yMpfTt;Kd+luOw{y9>G`n1#N4vZ30ZuX zT;xg#@P^g4wiVxjem^&a4Wduz1|NFoRs5f_glw{+PVsKH(=ly^nk)`*jU21H*Qb|g zVx;M=5Mi5j(;Vxw_OZFZTsTq1^{Ic5|EVW!2ppouji5q?3aLPUVHNwqoWv&G*@*xK z9!+;xs9%G!Iawl>M8J`>SCs$xVJhT%xqM>ieTpHRB!!fkyF|%F%rV_LlNeI@*2jUl z2{XJ+cY*<9H&$QIB2t%~k%-KvPB)_txoBYPMyB_dX+nn~NPMNB+9s*NyO;H0DB8M0zV~9jzd<3f4j98tVf=%GPu-CLJjE=#~3{pZ;ThlPq zF_P@)&7(Ej6j$1=r68Z2%)k`EnE&eR?`7l^nT8~T9f6ejFwxb8Z<7jp!L{>oamh~r zl-^j=sS6id}!<21_}VzxvEQ;cBbS5^^yC#`}377~Hi1g0JYoO{l}Oa>1- zT)LOK$MFI-&uROMd`q1t8Cei=2xf3rab`_=%*x=ITfH*D$*4}_Bb>O)r!KoiCE&lP z{%y1Ej&YKwY3QJDXj&1IT|*E#%{K&X#SIC3YUx0+y~W$sQ8p8Cz%QoyYbE1>k zswyHVp1CzHC!1+o?bFFO1RRR>x34*|v9*K4$}IhCT#RNLA`v%Kc`?@HoBzIP007(k z8}ceRzV@aIA#o=JDlX23GUawyW4}TyOvSs(Oa962QLHwoTcvFzZt(JrjAYcv>-d)1 z(avT0m%xdr(Lgu=?*r^b(&1Qz_X9Qmmyl1BB0^Yr@?>iJkT&4%zkiWk!>era|~CA#5mvfnszywNlBl^5GRCm*qEfs*i_ z#KaAuyg=_^ITVY=19bUjRNL$V;0#dH(C9VB`GyRxU^EpxeUIei4h%|?7pcT;cGkO* zsuw`&u`4&)AUx3ycHnT?u%&le{B zW|w*ezs%zYus;c`H(#hYMe18 zGY(jrH8i*czJN!9ZDjV(i?5V6!UZLmc_VS_Jn1CjpzIQ5%d57Hd|e+A2|ckTiW+zy zr7_5M=1)zyfqnq}P6r7#jz@8-mb_?~K!#=USWLhbH9AlRQAmNk*;U9yI1ZFCbEIv^}9&M6o!CV-3i;EexNC|LLb2VVv!{x;znN3yCq3C-fr{lp8q}I5^F~j-72lWgIlBwefU5JO9tZj<`~GtbW6!v zkOtY9&ofxeG6|$0!W-T5a`*jWe})57eF$eo6YaMx#WYeNT7I%taDDMFRS$OntE}X@ zDUxxQzrs~x`G)v#cW|UOhq}S{89C5-^CRGD#$&Ig`hqfH$x$I1AKeB;Db=Wyyckpre!M+ILMA01I<} zF!Fi6p|tfnU4R_!3gm}rb6!xeoaX=g@!6BruEJ%mCa<$0rhfUiM8(6I#U+jWmzV^o z$|Eil2~pu0prKkd1}>%a7ZQ7_4pz+funmQPVoia|m;(_O7kl0N-*cWurb5T^aWv)u zQgj4Vk@z3IMm0qtPP0e5209RVZjx!1jlEZE#EW?3uY99K)!^nYT z@!zw1(|wCqp%ur4tOwPXmk6~=Q69Vpj~5=k2S9F2(o(MZPvu3YL&KJx zkwfG-aPETUfvDZ?nrrWViI`CK-nmBT#JlJ+Vi|^+l5RtDO-l~IM>Cpj+H;whpQe+I z)sRaa$B3dPXhTm%1;sS|#o620nYP)s%v1u)9U|dm1+Xg>UKHNL*Yjq3_q9C?B-T@F zt9j%C0JR@@^vAErlrT6^MLyk*?f_6=QtlDU)QCwv9f5>VRtagcZYo3;deq zyPFnqdL=GPP?Pi-h~hRAhl2uCaU#G496`a_n+l)Gx*kWhurM8@f_j69gXfj}&d?b` zln}EIz4A$KK+mD{@4^Q`x@DCOWaL3Vg9E;&5e!FJc8>!CzK$}8vf1^R1pEs1Js~*` z?+K_{gg$N`67gFFzZysKh<-oBb-ykqfkVgRzoYxIiyz^UXPlp}Z=7q5S^jh)t$fG( z`24#=!`yba(>zv2rRX zyfY}t89gJcgTe(^&NNJTsh@fn-Pn+$dtky zPX?fc%`F@RPs+))JRciy>6T^hnq@lHgNs&`01r~N8(hVlIN}tr zR^`|OSUHH;|4PY&ViQB6S4lATEC#&`1Ag$M3J!!2(W4ALy$HiAfI73xN9Zd-Y=Z0& zS;%ewUXxSEd4KR>M$Gi_V{3+J%k|?m;`!y;k>bYt5afk>)ipIbGmcNHzMxaNzP(Wp z7Dg1kvbzs?eTM>5!By!W-p)GznNr}aaXcniqf60@B#@T2qy4R&_M#U1VqbOX<3p95 z^C%awAeGgr1VEh<OtdNvkL(79a$iP&aZ7;!HoM+*t*J&U}*&Z`$J-w` ziLWKd6iYxvX$uuW*#77(oXBSB;PZaf;P!DzMEG(cAmF&Y*61~(7;7GPnEg!1bFTy) z|GP%;Dt4#_IWsFP1G7&I6{Q$P^; z2nnlo%6`g^gJuNyo`*5SYY#{-Cf7^^6(c4y*qKEFor0;c-u6`Srw@Avz>04n?(n;p z<}sNegT_S{uG8@cRP4=)2h7l4c{24RbkkUx>)T5xx^+a5f_WA*?=f91GVPx-C;Jn} zT!y?&#S4J!R^~?&bW(E683O+GMnw?5WxqT4l;e*Pb-0h*on*(k zJ}2OMPS<~@slREpen(P0AN$|^!uPT(f%{C2aY`9vWExVXC7uWG#QDlUWBVOCU(2s7 zYzMvx{{vq@puZqjYij;iZ(o_*yPR2GDf(GGq7y{t=e^eM7#Mq@^W)IktXFG|dwdpi z)M`m*RCxi6wK>%I&il@dgTqtjUs~j2Yr@(ZDy}JTB?$) zEt11Fmo{t%wyH_JL*lK*sYFF4qjIjW9XUK!gULmL)L3-3d7r3A`_t^2x?MoWQN-W@ zjFvHsA-OW51>u{?e&ZCqwL}gGPn%rtGIFr6;NCF(y5?8kSuzd zTX(W^tnc9dpFQ^2=O6o7UBowf=h;V&oIP;BH-i~}^nr%fU-|m61DJ8<#esqJ@P2J6 zradhZtt3E-SO5SZ07*naR4N2xTPBM?xbU}tJp&*3<=0BF{(wNY*>+)7N=n5WvS0;Sbmx_ z#8V(*yC`6`C^)Oj!6O9Y9`Jg(5h7encUWg`^pk6TBB+TklM!VxKt>#JYFCrWdCDb< zKuX+ScEgQ>AU?xtT1FZVq6xOXWg{>j7Kg+23bG%m_S(Cen#T8Clwbo9OByQMiY*6j z>h4_kl>)h<6Nt$Q@;M_2DV+5qemg|CFPX%d6m#H~&#;32p z`|i76e);A9bn6Y%Q;X!Mj-5Sn;Kf3|Ob=Y9#8W51Nu`$4q zQ~cJc-vUhR+^;_w{&nye{?`?xW2F#SzRRE5VB11&q_8x;RG>~9-$L`=a^dT`P>Jna zR1bp0tDaqrC9?$Fz7&Vjz!1PsrQAAAkl@NG93DPEFbG`iFt}6To=@S>iIi;>N)sA7 zZYWRqB9w?c+Dt}cC>;-pNWCo{AVo?dsGIh9;xwEDHb6SX4Zy#FXpb%|94^`<)+;Se z<5N;?IBf6h>sy+iGMi!^+j*e=}LIr%j~t`3i0 zeequ|k#8)+Rlv-w+G?3~qWO6-?2KcsQx7}hlk?vB&ZU^sG#K))h}QIzV@albmRasS zSwIA$LDR+F@W5DC(@~c_4SwhY_8G`Yv zNr{w-l7mh_o;bHv2A?C~@qzHWAg}{(N>?F&ie!yLPWjUazBK<MvKcrc5_9ph-gLDqidMybI-?ozM36J$xqEaa^l#rBij#<{~bX9LyXwWi%uIQ zu*JqcfMT}T%}@3I=5h7v=m!Z>^Xu1rqi?3)|H_Ep{~DdJSfhK3h~Tz1{Y*U`SB2l| zYU+EiQqf?%6l(Ew`?cDV#pgs?Jh%&(3kGrn3~_jlP0Br;Ly0U$!7~T&O~s&HFpt1f z0BO#J!#B6I#F=uJo@scr6Osc2;j#h=d9B(g8Vk~{HqtnPbVtd3LU{fMEHDAzEDmD< z?C1lmR{4K+=dNISbt`-0WE*Rv+rnMIR@uYz!`Pb1l#!Tw%z8!W@WNpk$1y0eaQN^A zI9ZESEUsc|!Gf%?LLnT&_?1GfT;4M`;1p2Who9_u^ZLanvBjsRxNH>x-mU}cutgT& zw?b2OufF=~{%Qf^Vt`0+a6O-fsc1KpC%_LF(zBZK8anh?n=@E2h!8>WNl_>_jt7_(OPx20$LA|XM#y%DO)0Xj*zlbD|7Y*r!`iyfbkSzohDOkMo3M7O zI@$_@Hejd7(IiwsfUV1b)I*?40VYTSg|dPadj!~2r*h>jOP&&=Ix>diM6NZWIF7v_ z2scTKGF73n8nq-?afXhd!bb5ED>lcO9Elm1Tu$P#_xJrIE>1G@%rnpVz6$aOn#yWs_>HOfO^wNn1<3w?f(M4Y!BD$)w&_CJA zJyCM>g>T+}|NVEG-(%16)x&qb^3!j=qBN-J90_mMW3C$<3xnth$N7Bl7`~l*rlLY{ z2M%Bmp-dJh8*6aQEJczYam^?Nh!NsQ&{2&O&eN!jc=M?p4jd+h0*#`|wA`GqP#9f4 zr($bOaRpmhVu=EL;@Bi&!`%h&qh$RDT$CP*x#B~TW!o8{!zw!#XfwR~tKqsLiK5VK ziU{@h?hpv!CNGpm!&q`C#7-wi6qrOW8_VIxt(M%Y!y$`xQ&Xuozu^5x#r9L(mKn?Y zEW-qhRnu(cX^RcPXd?)aQW=DhR3X?4!JhB$!DT&qsX!Vb!YT?XN-#i@A0)a<=!1l@ z(ieI(&N64r?44k?PWN=3ecp^6{^6nGV5wIg@VxXXfc)a$7?oVEWm(Vu+(f8I z)S_GJ<)kTOIrsH1eENU&>RF==xz4{1AoMK^lCSf(lBe5@++vqGslHO#&b`_|#S_Cz zY;Roj!YjZUfAh;13MvXm_`3~~n1~N7`!Ng12cYVOW1Mm|MNqQjjRcb zyZI!(3+l@4CfjBm2oT_rxDXC!go?XmZnql|WYI*Yc5IfCP0Rq2hNG-&vZX9?vy$Ns zjpcF~Zg(7uwm|3GYMeNJ6q_-eVACml4h#gMCQ51tshLQ(qEgqcP)y7=6}B2fRtHCL z?`E_PxcvZx5{N7~=~DO&P6A6s;za>@pr;!k@y?>(HF9u!UhAWwv6+G(SQ@%JG{jLm zgig|z0v6m6BbA9*Rs}f0u&%ylGijItK%|*N3Qy7E*kWKoRxd=#GLBqW27pL?pp7Du z!b1N>)5ceoo92Q+Z)*F21J~pMRu%Bx@zhhdxDec_6OhY;D%K-6=CrkHz24ct-W=qQ z#LRLm_s|zpvi@sVp;xuW6Fsi=m{<>xp8TLcAH8``ev0dLmG_B2&^Tou4o^z>rb?GO z{_R)(`u_WW`H0qamhqJLg_OhG*-CTB;)vnYC%^$evml($59978Ta890lexpzh!hTq z6__J#0gSkvaGP~dX+wf9Y*ETWSOsfLzBM{J8Wy4^bH=YSg(}8VG{>|`!ZUNMuCALx z*@o`iNoG`Q+@qs$ASnT+MVvTG5x68hDOzobsK?6aV9;39qVh1FDk~1>r5sjDYSZAp zr#(L)eSktC{_}91x}~@Hl4~Jkv21$&eU+!+L`ug7Qe(>&QQygs8hA&FEw+dWK!i;n ziD6n0DFiKrzyS(UD&6OUznakIu-Rh10i67UD3PuxtMo9dWqh{0%pnNzNjb6QnX)p2 zta);_wX2|@huQk@Lk}JJazG^yH2vbg-NGR+ee}{BrA*$Jt4}?xV^sU=SUKCH)8@a+ zF&N6~B%E06^)Gz-e^FMky1X?^+yW4nzc{tVAReQ+TygSbA2(HAZgweDbh9(je&mZ%5l-$NqrnF7@+M|65_s|mD zGbuevFUl|@#2g6*h%gUllL|GsGY7}*T%;ia{wVePQ<5=U?f{_JG5u#>qJ(8``9PI!bBjvff#@S zE&>kn1;27I@)Yy=;1S>5UBK#$8%vhFs=Mu3zdcZo6teBEkNz7j3wi3Pr{EFrao5)w zj~%Y8Q@Z_zL4$JBrtS+|PhmyU6?oJD|Dc9LUre+9&(@8sFULK;Q0`hI4SL;o9bfPi zdI@+QHRq>X9<$k{Rpgo!wApN?_v%EN=2u(=_doJK+J1VEBH*n!TT~+9wHGe+#wm_o zC`9TIPEFYmA3z~-3jhF|IT{KIWR>mA=*Mn+KMe?clsSQLkVV{at2#c4+>sVrZn*oS zCUa{rUx-{_)k`_;%neJzR5rmL9UjCkK54W;$LN-rfJhjQ<9*ymY=m$$PM8A}RC=Df zx`bQV!YzxOJjxbMYv0cgOzY~@Gu8+hm>VO5svK120<3`NjvzqzRYuix7r2o9fdFGP zS>jP?gpv+KqB}MVr2y`A~S}W<@A*%5>i72J{=JP&zotsxbW;=EvvoMvAuJ{Hb4k_ z$6a54i9q8eM944hdP5~w)nBiFvZI>WR<+5X^cTn2araoB( zP9P$4YiwZ|!bZ(c!$yPScGEfaxX^(H-5qxlTcc@XDokT1+XIys)avDPk{NIv4efKv zNyby4#&W?!KluI*CvX{@cniQxL+Vt*;7RmR&Pg8AG85r4d8)vEljuUXWhSz3&s2o0 z3Y8ijhDpN zIy*0qr?2dBur?eY8Y3Uak=|$p)|{9R)K^mi5(SVtI3FrRJgvxrZY0Ac96}*dpAYZ> z95P7dm}%vEhoJMd|cWj*INh&S9<%@n38 z7Z(_hs;6a(-^f!cTSU2lw}vmeZ~wCZ@vIA0eaW>3kcE`d>$y9VCikYy{)Lpe>>Tbs zD^KzA%gtP6nE$I+9yOP{%yjQ`Z}aZZ+!J%ZJn^2Y+$3urD{)n}<{MRhQ8OHT8xc^W zUjff+(+g|D;K<`@D=w}X#kj89&5u(;yH+8cppgLP*u=;%ZGym+28!k*%m?ATJ z>&@ZeZr~9-^EP38NH^``b_;VSjPGwJ%bnxn^Zn!V0FTbj`Rqnz z!!lM_`J_IZUXOiIL|+XI;FG8=igQSphcD7Pt;eMb_6>4Yr51V-K!{%8i=~Cv48OTK zbh~O|`vLGE*DgQJ09}0jF1!7%%uby*z8+-ZulMBn1C4ik7cc3&T}4ezLG6NSdOANe zXhC|4P& z8iZ2-D>6U=ygBL+x(Py}6o3ORfQg!)4rawQ@zGHkNt8&Vno;B(J*8k~b?odgx8>Y0 zqwVD~W)sj**iZ>4hv9K-adqed?Ux4vfg2I&SUVG_HQ~$$Cm0c1ZcI{MP-(OXBV$(3 zR#xBC)MhIDEn#R=$lS_K820>NAC_^YO}foiBNc)Rp)6K)XlU7jb4N(h#OJeEtr}V6 z!*0cMjdueeIy(t6;2Gf$cIKvs%jG6pRmK*b z*^tJ_X2~qA9HeC5lI`9dw_*TS<3vPgtXO;n)ZupHp@(yqCK3&Wvq^~Q7>!HQ*$~PW zC&4bY1pvawBnjAijT1aBNot@*1Lb22>Es?oZk%di7!~7cE@8F3IVHnoMU1L)@)!)YQ~4o6_ZV15Ma`SUB~=AF3^;x>mNSl<^nq zM4Rsw2*V`P2M|e92q(QwFe-@n_6clOr%mb*I6-!W`l=S~VsYn&G%64m8!p3(%YYAj zr^j4$r9?951KRNE(R@e;1RSe%CO1KWQS<$1r$D0R7P^j3oKp^391%_|wh9ssyokjF z_yBKNI5|A-@c#Wj`Ax^TxUun}yP0iS9UUF^YOv@}ZOc=^{|$M^pTy}vx83&Geb?Av zuySkBv3CtKi9t|kBv*(&ecu<;tpB|$*p%m57oS=W5Tj>dZ*c}76|RM|slL#a$@cb^ zB%QyIav4oj_t7OfMVFVGjl~4g1SwSe6UlGU}|+$4MM3?yv!P)Nq53kR~ZNK7uud_b8l9 z0=5MUctL6joxm|OLma-$DUiBvwr>f{79FISARLmG(3LXfg<-#r0qRJvVA~?U5fj8G zQ(bINo4;wgE-ZAOaVB_Ni2-iyKAX+z4qHOJ%BHG{V5xU+1%|Un!f|VaZ0w+f4y#`8 z@YVRzT^<4{<=e3Xy^1uve6FfuYh!)qWuy)yjBEe|h%97|aRL$ea;nth2{wg%u|wbg zz90$|D%iQRp`do$Yq}o7*4iU`laIde+mdPRlZE@c5}~_dRIIQ^iM2Sn2VE&a~D;-o9aHJqTH1-SC}-R7oPur zD`>OXRXgn!sdIQVm!{3hgK%Iq8X+(P$SDlMMl~OUm{L0;xSR$6;jocSkYS zBrUD8ZE>5_rx%6?1Xr19mNED0TH(waPWDXzb7a7=B><0d#?$REndM%OF6b#PPL0GZ zz*xr*X z6f-o(ws~{Z7u5@*!rTuBujo|4UQWh-EU$!mmwlK|kBv;LbT2SZi_ibdcOK5NcQih9 zz(Uo$G*VD%H?TNO|J`9 zxwxyKINsw*tp|wT>+1Q^my*MhxkX?NIQ*H{RDl{*3P4EhA3>FuP@8s}1y3)QRD&xQrA?p~^yV;QXB$XAO3Y zYobzk4cZEX6!_iEVg5NqHc1H;6QZX?zJreSBGadv!oxk4WS#VW^d^Wso=xusS$wfNV^^?Efn#cOPalVh> zb-{-hhtDzQ5HF}oa+cRF66r;e1z%=***q;%+;QzU&wS(I0}mZIa9@`9{Iic;ZY=iN z2{_0^x!cI^XCJ%m6cg+<>lE^jF--DR2@{xRRHCpC$OoYn@sTQ#s3W(sm8NsIowyB~N53Xe`#g zbI)&%7xq*gJ>ABn_ybc@*ctB-o)HKgQXoQ&KuB5QmcbLe!;OD|WW#t3sAZIhrn4oNz~XOi4APvJ7(wH9#WxEUFm= z`4p{j{_vmw4-G|u_5w#f3K9vY@4#VmI-}81H|Yrp3w>dYZKgYv)19w9YYMdn6KZX}aE#raDWucqEvTsUmP>|sPbG?DUX3;2Kc==4It#vsEi6c>6X z$|&LHGc`V`KH`9XFK|r`o5nh5QQp|zBW@G}Haf@G;Bl*{O0&m!=gOz^jb3l5%Xln- z(cXc9eH6`3b43q)?O@KyWoble^X=T3+tTD}aUJCzQyOMgg1n^I1RseF;ecf?SfZ1? z_q@34t+&4M%s(JP9;@!yfQ}q(`K{Npw>`AAsAv|mHUt@@^L81xvMn#?Hhj)Qz0>|R z)+lyy*8^l-!n`8soeq*5Io&o~oSev~75OS9cTNW`BkOx|ol!!f5)#may z73!L*Uj4hRg~476W#u@c@j1q$JA3f`CYG&uwO9pzhq4B>6j!4GJK;hRhhFFq#+Pqa z(H&VUjvVP>e9e5MAF{_Y0Ku2|m3+&*_)=-BH`tQ^bYMLe{Eb8WuUcx`T+H4I^YWfO zQ+uWcCnqGigJ8GxE1C4P#LCSeqydfl4CX4EfBc7CyLLTu02hWFcr2}~K7|heNXOIH z>XsN*yO4tstic)7S4bpZv`&3V#ZIqdkoD6Q7R;{IOh`p4-<2}blCmqqla;OtGnY;+ z9g%62e@p^EjI>c()GRyqN^O$n(G?SIrlDb)PNvMXxxCL3mNiR~W&nu!gqy!xhSLX# z!lE3Gs8BX41QcKdcee&!W1_My4g9cc`#Kw(v30Y=ggA#Y^9 zvp?IOSM2o`)(Z6zTSR~8kT0SaTI(3Uv1e}+(-w|Kqf)(<48|h)kCl2w0+GSA3-RT0 zGA3e-|MH8wc75aF^9Yaw_oaQur>|$PoxfJ|qX@_8V!@piL;8`oSK|b5qz_9=590Ll17u&&tZ`yqvvu=ri((ki@Fa zO58H0uCPFW+jCz)StG}rM|A?H_e%ad4q=>PR@lljg^+Ykq- z302cl+YJCnDoLkKfK9dO}5{;`ukxk&k!I&yRol z%KogkI&ZNi^Yi`l*Go&AikqIZ_yhw}f-_QE9TSi*JpW8pZH|F65Q_nK#18G;c__A$ zLFcTOS<3`K4Qc6>NQ`}eJ9Ws?sfW%ZfqW)|9N75K^=T%UUlGbdY+$bm?!6sMQ%LT< z&(}2T;Pkr6!!P+4)`XO|0-is;F5OXVG`fyy^K-$Q&}RQ8S=br@RE*+?XyAq2 zyRnz$>0o+j%qZ`b&MR&dVWC*LsLWN24g<> zZjR(ig3AOdb(Nd^On@n5n$EKFtqHxrrXCwC8TM<_;VNK;G!_U>wyYu}^K8wi%e7k7 ze#^_d{&p|dMW^1c>K=Q~&jx!=a3a|Dr{N@o4odKYJwA*yQ2MZ%3P(5=$&u|nSy|%C zm*>-bko_5OSQo-tdzSu21eATAn2_uzXBSG1^bppV2n72C);ZNIJ@WR?K9&l0?)(t~ zL^?3FN3fDa&&~8rW#U*QpPuW>0L1e0i!Xvv-?+H2_1bw7vHBEyJp1f-9^SaCsz|iS zlHg>_2lkpIaI@#&=aE7R^VW@8@Vh4027{(tEx}90s}gIeRADZQ-9Ed-HP+H|=2Tws z3BBp)6AH`$nk#}`2X~u>k0imHn9m+`AN=6G)Dcuzijn4Knd}4r1Y8KOJ7S|kZ9I5h zUSvhXjqU;+Iu={uGb|{?Jckp<+Q1u8V3sH%gmi(ZEjX}8#HgxpP?bhaov38|`Liq? z>Qho-jZ;IN?90t%0$sC=acqo#@CKu+>t13G^V&mEN1|-FWhD)`;xo3aFh?M;$|V_m zY}vwYk;Cr*Qi$=r4>m4d@=vpOZv(Jc3`z^20pvdh*=!M?HM)6ojWlA_16isQWh30} z9rc$n89v{?a{9%c^J~nJ0R<^*UwL;ugyw;A@JI2B*#6~h!EN3yN4f(&VoT(X$v$=h zSOhzEkWvzo0z#pZZsF}kHK_=!I9UXzzSm&cNF{xLPS_ogV4aPLXBG!#+Jgk#S(VN zcnm!TaEQleEbbd{b`v>dTBts9b@GCinNH?2t~SOqLJc47nqZ8U4=?8O$IAM+)1m!Ex^a) zADrm!6?LV|n~1amcpyv=DVR4LIMnyKswkOT7pz)bFt71R1)ZPQlQJG}lbpOcnV;f< zGUBqE!ZHcnhC$opY>zwq%RicH(Oj5YMRn#`W7m;dkWwOwqmG;E+L9@tkWI~Q8Q&yH z(iOlUBXNq#txLI5<~d2+srh&}DYg=#=?GKsl~j-*b2w{+WGjcziAb;{#`xhlSztg> zIjw9N6%Jc)9Ix6G%CUw4VU(oZUQ8xu<)1W)Lk%B9X=j<_mK_U)!OJ&FcVCYIHT7T3nG>w7G@m4KEK(w)Ddg`pRWN8lrK#o6g9S#yKAHiZB=-8|}^={tKCjEDI`Gh7ER93}t>xk0I0 z03gUMAz=+QcBKN0{aoKYaqt@HoVW%DNjY&XMh#*EtT|y1;b_g~%?`@IThcYvrWbyM zsrWI*^BxE-GLG6};R9lBhAgIX#;Cr+wBAs$UMxH8YG+j353K+W^E7&nKqkYnmH_+= zV66F&jKtc)1_(d`3|scq2l4`}H`zOqh}eXBX;?5N6-xD3kgwNhmUFx3I_kgN*_nNr zIP&bZaIRQ9{vTZPpY;w=SolDCL;A<-f47k5^;QXSES%mJ#m*2ASO5(y&q4(Fq&_0H zVx-3wVUvEIJJ2vNH8q745<`77WBKvhyOdY2Dxdkzf%7Z6>LFkb+#8Yx$F5y({k+Q< z4E(OXx})RTw&%tSGlS^Saf$j2CJs?#2|iELtX<~0^@58I26br?$vd6`fY8Ir*@?19 z+>9_t` zGVhGruiM9iO(TOOKukCU%{p>O?&oTn^(_++0U#c4D)pr=8HcZ2G=ftw(~3&Z38(ui z7jF7AZIl-XyIWkp2AZHNmYV9gg`WJwU@mC$CK;dKJb3H|hOX+G`7(a9s4ZCm23~p4 z4R`sWHgxP}rPKMbn*gMoKIq1lC|sumt^><@oj52bikS~h9MdDq7c1F7fW4t(TeNa! z!i2qbwrISM?xt`?f~8vxkeRXYm_i_l!!9OYG{;o-wyFl5oH4^qo}XpXj-32jbK{>R zj+INknnPbHb;r-yLf2X4Sp3WnzvcYLubgpeaPd?WH|mW3v(pidCk!Lptojag!I&_ZOD?U%+7`3UgbF>w{4X?=T^aLXj-YDN82tMfv__K3`@yd!r7NRPtb4?VuXk zlF20PDpEU~VOg#M9J^~$*$jjsO47BiNuCL0m4-NS;>!^n#D9#&;oP0F=Vi8zE|46H`?`5Y9b39&8{{O6zXFmi2Sz;hOq6{9^D;p8MvD*Pl|MGVB2 zPaE=2IF1!Fo~|}Y;{%9;31};MS56M$avPl2AQZaY@HYnTQm3b5QR?BYt(V}aXUfz` z8azAuGa#`pLe)v4S&jCNYJ0snJ53RvExG0~3qsJ+KmK&-fKWe8-?dP9)3#sERwB!Jex1M=* z|5jrVq~zMtkf-jt?b-9*z@s^Xhz&ppnJkoMkyyik;&TL${9y6wFll2d59pww0R;Sm zbdpzI4mfz9;!pl+FWmoWURxLA5}jzP1r*TcB9kSqk(DJe_hD87K-@VOiU1%+#h8uK z$PCCJ3iFNTxXdjxT~L4&GnY|dEJ77^H_R@x1%#E*srl9@dJlpSjP5$aR)^zaD;v;y zM>sR*SoVf{u$9raGSi!|myptgqdRbRDBz?v8$c7cS2?0WG8+q+3*;SjV)4oI z8#Z7oIWht%6-j5uv$H>y2PAf4KD#r^4xXgLjwzDy#_ah|x{!5mWJ1LA#_Ix{YMns`DlWj$Kqd+tJ5kIQ${A)`R@I9y zzW4`nz4%Pk+26cb|8MeuTy@LH_ut=hvpG2d04bU^tDOcTrU2&CB+lM##K{c^je~zJ*p*aF!S^H5B9kN6?;jtkJ_oC&8Ka7Gab=ETe5#jR9oO~ul zeRy$DV+l#P(}7Ggpga?UN@qIcw@9olE0yeNvREnN-I4|eprf!{(qO@2U=A+2p{THh z!lWQ&OAqw1S}8K9#PWBSfjvkYU?-_IOc&x}d*Em11?TP8uXm6llg@E_$0>Vfx}0SE zKfbWw9j^HH$es&99#x~5SzXXBJOiD z;>6pNpP!H8J% zpCGgWg_zq}hE`4vQP!L*<%Mj3$$){xa<{A)Zn!yaS;=s0xuqyko^cv!;y`q;trN9n z33XiP!0DX=0OEkuK~RDb0*cJN!l$4%EF+DVFRwDlJb?%zqw^CMeV%+ao}KmPb-OqV z5Hb$vus>Oy)tUVtMu5?T^pl7$V5qcsp}07I46TPC1}79_x-p#Bi?*GNu@(q$mP!T; z=~PH8jgUhms6_^nj)~foV{S~S;{^cu+N-SG-YC8Q-l-F&u9CaPR498>_cUF`*cnmY) z016XjIarizO9F)ynbcs+b80b~Yc7&Soi+Rt(XrFu#&al{Y&ZW(GTCP2NlXzeXYW01 zY~%6jOd8FYXut7&+RRmsrll1y$f(AW)BS2WW2|LV<&`RKFIVR(T4J~&9oFRvL1!qN-I&ec6iNj?siuu#SgvGwCUnKz6v(u61PC7FfeeQPwyZkzEo=0#@_iY! zq_Z6uuEJgGYIWE_R{h~DT%mLdXTl4yv&2>-B>KwA!4c9_cXiSCTzm55h`p&q5P&y}DB@&U(@g-zo0@EO5-Pdy^zYFs*Jc^_03&%JeWFwCJ4N z7-0@X2m0`xJ9i$!*+2r{in>C8V6b=Kbxv$`{Gx;6Xf%Q-AUrn1^2Agf%*OmV)I%Be$_ZaxN9L&h&FI(C*v z^G0NGb-a1x!lq+1-KTcTWSSEW9o3&x*UmeCK#+4Jj+b0v<8h+fUCxBKF-aukm2M-63a~o zp3)~>o+(3IWeCz=o-WXa41Esnko5sLEV$^&;r!<_4pjLzz%p(| z!1*XtSS=fqbUoJDnHE^t*?^P-8#Zhh&lIeGBE;KxDhny*%l7LX*XvyfQ#+FF?Zt{Q6v==(Moky;XW{4ps_Oy@aq-%@IS!oC>)7(mLOvd0IMo$%L;X*M=%8BD>b|Fb-D_( zh_jR6$Sq;ys`Qr3IQDbk$n_}M>Ld)S$=o;}mKY0dkr}mO$qVPIvoq5O*g4-x+M%+E z%32@D%6<)V()RkS&Q81iGLVP81Bj&4ejS93{W^-MHL{prZ|YZ)>f+b%VP5QY{my8V zaHQbBav(RgTY(G6PBXBi#UINkdXn`>!aa@s#)Df9F^ zKS^`zWEwX`g%~)Yk9Iew7*~~uVUM&kj4EG=!#<-@sor@LZtblMTiePmXfXLs%xb5D4V;_*0u^ES8+2w%%4b+smu`vz=ybtb6dmtLJj{(VOfA{)aqz&PC6S z@Md#r8eX82GysHGr&$`xZ%&zbMPc5&t05YnoyV(234)vanhWc zGt*|pyX@Jp500yb0>EsEuaB9kN zvMz;nB-rW!0FfYrhz`cX!qH9n@LdYt*y!k}Q&yrd9^om>EfwHvyn)58E0Tjk*~f9U z+RYznWt9$!#~7OvWpFDO+Vl^ejDya%O-)TXCz;tw zL$61rMS{Gzv7E2mTAH`vF*1Px$MukQ@^qBJhTnZm^W@%c4qfTrpnU#Z9<*>rfPqu6WAPv!dXZ!6t*NI>)zP{`&TV9ZHySE?Us zXSuUXzQ`O<)y=Fhh_8Wkg%A^RHv5^hrdCxx>;k5sTEAi!LUVXp{P*}98G5l!}f-4j_AGj);P=9Kq0NP%or|6 zdN(O0b695^TmU*EF&#!4p?$q{bJAcL3=3cy5j!P8mA#w5+lM zI506C#Z_yF38}3{2tEXtA)?TV%vjR^;pg;j4^}sBIMBH|*D8Db(~VJS8UTqU27yK7 z(s&jw;joLx#U1u}vEAO$(K$cA7P!jpoKFj@{{AcinzTuo?*|uRFD;!dZYt8C>+s=f zThLQdvanD{X7&1F1HLN(nwzgsi&hyu)07sWvG0c#Qr< zKmGp14GP0!e@@^yc4g>h?2OHMQP(RRwf@!Qq{K3Iw2rcvi7z*sPbiq++-YM47A5jF zSuj|IMTtC`*G&p%C73bCyf~k4Dmsf2OEJQayT8&LYE!hOjJzCcc+_p`t*evp=#u8J zW>jO{i@KjPUY;0{y$eKfS=3eFS4Uxu!)baD$T#gdOgn!oU?46-$vzoEYc@dLa`7iyOu8^|em>m+jT3>hWCwNPWNv1(N^(AOJ~3K~#O` zsjPHSNqVUJ^?EVp+mSW0`qK1lV+T`KE|}`sa&=nQ#l8<`tU!#bK0UHLbYXI`42`>z%~$p%^JatP@4fu^i$8w*@xOccCym#x zP0MuwZ`K{SDkOb|Y!NOl{Ie;^8ou!1 zUk!7Yz*k5ls$NG;*`42g;-^17I>M_w;V2_@x|0`rwMC)6$~-Jr#~dI4M43F2N`Z&R z(5}TKsYPRcxk@8Oo{?MUo4{Df0-f^sp%Fj@0q!3vSt{Msu*pd|FY# zGrY_XNoW^y=`^p8S9eeR)uJP*mK&nF{Y&boGw#NSu*@x^;8y57$uP#TLGbATW~rNO z5fC^GZJ|WNO&*4;GT@M}P{hiJg-jlNCCiZx^vW}lEs_?=gsT{~lG~@u8N)musbI=2 zcr(kse-Ncrgn%PTV!1I~j80YqV)8=>HUu{YS{+uphmc2>ue9UUE6;(q(}`s@8CpwXSG4ew{iCT5qpUkSqI9Ertc%F2m z6PYC@5)1g|QnANXX>e8hz+b`eEs8oS}>;L*k8F0YE9dF$Ab!}i< zBl6wvn0I=Dg~u0;S5)LJs$5kQo)LuJz@I}t-FWUwZth(BgjvFI&q%mzk6LPZ<%z%i z-XrgRdw8Vv2;ag3NVw>VR$6V-#IL4^@5noAvNVTMM=DZ0p1B(vFHARUQ((XAOcuVn zS$QPcrl9FfWC_Q?cO@4T3ZB6d)_hB*JVFCNj`5xGQRf)_PBNw7Df=pyT6pEbo|Hmy zv0MG#Lg8YM=ee%`{4S%+)W!jw2xN=A`B0d%p4f|D@ z$!-~Yy)qee%esLJE0t84kX1%btrTPt=9uOpb6Bh#(q$)&+BR*sV}9b=^UHt)kal34 zgc!=g!o+A4ZAcAnV1Oq$1P&l%H8VzwUQZn}x;)c8)g9XE0|z#&3=aLwUJsJwn+L~{ z1vbTApDh+=jUxcywHPr2=*U7XMI1=BxLVxVQC)vMYdouCT-@KEu2<|Ai$P$$HZR8B zLO*x52=^!Y2n6(2OB>@|>{;{#>TDR#BI|F#myl$LUcWq8RwgP`O;1!X-X`V-C&n2x zv|S11OfbDK|KpFp`eUV*Wjv=&HD22QZd|KM@6@>i*#qEl*Bx?I;P|yHapPl`nBc;3 zZ?L#Wx5#!C&F+_+RT`F;bN}Q^vQop6A$?R}Yi|ifMyU_aeMmJAd%B~B7k>HIk38~! zKA|{R$>xK>roon%*J4i2-GC7(Fw+1K^;q8#tQDCI@o`?dvKHHEYfWkZNaz@*(v2aR z#m!eAG)P1W+PtY*;|#k)bjx0vC*eCaqq|S!ySh?}TC=v!APc1qw z&@HQ@tk!1*<$(-FK$x|16-5aP`fn@-m)gKsNDYnsosZpi{xxx)lvHNvuPKS{pns`*7~X;7HUdx%0b)-~Fbf zTYHwG`tH2{k$?K;uQu|I_V!f*L};G5&lJXXy<7#3do#Za5({j{;ff^B$Wyv;;l{{? zqBdGlaRLBhGF&)~f=kpKS5v}f(FJ4>rCT%VYz}oL6)9ey=^vZbWyd^u9g5+$_Oma$ zAD|abmmeOv`tBz6!Nq{eqw?Np@0mTVjyRm7GL5O6VVSe;cptZ|g3%V?ZrMaA2NNAD z9UJQkakm84AhKm`UeD^Nw=IFyPT34NbbdvN!J-CqV7N+v%alpn%5)oP8oDgr&=?U$ zgbzOP!W?EhZDeS#(4oi37RoEZ)Bw78z=$5tus&Q{eRwrPhKV6N5 z9UgLW&{wj4Ajl`Fu`e$ zkzHJ-{iz1Lvxjn{-m){eEFLF{I-BLxL9w$>+8RG0}%3y zJ6bIB{q&pX-`u7;?rF;F+O+B2)~411UT_nKvuqvv6D`T=>ATW!<@WX# z?r_8MRsSrzKWb}u;r_pTTy%Wjd;kFahu6J6!J;gm$x1a8LZ}db_OMZS=lAAi#?9_m9iAv*>eiu_b zl86f(Gwr&fIF%^FQR^#?d~GJ^s`FTRSZ$PDd6ljjNyo_JzVudi`pLLIHSQ;6Ht91)xzqPImNnY1AwCpySWB|Y-e z>S|rbV+SsOW~E`;fRJ;KAORxC8plK5-*G)_9`lA-1OV6{f;55O4weMB+RQ&$KW?v2 z*SU)^e1%Yfr|`S;ZvTSU>u(U)Y=V7YI&%HGcDnm#Uv=A1H2U^Mv4v`Yl=m)cJq5Zv zqt?TC>DIiamU5;zI8oWEnw~w~?&swQ!;!I&nR|F+)kgc}4cFeh))-LLXI%%q_t8^d z|LCc0o}e}mV5hg8vfCTa-*($$zghAdf4#7G)8L@tM!xn^Va3>T!ctdxcIr=VN|up# z1#pxIKqA3{F_Ja|6ajSWr+1k2Kg3IEw9CYAx=@Uo1n3H^u-|! zMTNthBxolEuLu-Y+yp$4N-5}*VcalaQcBtsis2EyTFoE3P}f#FOqZalqGY{B|F0Fi zlHE>C&5uP*TaVDgr~T7yW!)vl;@Mio@Xh9U6k zB~(JkpmP8AH=oaOIIs)V@h`XCwms{%$2!IHjR~RtW6mRw492Zkctvs|Sk58^C+u*X zIpf47Jn#>|>^@+`=1?{j`n`G8m+Jqb`mqh4Vvqi``{-X~5%d`I)&2dii80WdWqu%GX>KaxY_7og!zK1q)Cl(dMiUN04P#!F8 zntuN3&55N-KaXyyY;jf2@hWxZgBqDe$e|RNnxJ!LJ{-P%HWSO0XF|DaW8K!I)LPJL z9b#5$tMCJcot-1#n2B)GrHAOTW6C$}S>n$79v;9gm_o~Kx1IXclK_wT@y?9`{a1E> z`;iixPmg_zju;uv?!XnIJ^+^kdx4Qw;EN3_vJ!PYdDEW7tlu>?Za@l||AYgXUz<-t ztTq|5dmSDC6j}AxuUB_o2E!p1S9dgyciOARF;FEw)!A5&9V1!w^&OzXutbq?$9&qa zqsSV6dZF0UvXmpWNd>+`I9bsb16Ul|`6H=x;E)uvA%G5_;LtunWKOH&8U}L{V9ndu zAmddXJ^Dxg($QCzj5)cvRl#Y7Wfva0_MLA$)0owf)!6wv)%a_#y_VIvjR`QSyr-{k zNH3hq?A19nT^#hP3TJyK^GXl*R1`KfxhjLbhnZUGpNdcK;a&ak++>S?V)*9OiNeBJ zLyWrm!Xw{%$paAt!fekP1764vJD+__-;YzmYlf2 z^LrMwm(KFqdz1&`|5{YJ(Bgfr?aE%`J+hGsuV>-?0?E1D-OXniZ_(h0qSABr0i~`h zuD1zmM$2l8l*$rbI~!Q3lOm}O`C9CD%X%DaS#5b*nMbk`w<7OMbCYG5=-`mjLp|s! z;y(0MaL#a`;4>DXBdoEMow{Vcd>N|@H$3*Yw#c`d@Bem*hGf<`Q6V@MVPtSf88TRe z(oEFLAq4yYgTOzHD)GB2ytD6Yt!}bEyP}Z{eBvwbwwVUGn#or|OnLB!DFs z=wmp?;n0p9Q}9SeI2;lHQUtc42X7|I$`blqTwEBlD!9BNZsAW~sr3Buk4NRkL~i0a zT?@;2?mmCu;cq;1;NgcJe&(8Y!+qz0DyD-^cU*gn@W!)bqYha+lWOaua!*l7u5ap3A=H~XH#D$s^Es9I%CgfDvuP6CrfzBCmHYqt+u#11Uw-#h zuI^ZaOlDEuR4i30HIe9<8k}+~v`HNR5JQTTAr7f=P6%I8kp#yrF{yFpR9kJTLcu%M z90~I+2j6eIF{}U_X*6N?rd0V}T2aRzbyAu!SCgv^eq^GF7Ks)X{6~t~mG@9D7tBt3 z^QN~}o$FrXpx4V7ffv>(S;`*1&BM+EcyD5z(PN_q++;kiHYI9$v zd}J*JxDv10vTn{>V2x2&b_+HG>RN`&3|5jOhvOoJTR#Cu6kYdk;UI4S$?z{6+sqJe z*0cEjf%`f;&!4~VzJIXz^v;7%-2Xp?Sh`DrWr^8lPEJ>O0O^6T`zv@^7?5DYlZ5>pZBk%`m!-wc)g>3{I!0uxU;bXOo({=ddHgp z3V;Y8L|osI1y5fa&$?c3AIIzmG6%dbCgcI|z~|M+y>NAd_9HEXuakj`(sXUFU|`SA zoj(GzzHDZ3!vmRcLXw3M$Gg+)^ecaS!DF28dygbyv5_XAYNmMWM%<}`OLe}p)dSpB z{q)@%GN2$cvsM5S)an+i_V>Qm?rHL?nvzCU@0hZ;+X{|O@c;LGdQx%q>g43PA=?mJ z8;-{2Uiqh2Zf`KKrz6zlo!|TR6ZhXKDbx8uRq?p~30_IU;RD?t#_cmb;^2dY5>|+RFWfwUR5f)2d*V`^Wci+x;GI zxpEVG!wvUrcP$xRwbB>9HUo5>v|9JhT6sxe6-_9sT3cvQ4&~6tuqBjK-$t>82=$c> zg~&7Kv&7f%rfAs2ZFTKG@DCfGx$XRUT(R`8F`;Ah9U91a+ku+q;4P_eLGTA{=EkahFqlM@veIC`< z>#t{tuUC)11|M|P+wJ!1tp0KFn;mwf6}%8!VtdDv9rp3e&%yf$ihlAnD+^iVe>3;? zVNITS+VIgCoODuF7A9GZz@}-kNjg9<>sSOq2`nTQ!KBDzK1iV4N^BcIv&^K$iG&UX zqyb@7sA&|W5|E&De2EsZF*Pk1qC;MT6EUeriOQqnn_v~NGx+FxUDqAZ*?s=(?9Rvh;N)#QntFezD!BjnI5AU_)` zcGRAzsi6;Bi@8ouRfTkdDU96y@~&Nf1PFlxtq+pA3F{zr9D8wAFWNj+lqeKd2s4J} zGX*j!dxAC=?I!~H3d_6xu3M+p13h(2GkuJ30MudaIIjki{}N8dE4a;na+ z+HzE$pcc%iJsmyg^Nv(;a@-9P;JHP14FCw)uGIn{z`@eON>&vaJWqWF0g{=i62WfT zl9PZ>dQu8~K8bzz{nP{?vADb80s=aFPq4Y?ii(;_lGr(nZlwycDn^YxMI4Wr~WdWWpI*f$=Om@tFUCI}842U*y3ZG+ue_@Mmu z!@;=8@}yS?UvGNw^|3>B$bc3VZB{5e?lW(%{ueToP{4SQQ-GmeyfUy#4a9~*XD7S- zez^l16A{~<$_z9TyX;{8+J|ws2cM5a#AyVk##`__A6`oG3OM!zfQEATjb%?>0W6YO zeLZQ4fa*w4z5}431&!_n@@fze4U|<76Odit1poqU{*z9N*W1aDLcLO&w#a5-!6a+`R-&WeM;oSQCkDq_OawS~McJ}Pz zF1E#~?>K+JcSRf6iK!T7GDgNyQlp>h>s@ddwhJ|wFc^QQ;i{5f{m12;^GrY(KCQ^7X*-@9NDT%vyI>)qnwyuGm)Ucr(We1!r7JHsrKcyE2PaOeXAbUZzI%n6 zW~j^?6Y5FID?QCBa?HFy?4`{BfK<}5+Rn`Njz-?+_wd6TN7Ixs+qcsL*W|)AU4k** z<6s7)ck$S$yi(+JYtyTShcZkd23bPMivsGGOG^oU`FyZ0KD!FTq`;B0Du-t*l_@vV zWD{_9io%RQ!a?Cr@DC@$a$L{%XJJS+={jMs=ulQc-AiZTiarRD2P!wYZ~GT-q>#bi z#_e?a_!$Tq1F+0h0NdpK3Y}AP{H~2s%ui<0!ihv@_#R`i%zKYum`Xx5i+HjxRDX-V z!;=^-I7$WqPm~XWQw|6rF=;SAf3O-D4_LAYD;Ob(Ktv!&v=C4b82*)e@W<`9w(nZG2_mGfC^U;SG}ZbTzPJ!B_AHtr5KazDi<$fT{eI11tX4CNW-X!> zB!7n#66{Gyxp~FxcHcE|IXTX|Kl|Cwe%O7Uq)y*D@WtD2ya5;_&t!EBH#bw##FZ&( zyA!B#RI3d~*1)q5E`SiS#O)TTQc6mI3AsYmk^w-H;V6<+VHf;{w$YRuDVaUZ;T*E0 zfu|18_TTM!MkP}h3VVyEEABRrrO6}P_9etBX{njb&C#0Cdzjd0AZ4Yb1T!q_^P+DE z26U}&kh+a3NS_=$IL+K47k`3Hgdbor#D3m!sfra zxFY&jx6yGx1Tq=%p+eza^Xs=$oC=PP>{4ikpYw-Q3g75tq9(JLRw5M4#MdT!G3G#?(IMJB$iEW7MU{t6(h2;D$eRX+hBNrFzK`lBb= z5GXK^3nRLNu-6b-bohA^!VEMdh)W2A8`xgp(^0aM(S$eM?u85jucma5Ia=(Mub0zu zi-WK$9ToIC6PSEa^AJ0gRxD?6>m${~+1A!pqRZtx_4%zc-vJ7Nd)eX^k+C@W9cK@K zkIDRkgGPhbViMeUg}bO@%xKr*ARr*JM*gn0PSGk$U@SL{GQ*^#3Jz4I&#v0CdiBob z|5R_{>ReZrZ`rbH2VZRpcJYI9S}Hf3>Vty@oH`vi=0Gb!lxPq>L?W`?uC*5)&&vh! zq?xMIwrSdIf!v@lwWpT~PnizFLWv6KmEAwtHEs|Fl zvtGVdzQ4XFFWA_YWweTi)@J>RU&7^Q77J*({JGMb>d~iyZKG{j4w=K@FbXQNWXhQF zLUnX+@*N76BGKyLkn$=Dw%7*yTu3eL=?J03w3IDGm50EQ(=wI9VX?3ZoPG%hPzEe> z)#`{HM6I^tZil_E0Vph3w40vJ0e)n5^MeNwu zOU)fEc&Ha8(aWo|pOg)PQ-2+}^|J1y@{gWeAIz@?G;+HdcoT#MNII}!3uhCYH*i`( zS(KJbmk2+pHL&H=>Q*>=RGYpyC=S*i!^v1gvx{4El4i`Pm0?`P;>h0cG)pFplt!s% zeN|9k*_K$UWsHn85UZTL&p$r}DFnC>l=Z;<`QlD!gpXrIadia+-(VQYsAu&GE1#CC zC_xp`1qYHM3Tch{yFo{0&%a*w0C4pD;NoevHp@tAv;EqZe|!6l*S=_3v zyuAbeYfmFV7FefO@{C+#M*E*d$-K@~6B8tuy;ja7`%7Fd4{-ubz+u)gFz=Skx=l-uF8jp^w z(e#et0Fi+gB(nqp6AOrno(T$nYq-ik+d-_-5c?CRw~?gYdu4)ylaq@})~^4jT9c6K z0^mu4WhU8#a`eoT>{rU4z=n{P>)q9_d{p+z6Qr?{uD2{!U*W`&l(hH}@<#|SNgLL( zjh0L&WDq#g1iJOTzx!Pi1W5YtT0Q2d#F}D*Q6Q#7EzKi!^3#R`Hd{@u>8BCp-+c3p z-tTmCoK9Dj_7(uhcPkHlRkm>wPk9_W7K&csZ$(9MMGqq1%i88WP_Nc#QZN(d?e*K> zFgXYjpt5HFPC~smucTawa=(+lLu}JE5dW#??hm}JCYFMH?&xc8tp2Cf=Ne-%=K7RU z;G4yypc?$1VQUXrQ$=>cDd*R=EFVDEs&iLtR82qhA;5)j6m7|=fmmT|Pp^cd^Z8VV zb8~~uv3#NglG_!d=2L3v$@Rmm8GX$7c9ve4Mp4p7CsG>=>zP=FxRy1#L$039oUp_usM>g2 zcW}w56UpNO6!KSoV`)?1Uq!M)j$E!6D*0qi)t%#h5%3wXIYP^Ed$fQ+-02F&JFmKR z98uKGVWuIrRHB9PUbmg2?RpRq_W+_}ak=Y5!b_8JxJw5tyXO9VmJ|HEdi7E(sTija zDa40NAeEU6y~J6?R*$C&{J50T09RRRF11+odhx;T?t|Z;K-Tkd3)dG%BcehR7{-ES zBd-t$uUrRq;|UO1`AJEy47Q+o4Eg!_P*=gDf9X=v5;Q^}!O@ZQ`~u%X@EW}v?m?Rl z7zD1JVx%*E^ZvV+&9DLY-FH3aGg$`lye-Pp+6vp6@Cl?Ymx5D*Ni#a9^;1>>t<(e5 zk<;l}Kn#*)m=Lc34Dvj#dkn5mKQ=iD9zNK#^7O8i^xQd(|A;0RGa50L2JQ^OU*Ld8 z^Z$6LS9#@b&rOOvEsc`WBa2ozQ zY9se+;CxKTA1-p~-S&Zj<&VI%>d_;BlSh9p^+PKHTnO1Mfg3i1!q{-1-R%>po@VBy z1~d6>Fj%El?hgiZ@KOY)9()a$vv zIj_KB%{chpU4H7*n`u^ufpRi3`gkPE2uR~`y~#kDFpvzRELrcq?dp0uy~{Rix*s1l zzR<{xJ>0)lfEiUfSiP;yxq&@z>v*BRV{rmp2rAf+X@VvcQVa$PH!7vsrfY4z+-i1n z&`4*u*4zr0inuT2!0=AGgtzskyhE$t*m)9|6;W-fi+gYkN62Cvvk1TH%Rx$qq}3vG zAfKLeJt>q7c~aJ0M#x`LJqV8Z_3G^Gvg~|lJO+{3xU^_EE-hlAWr;HoM3B~kpAa^5 zlGug=A{gP_3oxREp{rM4XSBAaGe+KFC_Md2smW>s24%0g2_R-~Yb)Rqpv71jSO)vV zS##d${fp9C7{Ohu;s+pTM^DM%ipx zX{0RLevKcEdw1a+@;^L^bp6eL-TLfjJ1pn#%(^;mT85sI&HjPauf6^DKes>SXUvNv zNAC7qNl+(X`&DF~DqO__vI-8yB#R(G$WBc{J3z-Ohz}ejtCkO3EGOMv4}rZ)8THK=Hb!Q3l7z4hxYM*TLSFpzh*x!2eB=`hL5HoRBz zES56L8?E2-<@|dw$>EK=x3f$YYhM0tE@emN>C^J*#+XFRYBCketfTY{gYb^O^v?OT z_Vs*T{K7c3*kr`KbV{m;<#)n;P3b=5LVo!|Px%X4>z8PnG$u{E*4*JwF;Ft|Z2c4m zIJYGVvy+1mh9}FkZYR*<5FJ{M7QAn0lW;g&EtI=k?Gl}8)7gl#C_y|KfeiZOWCSj_ ziXNoD^ZJ^9rt|&%{eI0n#;#@xG9Yz4zcQ@!S(n|Pxqdov<5wRl#TZTPQ3;iM^wNWg zW!9-%YhHMUIs@j-p+qAcnSE5mghmL7cQu( zF1-MqOE6mqURsjaYrSig&+xD=upsH73sNbZ{-eDyWWo&o)+X@8$Or?{47ic(HTUN+ zjR)vAx~_>$!?W*?FdE1@$-=^|UH2!7#omIrI6Pv7TzSOibqF1sKi#Y}S}UeA*bec= zva;;jvD|Q#CN$6*ZPjt1cE;TQA#h}-bfk}rbjV^mJPn>_|Jq^Kr0M$={DIfrUj4>v zTk^UDQvHp7Dx57yO6_v>yIg=XGzcFd0wHQr29~b^&;YO)SiXGuBk=lY)xdIq5ESaQ zyZbZY?vB{{HlL4Ur*czc1A&r+Lb&*BG_CWq%#!9j*`D6UIpH>Cprq%nS`(8fwbG2@ zth_7p7%**XVzTNfS<$_$6ngQ!HK#`P)3Gyp$|{dhQt5i~Q?Hn?(^f0AZo|lH@ zmSB1f9HxMxx(wJG>qfCpEnHRx(8AH7B#1WoyrEbw{6V#8Q(Z*SWZdL!fQy%2in|Tm zIgXE_vl>pr{sM?|ss0+Sz0 zU%V6&VV9DsyVn}^#xd}Z2ma&z_kU-GLrv20VDH}6^mLCecYPq)V{QT@lFl%PfW+_+ z6DSsz96QOfSckY5+`zOs6_QggZ+~_zEwQc+g?V96uWlWnj+HAn9ok&sHBNmc=suM7 zt<@@6QJr5#coOV#5&h`u$49=qT(d+E<9~ocf|)%q3%KL_9lymWVsLsMt=hu8XiJdR zd-~<8R_{EzeCOzTafRNRW)RbI`RcYRAglTjHmcx0CJh|Z@6`MY6juNj1MOFLUfr?^ zU;`oKDr^*lKAk+983ZmpmRslp2$3YSGJ&kR!z(-!6JEhIB&IeWw%mIxSwq)X7*q3} z-3fG2PY9$&tM!wu2~RD7Gy~1TlvjRfv(ae+M=?*aE{4<#u~suhA!mAJo-|C5W_GTB`Bm>3>G0P z`R;H+0#+=<9Q&~e8D>n@qNOqnxUdhufx{+vY8neN#3ieKNV|LKai$h(QpAAd!W-o>~YnA3j)6mOa=)=)Q+aua>+8 zL_pG#@d)uo2olJfv>@_8I3ciWEqcRKcWSv}yBgTy#!u-VCT?<>t-%4c&=* z92+-HlTKI!#U?@Zll*U=46?se z4QJ@Cpwh!@N9QJLRXYFO9Y6c?v(en4nl_b+&sVE_nkrX61V$AZpR|ks0vw3?(ehOg zABsE&VE>C{d99JLWK;x z4j`j06PT15EjgSY-ng%iqa_og{7zz37SrI>PjpX}d9#m2yzu10vs{QkP%b@$kpI?_EPdcg z2T+e!1erfX`N*?Gk*LR7+C-LLg~6&X9)YtVOztn#lyYM&%rO=CD^f*(>|CL!Rp^51 z2{4G0+B^XC)$---C7*s$vUBIvb31olLyR(Tu1h2;RCD>N8_NB|fne;7Lbw2f*Gp3d znwxI~WG8KNy+JQKaQDjALh@x&OtI3?kQ>D+EfUwmI*DgW_q2?wo9 zayLlGcAZvJiDmp%u?dD1&*;501FdxA-FIJ4*>Uq(M^7{6)#xZ#ZY&l^9_~mdIuRHc zs5>GZ?I#0h2~i6C0-U;lDzX$hzx*Kp2+kh(71G=AgZI(EPF3_BHyNT#ycYnAhOKPAM&`l0a@AYhqeEw z;6AwZQx9a2GEAoFf|pjV-2CYSxO3{$DesfKTuWue!v~zueyW}J2@1hBJ0#M1CT%lf+e4P^#$OMbLWokyf^?k zWJ|9|C6ro+g7>_7Z!j2}qS5g7ooTEPY!C)YN(3hwd25vSyp|e%3aj2X${vy##cQ+f z)U%B$ol$aA@%gCq2Dqyn#(1GeM;T>zPG}$w{0PyKlY(JYuF;^?H-R!7`g& zH-y{vSR4nxT_GS8MU*eDsC{1V4%6tDfX0H87_Jkbvii0f5Xe*+c(%LXm6jwzHlZaH zyTWNAgprWE!Xb0%#S4+jU^VF*+H`C(UXaz=dYJ)`(!_unLwKLq+j{vjK6jCUHY22K zM^MR@M?qb08WPk_*LDhqyy3)IPpQC2$`BaYw>R&?*W9jDO4pLg4*s+{e+5Y}G?ejt zDZ+1m`}2sG$^;qHYGguOI7a%T&>HnwM(f`k9p~?+T)8>CV>q_?+Dw{E*l+GXxBQJa z-g@IveXgTdQFWz#)x~qHm>q^Ws`_c>Q+1b$ssZ?bZV7;cOa^Zp#R!7~I|IpR1uUQh zHMAd(mR}6$Kl$q4c0z<4y?Su~2DC2r`qUF+kpk~ru2LCDjcsm>sn4az+16AcH#vn> zSQT@?+UaE`&fPuWjq%MX4O7zO4l=^I}b7PgSnhqkMI@MiotucKi>Le}Q&+qb}r{|_B-<`RfvIJQlv z@R+OM40n9$p}}A|>8}zUZ|3v6Qsn(wPkIj~V+v$8ZL%q#U?{c{fo(}gbDKkq;dbZX zRH9v?6o?))2%f`nI(5z}*JdCdj^TNb5KKZqiF>KG{VKZuJQ^5ybPywTepORh2~;5R z=Zh#22r8;(iCTBngttN|w>s+Wnpt0sV}d>HEvwD{2_dc=Un=;*QYm20tE;bH8tjJ6 z=GUL(zXI<4WrXVdq;f*ibwc+F80Q5J{!-Es9F_vROVqLWcImm^0&h=NcqiDT3Ktw+ zqQz5&a84E+gqN;B5iP(SaDzIc5HsvIOi$knd=pEGNjvAZ$E5B#>1UW3u02E2A(KNq zeJ3^tEE%__}h=afdk)boVW*p>plHjll$>d@88y^ z2d~`ukG&zMUF<6eEF8j^&3B}xOPr{_1x8qfKq@5S>Gk1 zs@70sHN8QjH#IZ%ZsdAWkfqM5NX?tO!fhlse#SIdj1zmJQ|JO#SL5RtAgk2Jx$4r! zSnKGmee_BS<=TPMEa{wR)Cfcsw$}I_*RgHbFs!$v#oh?t-4_qYB5b^`Aq;NH;Vq1Z z#W%RMeE=(cePKXv=_KQ15u!U_6u`~jt&?yum?Lj*XR{4fS)NZ9#rO3~l_#+=-QJvV znS;;80#0*B2mEd=!T<{H0tP|G943_!rQkvfd?6h-AMk=w!1+DwdpP!2&_H;Ji+kxH zbNy?pSFhgkX!(|lYcYd&`oog9E-sPBfXo3ryUavW6J1qq@*Us`JK3g0rLx~sdLY#( zHBJ*q8X{bS zs3tkhBxP}kPLC=mGX_(YiAI6Z)cxHb|G53TF{`PQP?nud$TkVA|7B%}%wh7XXG8o! zJkr0lG*oh8X0ZNN14!=v@I!}rZcI)nAl8G zX7e?%QGd9%-vw0_kX8K}C;`bDjhdf3j7@}V-3=dHh)2~{b`k1-B3G%!cns^PF!3Hq zkYSR_E^fh1I;+j+D-2-P32&m9t<3DnRazr=7e*d9z&-%1My`sNm?0309aE=&RzE>9 z2w7uFqosnC@>Dh=!XX3m!!^AbV~=^7I~}Sv-ZBo~`MrQU3q?Qo5AoC>=Rb$bJy#nCE!LYbwfBZVoij7{iQW#-Of zCsmc$e7jg3b%k3Z>tOr}fTLkiM!9iE4zPe@#f?XMq4|JIl3U$y*SZ#hqpHdYUR<8j zh(Q)JVd!mCUn*Qv>bDoCA138bK*_))6=xx2@~5q1w+< z?-`_H#I}=6eUQ!0?p{G!S5zLF$d2#cgv`)#>6Nl4gO^@;0(j$FxIriBdiILyZ=Y0m zmknOJe!V(BJO3l3u`a!6Ltgv@_7M_7&I1oiK5Fmv8&B>^};MR~1H+6axXd$5@ zgb@_!Mj{I+ue}U3%ptwC)#FUo@2NKx*MNVML8F-U+qm?xi3!Vmt?ZtF4JhREmsfUU z2MJ|m`2{P61RMVI#CPyhaAZ{U;{je`zp9@Yg{Ra3h5Rk1S?lj!`QbnA{A@>i>=8w> zjODxgXn?tT^;=si=_Z!Wneu4Wsx4RfYSW&%(lLtufK5g9Rk{3{Du51GKQQK0YB;}y zQVjfT1~$ecb969n3m379M6iWc<17Rw9fhsVG0}i2Y)A@|A*+B#hf{Wg`p&f**oFyx zure?~*Z4;D#(Q4nu3x3d>AtQ#4#8S+&6>Me{68a{gVa(|{ex{(ZF{kg;sb$L=auyok0^5a!FgTaDuaDQzzyY+;2bW3#Ez}SX zz|+@vfiW^NqJ=4YV3u?~z>s-Cbwi(q&rL4fL8-*Bd4qLMEv0>l$udlo@XPOyT(|&; z0bdo4rvAH;>1ZrJAh5taR88^xiaVA)F|+fn zqg&eB9}PU3@|rdzPT$)$zimjiNFh@6!9=2aoEo~4T~P7KryFSoS*qXcSBhm5YY%P| zcUMQ$J>Q*%hj-E4J{x?v{>t?g)z$e^`M`Am6H?vXopk+D3tXs!E3D^;fDgg5FMy>5 z03;OZY6*E2@P+H$YuA!CkfI?FTGR13?<|_)K8rqq9MXg`BjC&66;g-?yo-_vOjd(w zz0x|7+aDEvV?xIK#w6B{MhY_6vWl0tub~GDtW$B-1VThUCjP%{os!9<>|Vc!s8NSg zxfH&i=*L68#J@@F)Xmm+M{W*f$Q(oUR0>J0eKxT3wYT2*r!SV%E5-N8KL7CqR{h~( zBR$+DQUT8am4d4ZCItOeF2Ecm6f3N1WqWG_c{Z{W95hHD2p}lSK_;tLLB|24wbWz+ z&R2>Og@8fs`(Sl@uhFQ#K^F!C+~&jkN25k-r3N<1_}&jTJ#Dlwrg!f2Xw7JHqe>Ms z%pN`Uau+KgXFZNF1Pcr2GfWspBGs;mwGLbKfxK(O!SgRHf|xxyiI&{r-W>IFK!^bAaUI<8TVSy}%6n8Nm6uhQ z6RKM-!QpWsYyRAHB%!YK|Dw4Fi-lRCZ@N_e6XV(q!PqEB5N5RRSwY0xKj0@?92>9# z9^N_NBZe8uFiz}HhQP}d=arsh^`;q(7)em8$JjLC$=L5BV?N(CEHD<7IU*pzuEjPy z-#Qh7%3rKfhb-gXSYB_5d?t~JS?Op8?ySo-J8S;&eL8zb$GeQ4A?uJ-PuK9J^$OS3 zqhGAv`NnE#CM|<0PfboaZ*d5w_hX%Nc<{L&za4U_Tuu>JAjL3&mF-oYtrmm0K%3{~}B8}kY z;*fpVF(#B+^jvj);F|oy(kzQ!FOKv*jx>7rST_Vtvt*GAkMm5JRZtPbH_;ozo6k4f zG~1W;0UYqg$K(5)WVHDlJO*fyEcC%$gc6{!fGg?a0bneQFMwB`q@fRRhlID=Ud8Fx z4+|5*sS>SEhZk3#xR+JMX;i zhI6JBFl>xIhwuO|3TV$=PPFaPTo^Lx$Br#UvcNfrD~c;RR=4xf#fz&}EpOj)b<5g_ zPLuIouwdhSBDT~w1#^Z{aPPIf%Lt!g>hrp8E%U)ps={1Ko3Q9O z^KK__uZJQE4%}@)4Ii&mPi0r<1F$S+&tG&J2mmcDFTexR2jRtv69gCda!)TGrqu&@ zFq%SD?I<4tQz7Ok2oN)@UxfMebd)V*z`rlCbS9XRZ0oNg=V29N*fdFIz^3JC`Y(G& zx4-=It(Tu>7z-vh2&VEs`X)p6@ggq%F@%)g{`{vyKyg|HSfXVp!|K(`>NP-WX*4$5 z-^8a|cid%+cv6Dg-UCd!YKOO9kutF5=&DEUJ9kKHY`K;Rc`C(Zh@?0KHNbWN)_@T; zr;jSqP}{0%hOi89X1O*|p{Dd{CDTh~Fy49f1H0Y+oI~tn9`_Mms0fgOYE2$3A2>%> z*@P3qm`d?nB+W{z_0qoIS|V3A`sm^ztJO04!wsR$mO0@Na!0u=I=4PiFg<5qLvk1l zMnJ8qQ(al7>$7rA2in{Vr*54(wGb8t%eVR#7Wx*nZXN&za3Nvig&jpBa82bn>F!Q@CJnz1dGU__zs za1qH)xJo+QP+TK0Y%8{U>8!+{+##)a`PAp1?=lD;Moj)64Csvv>py(_@r&>P4}Sg& zslXwVS*6B#S%#S2&kuL?YczQl!L)jImca=8$N&+{oZI^Th|ZRGUVwS$5=?ZvX3N02 zE64dI(lKg3Ri##`x|9NXbS-95s(~x2auS^!%@@~ZE}knXZ9E`kMN`2yB`A$(sZ4#F zUBZ)~ZgUBW^TM`4oiF@6tl)*^imO&Z2{Ch{u}3zA2^_W3d0&=QDrOs{pQuuvIWN*7WM(K09ds7d^}!=L43AcN}45@&`-9V zXUc@(3TP#K6iitu7Sc1rojx);wxvVRbDBjkN&G^R5HB>TBm8>j#kT;0Kz+YoI|`GiJ9l2ay5(Nc=YIem2K+z(BI=*^_WLz14Yxg!3*^Lp zzsD2xV^fIHAWs?jjb{ckRip+~>S0-B0+-9mq=-q|dWrsijo%-hI*cVoUlX!Qt9+tT zemGGVesR@m7?C{JB`Q=!a|1L-2K3)Di;z#QB69#be0H7PC$fvkB0HL1Lgn{d40VG% zy4u54@!IO8Q+kde4`WH~1P=C8H@lip7Xf>t1{W1pC@6a! zS4YrCzNOJ=m#D*mBrY3kx}I3Y$E@C(NNH^% z#(MeGty`aezPWDQWEl)lWaR(+I2x3Jf|o zljgu`HPmxkUVCHp&bMAWn%Br0wxZtC468oCS2Y&40auHf$Y^)W127AMkb!ZNU_d8Wl!Q#oTWtWRalCEwvcrAf1V zXFhZoz+Z^ueeWqVa`!C_tDZhO8jxj48cvnQufmAh+3KPv*5<3 zV`bn*DwW9`GGx}F#xfYiwEE1c+S-F~nFXEtB>ef1*&r-(4FM+%en?aJY#Xc{P|8K>%SOpfo}LXaeHvGFl1k@ep-nvJ+rLlQu#3P=gq$Hc*Q>lxse} zb?erd?Pnt*)=jca0@={?FW^p{kAMF$lv=<4%kTg4hhJ>Kz9}zzQbt%Y9juYEBQ+XL zuTpBLIH2Uah{*yh?Z zM8f0k-p%8o1KQ@J+M*k&g*;K?L~3K>HcY%nIKPKU%G!OV#5BMCu{!3)`P5x8)&qr& zu%ko3oDfI$nyh-;5w)#(Siau2dja_Dcwjn~_1Pgr#)0ox$QcJ@(l-v2R6~PD)Sv7- zi~*B7e_Cj&tylSc)ZNPf(~N^ZKD=^fSkLMzlr&O=B69N3go)o*D#eUahZ=3FadLDD zsE7bQv?I`cqmCftG_-h>3WaEpfO!8msC>1R5z3uw(M~8>@(yRc!NjsTH2eon0b=~S zYSY;Vh&*08w(i8gy>)TR%sIpwM+5axVgZC4y?V7fE+V3AVxl&+Vq@mU&ZY4Uc<-&i zR6(y08xEfMx~{+|ww%O#Tt_uu-QsV5ai-k=`KikigF)eg;%pXsI`(8}Fuxv1C zT?7FxL=b%Rhra;cKr3~?_47ac;wOMs;E?U4YK&c@7kDcU%jE%Y?S7fVT2JN+g*$%i z0S*rNUGr}|a!Y;Iu(B5xxM=$Qe51*$7Ucp#qg1(U$<4z|69zLFR%0rk2pHt;Yd|Y+ znaOf?>AeTI>cT>iEw9oFiv;UMWN=C$Z`dVxiHF@60*MI!&;~DH1K`4QYT;p%kWW8J z&l(dd#iZc`y0oHjd~SG3NLfD?GiDw2p(OcGE$g&JNzavAW+=_-eT54RoIYqMmh~-z zi4Ek%`xY92sgOt-Bw>By68jw!#t$!M&SSZBOlGYp1PrqK*5k)&ewW?XpBH`R4EQg2 zu~-IIyLD^5$(YCG52t08+I3_Fny9XW@15}ef8o_oY9mA;&}<+ELAT3y-gy6gwz3W+G&cJAt1Z(ZDpbk)_XJ2q}SiYy4c zPJA_a`=MTDm{yLCW^H6j7cIyDYQPLxz(YU@0H~F2iJqTkFB|gdW8#+}n%BS;I;cSf+@odd(gnvW|2#=TR`n5G@?g ziJvlLHR*#&y2ihId|}_d!osIg%$mP(-NVVXLk>X(?H9lJ1BA!NzXt>YHzPQtrm5=u z>guGQnn?6|tNgQ6FWW2d?zdPo^iR`fZbU`>*xR8=l#acvPFSt3f?-^kBUfjpa{FE3 zLRwxaQ9TS<0{A7P@ zs95rYLC_zis%+5o{ z;_5a>TJ(XdJKuWaDC7@_kR5fOuHJd>;?=7=|Ge{R)(JvHL?Y9%HkG?_P1ag`^v}Q| zgGf8W`*W|ARID}VYb!dL8C)16OA*VJG{?aeW!C&-<%mL1mwBixBy{|72SUI(fq*|t zz+<+HUr0h892yOrHqiH72c{zer;eheCzGV?d@N}L`$6PMhgglKCj$A@ipT-xLOhC) zj4~^l;Ot%n5kLhmIN7V1z0+~0U0@BwVztGB8X~bub3~X|GwhJC^D}_I+ z_|ZeX26;1JK-ie&T58l%wP{>_m#7Nd99^^_F3*sv;bu<>SEX@j zTvTqQRWO8QFxg(^0e*kuJ|3_fWDagV(8U8pqHC~&e>_}d4jVAQ2P&1y^8p7ywcFcl zG6#K^N}WYv>$6G>k&-#9z+o~O9o{v#y{9xa{eSp5Gl{2&hSuus`$_eYRT9qOf zm`WPM4VXhtznNDm5}{Og71{*|>4WG*1EXQrEJLdc`E*DjFoOA;_hDfPoYkANo4$8sgaLj4=zr(dIjcOx(MWNoDwD0edUWR-7q3Em$gdvVviSi( z%b({rZ#r@D++2(>;`YN@8EMb{Pj{`kXO+PmAv!InF{D=Qq0$4>WmAbK60HJho&x-7 zRV+)fz-Y|&P8B3gh7i)SG!YRQbG*@sKnURhUMSlE#S;Vsj+aY#2$z6=0Xp*XMe4Zy z@YuoXB&=YqW73gCuqZ9Y=Hq@GAPN}HZ89Ttc+m1^U`-UQty+i=B3yTJnUQYp=(sx} z73if*QncEEF$H>ca&s(SqtkF}O?sPi796=M5r0@f`)abTZr#J86`0H<+wl9J{{vh& z1<~>U{3XrgkYyYM0yTm_VjpBqIRqP(CWCd_pj7v3`l~cfIQ8|)kBkt@wT|~03YQC& zt%Eo40|{Z+T5G?fdSH8ngT)*^#0#H!ZW;UOo(&cUv2aN@IAzXyJgO3kXQ z@WH)ETCGk5=>nhyut;B@1QyKt+F(Nznc8b-*oqpR1~-CKS0rN-Q*QPyty5s&FmpECk@- zkX8PEg@WT$`0k{3^~wzt{nI}mg%)I|{OZmvb(`KedTsOOnz3LBefz?d?ugspS{$|A z^PAV4uoxVn@g}eX*CC$fd&uiCtC+oUWnSj-4iCU^l#WaD(j3-<-yW2$D~f;s!H2zt za(V=uK9J>xuc2@hKnQ_=LkMXw!lGG0Ux$mJ5jZ9%Z%-C|TM!{FSc^Smu2?5NR{JDr zc<%AO-DZ5aD4+;9ub~OaD==pc@epaPhH14G>q zBW*mM53b<@%(Ae%ZFhK=8epP+NNUtGjYi9dxrUgq?PD`(av;Bpg^$Pg*^;}q@4M9p zWEBt4Mnjlx>%Io~IBXoqsstPFFVeUU&i06fc#fR;7E$kzvT$8V#Bc@Q& z(sl&qeAHxhGiJDkRkG5UVk>qcrVto=QNM=jBa?lw^HH}54`;eL$KJLzWqqn&fpFo5 zdz}y)KsIrQ3U*;@tro$f_5Jt%eMFlc`UJ1XLWvL<>xHl~r|WcWej8stVd?eTG@5>u zD!gmVxOwHFk}XGp|Jc%gZs)~<2Y+s-q~@~J+qa)u;PtX^-;S7a7`iL6c4ZkIfKvsg z3~7b{W&k=XY#w60!79|J(!1<iVyXl3Lr6-Y zcvh&!9Tg!Gma>3^>(|R8A|k-8JZ>`SVV(EklqpHD_MxDzd+L}W?%=@!?7h#!%w`zH zf@%s?vop*%f52zZkVROM1r9At_cKbc*jUWSG%+#nj02e2Vz$HJAPGnUilx|EQR;UQ zXGJO-Uw^Ig!_m!klM(A44#stx;BtoQqHM8YWW{?t_P{r%L%V%K+ zxY+(RJy`u=6I&+D0?Y%95?M#~X}0!I5~`e4aPlMkO{SB>S(SPj_~+JhP>K-d&;eg4 zz)=KuMK?+j!Wu;_UatxOkptWaI;X9urZ*i$aZm&c@49t+T)9l~w7@E(={xJe&rIFb z6-mij`5hhL<6MBgdH<@5L80)ldQEiT^Ha;h#(j+^rzXn_0ELt#Za)1bn<y`Qg}xP zPA0gLN_yV)LBJ!q@XLch@)`c%|5(H&~5UvB3*4FMaeV zsGdFI=?bt(n8_OW0qqj~OD0jeb5)lYgR({Rsr(b{i_1EuFAyv3MrPd*^Yb8 zg<`!v-c!@O-imEh${Qsoh6E-P;3&r)rZ zAC5Fgcsyv*Zx9uPQlMtT#R zU86-VB;Cw`P1qqV70M98nnklVN2hh8bQw&Tq4p3r+SjQ_R}EVel`}>?d-|gjYPEXw zo*7?uil>RxKP->PXBzSoH-29q888Yk zOQ+X?u@fsQQuRi)i(jl4=2d1Gp6NUtJ(cRxtsYs(!JmYN?6@j|g9arUN1ja7Wx^^<)7%f+SADo|GA08cwQaza*~C7EF4T z>#!4h1YIz;Yepsn-V6YR>}7aht1XORX&J4sQ{4#+2yCcoQfQA$O{SS-xD;F)YnqTv zn=I=oxjP4BX_kR@Qg`p{tg03>4h)#OAD&&g^3ZKyeI_G}N#z7WeiC6wkdeXM@RRDg zqL+$rrki)pHGgjA{DE7*84c<-xE zKcu?IRc5!3d+jM-t>X3b^VS!efX*V#RcY{IM3IO*>V?uP!%7RV!rRWMYmL) zkU}6x0FNk~WDRdA#)}dm=*nX1N9PXr_DXAbF>DM72t)23(|n97JmpSrlxSSyhF*Nx z_?zJDBl``@tlSF=<9&8JM-mSsS78k~7jhcn0f63&fAdX1APwVfyz%i<+t01qm_@%& zU*24J;ZF+};tNwurnG1lmLa350Xl)a;_WUhP41HCMq~OwfMlW&&7O2fc>oBUlKtDf z(-y14RKd~0HRS*c?$<8>fVj~B8x+cdweBd|>((*wF%8hQn{i=fW-Lx_fD5MJe%h*1 zi@dgzHr?IbT|@6uk3OZmcZfE>>HDi&u6-8FW9_G%r%O-XT3FcLTs+DPx2dbvR2-Zv zzwMQ+t*+P{y=Igp6zjcui)B7W9SCm2zVzD+G|I5t63eGpyhg#4QF&zVtWYelvO70g zstLF225}p5>3VrfNIwleydDbbw%`>cXpqCw0AAdHw18uY&R;}CT*TDmTEjzZ#kUzn z`fnc^j@6b`OY1t>b<+86>_d`uBXbOp1miNS;e{d!Wy)LeUJwKclmUTLSs{VI+)>As zXC2@U1K6e`P0*fq=Xig(upJ0Y%c@81Qm=~W$+B7v4wK=d+i>aBG4S^|Rz39+9I)7p z89TFqssgBh!L+!zI5<3M(u%FM?hiiY147k6_CP5oaEoefW#s+XA`4K6!U>zo`>R}$ z1sml90|T_LKb&)t%{uVMQ&s-t=4%EM9Bymepifmp1`(kN)EW`plwk~T)s2PJ=o^)W z42-S1@IicE8%%siV4+Fdf`rqbpoS4F@Dy?+D4^AtyS~1#t5M+u(IEi@5*B6;TaZX#Z52#@aEP#I7wD}8fC)ey4LtwxXV7}YUwHM^ z55mTGkKf|Oum*Pi^RM4pH6R}S;DfLaa&~88%Cz=5E-M_GeLI=AY@BM54zbx-7RB^* z!hu;-eUi4VemmpUS93V3#A$&+Y`rJ1@WIK}KrKKfKpA2NfQwn7OJAJwgZBgh#f5_X zc$x$c_2TWeT8^CqQ;tNJsy>()NUf;ou9%M6e0+?83ffY!W0Q2nCnYlyo4Zx$8sa$ zCd-Pl*WShsmSGW{2hWlwx7~{nM06SpO!J?ZJ|U4dO1IHtOZ`zOKWYa20ayN{Bavk$ zDx4@s2n-0(sRIN8>vb3maHCPUInc!cM0vEtjt-C6&9@4y7q<*J#QFog?CjaIb;s6r77!9U4O5fHj!oj!0WLTQ1_ES*k#>*Hs@J&uaF0%uImZo) z-W0I@?MDvviidBS_nHAfTvh!p%~zkE7+AGs`J=B2vZ@qXdllIgt)GAkzcZ}H>D0sF zZH0w!Y6$=cRfIOBMRzr-N)HQ30+D1c2I3;P&3MtV;if=3lp6M@HvwEOycxDHJjP}zTNk{#e4zbW3BM40q3?r*Sos`P!-LUa zp!>+a@PtO&aIMs|O(q?p@UNT?a1-v9a9Q zNoUyGy6@=&awewNc)Iko;M1(ncYOyCvgz2_2X$v7HW=2fsE!EfsFFc~a}pP(3Uh;YD$9`@L)dcyGx9lxh-K zvA(dtabExwwG1#wJaFcJ@(oKZm6-qsfBMtwAGmvJX5eD_h=SmKn~Jxa*SGu4KP`OF zzypBogC*_@ygoZw6^o_iW}UZS>%;F{vuToJgA{?7WE5i+b`-}_RR~PLgiM?Eh@5CJ zyVeW?zFHUn)*>GQXu%E3-SK!8s!hZh1GU|@qJ8FWh0du3=HFT6^t85`?+CKyGHW|K zJHNS?1w>Xb^5xH8e))5LhQX0_X1rf!$;uPV2)Vpvx0a3b{F=5ihiC=2ZxgJ{pA@WF z6U|ru0EAXTPuAndqx4!5Rw0@-U;Z7j62oNMdSfWXsUkR;jaAE*nY;(T739}Nl;eX< zLNll@p*>M8c#+oi&|00O#fe$v89Q2Mx>Hf&f8jxa<>>yNzRlSqGR&ygnC}ov0JSIU^$@Ik4=V zG4jq4sTfnr4aURjglM03gwfE}h8Lf-0nZLFx0r9LRu|wtGVDw#b{9-J#+X#2!`uKWlFT z)YQ4Jk52cN!XP7~!`ceS2`L;1e<3v2jR=A!a4^|MkW|^`Tgnomw*fSV|6PYTDY1W! zL?+etR)fYUNM(s30@ES36q-cS%8A(y8G}+ybOe-J>;`uI>>0fFzP~rYcAsn(< zqI?Tkd7t-rp5NE&^?CI$hBR39eCyFPW1QG>bosNjYx{3a^&%~~yMZ>3#pjL87k>6a zed$uKoKm-rF4(A`yg#Mm_CRb$C2P|MyIT@9zwn=p6jwiAJ96r7Ksl35~Li0#N zX+*>vVd{v@J-fXtmaIKS#)>z`ir+HUR)}|rCnCwnfM@F%tAxDv%}vdYrv{KoJ>gqcKFllIdTAB^4+{AB`*B^gHr3q9M{!GNkaBH&mC!KqsEh zMoqQ?hpamOw=e&OC}Yi{u)+Yr_G1^kLO$u(?MNfb<8h=@KB%9kPI?k?e!~0aMV44` zvmLn*Jz|haVscVbQgWh1<0DdqZr$F!8E!&klgnfBAee%Tu9;;iSL4Z7xWtN5XCse3 zROQmNwu<;w3K=;k%E)kLLR*M1IeDQtK7FntH&+%%23q$fJ0Af$Bw*BoY^3mUkDuEx z%BKg@PNtKCMmyQPkU47oKiz)Z(E&_hHL!926QIIsmFRR%XrKj6)#%Jfel#p?D2yN7 zqWs~H!Tss7z~cu4ko?`qk~O#T78GL+3U@?)YwJ-|8U5U&c) z`r!)0;P8j5RbXI)UaL1q+{Cj$Mamp2&@p}Oqx<_{HbL)H|KZ;5!3qA&^40RrOH)&a zBPQ)>MV3}8vUrS$`^Lxz4|2!E$Fi4qb4m_gTfV%FtpDQFra(a8sco5bvxybMh2>Rr zLrS%WE)^MsI(;5WyXwdZx`u^;I7Q*TIk`doCGD2q%RnznaL-#M6wwr8YP^g)Jv z->v(ILJk2y7HvoPZwMoZKi1sdb^BOk2Pu`&WRAv%Y`Uwabtupot%aHhL?Nl4y;+3V z&-Z+aG!~H6qzxL*y`-Q&$j?6-Hk`k@ zVeqpoj+*ci+TiG|A9HTk#U7JcrVkuEc&Z}%r;;{l!PW~M(+(*sHycK#aRxgI3O0~& z0oLGjda?IoZhM1~Wv0LDs--vYimh83hDfMCJvTJ#1R4u5nIP)G*x2>>@!9Vx?vlCY zxLDah?RRH4#IDS_O*h@8za0ylBI~=zgGuG;ywm#B*)F4ul`GF&tIU27Lfxq zoR3F?8Ak|#K1ka_tot-{H_(0ogJ6(kg?D`3r=nu1eW;*Z)wMqMrC?$@ zkwU93b#LS7X#XuNvfg^@OI%sM=Ju}?avOsKZ2Fo*wZA_`(rFvYYS7KNGhCQfrOARK z5VUl4;~&3i3Wm7I~(pn`gvng|DFY1i56)96T$}ghz}( zEz17($!>Zs=*xTPayz$Vj*g~21yN;y)JDV-r|^*^6RqsVOt^Fz$;lZR;L>$}JpZ&Y zIrF?ZMe6t<$z0xf>CVR3W4TB*puMrfC@zp2Mv*FW2HjQzPzZcCLS$?ClN$*)6i*Tg z1x0hir7lWjauYj}lK4TG1&Q_qyMs9gI{x!OSJz7{@#eu z-iX78MXkFvQnOK(!Y4~FO`fkI^gNL%VqZg3?1KT8N1QWVU;D2W-_}>s)0ay=Hy3#} z=WcG9oQ$TD(%NRrj3ldr*_`7kBb4k!kC_=T&m7(SyRO&M-Z6iC5*|p3W51E%>MC@d z-TpY&^VlMbmDX0oowY<(FyAuQc9DmgnOmiw&ybr`anFvd&_{!*PQ7~dL(o@TK#E^S zc=MAA&qo75Qlmo%S)>r?tJH_?0oq-FTlL;>odU!;5W$4mW%6Ee`m1X!L1gasoDP-> zIS95tW6AzY7$B>TZ<>fizh{Utenm*QBlB;^m;aQK-jdQiqV`Sts0Pwb3lgc&EK>04 zpK{-vA4GPk1_DZybogvarla{9|1>4n)TEc2Wm0m6LA*wYwwnb9 z{0ZU$%@@;a82i;VA_C5OhQkdAe~pZ!StYyo)o74SN2K6~K|2dPcnbuUM1l*}k)zl# zX~iE{0AtQJ357ThayVkkmL&`5YuL^u`xi1Fp{vo^h(6Xnd}P>D#FQj2;m8!m=W8#? zUnDZ=u7f#m-Nsp_?*gA+Sc}N!k<(zMToi~bA#jMHb=qUTvaRolc&;TYJ;ub7c%PoH zE@!3*0-aur3Owsg>4iDm$n&w;gz4w*YX|Cw>RDZz;bd4aIS3=UpER+iH7iz}KCOqu zI;aYSEHB^*gX5{zEpj~^E~C5zMo8Zn^&QQfkiqJTOgICh8h;suh$ zbTpIuW^QiIxqG4h=Gg4>W{2235!PUZJ|2B7U>10CHcvY$ex3G?D;IMScffHW-y?9u;&!K91F?rT9_kQ0 zCRgT4-)gRnHNVB$97%sUXa83Es)W3-Q*h!YNA#4-Mr$7GMRcjjLNMnbCu8z2T1x3b z>0llfS>s;3ZV5rzV&o=KOu8x#W0j{YO2_qidI-6`z4NShVV4oCso$ObO4* z*0Y6Z=_4hTIlAyKdR{Q-hNf5K(ye~>0@Q6G6VjMD3IpGqMElJjmTUohIFU1xG0r9O&gXN?v63YVRSgG6N)O%5g<#;>v)L+RSrBo?0#BV)SjuBdtVq)FcoKOM znReytSKVuOA4ZOZo!3xZE;iHkpON+!Jhcd7aOmk%q8m*Rl-#A^T+Fs~F|)gB2L_gY zpZjlhb+|O+`^UN8Z)WZ^vg`p(&&U7kQ-lwstgsnXDxZ!MqF`P_fl5IdMKBmktM&2L zs?35Sl9g6;cXvO!6w|AE505T+L0f*BB|rMn+^ixmJ{zuX;1m92=ct5-D5N&_K_ts= zF-v7)sxasAw&Xq@^c$Lt9V(MH8R--pmoyXY_=SIUJHD#)ls z+JI^VY{>{f2vA55+$TL+T|Fy&PX`Du5j(Q%MM=H1|?C^_QS-K$ch0)gc*j_ZP; z3Q$z92UNsdC# z9u#!LaCa=S+-?TdDMzB3eKk4RU^M{*{6Yz03J_Wd9)OvM(IuG@hzj}jR_kal?h0JM z^(hMxy-S={iD~un6NesK3S%<2WJWk2-4k$*jLFgj4pzD;V+&7S?_jYwa^9tpbg5%I z{TNDh-n#ouOGD|%IoFGSypfQwZG$anz@y}l#Ig-Fbie4IvhrMcoYKyQL4lyYZBS*5 zuR_{J%k~07pk0a}7%|-k3oh6Zb0AsuN!7)5=2Ov#60ah+5v|mXBc}o5N|3Ocbfu>!x!CO&o*P*w zi#H6BRXPw^J^Bz=_z{KpfkOPLA%H;m72<$O3>EC?pd`8n@B*t#r`K4dmH<=37YLXx zw9a%^w49K}+I^o>O&4y4_}ZGVsJb2d_}i^pkK+;7tG-BCTb|~y)FW67&Qj5nlQDPl zG>c=~;MvoC`stgc5R2mcicfo@VJe&r9#$$FJsb!|A#eahvXT9E#Kl=u1z9n2IhB=# z16foEArwz;;};C24Gz)*GmEJx)evq8TTcK!(Bjd#gA%vFX~={LpQ(EhP9z8%20hFK zl~_$CKe7f3hYfnG1gaQ=3t-C^cp@q&AHAeGy?W%Q^%ci{pR;n;-L~1ansa=4dB}(JG@oZTH;>3$4+_ekH&5V0QXd4Cx3;$O1tomxwy*wu&$2zOY-GTZ z?=kp!Jo)}nU(5P0Ye^YdUqj10s)hm>B|)Hv+;bJSJ2%@j$uF7Rz_jNcP zgijN|GebTJdEZaE0?h%VB~assR@)v3?MBzQ@{Hx(CySborpFhV8}ccymOzUnH8o?4 z2B}SfC3|Eo-Xf3Rl~wJY>W^AYG7IS0)iE5+rTq&ApdoZEAO?!KW!xS+ux8ix4l!+> zn3+(>;#Ni;I=gFNAojuS+=CS16cROabDEJti)MUW>2&IQynG{T$YY;5*dfS8+bteN z`UzC6KLEFj*4VBG6K5?QkIB1T;un&uqgyb9|a z5q<`4ssHfmzl?jeN_n2PMHZOYKJC&a-nEb$Rir1)uKf`AjD;e)+>ig|V@x4H8qi>a zO&oF_AqqiwK^)q!-dI zdae$}p1TcT(jkr?V>VCEmhm+Vxrkr2!9x!o3{SqIM3jxt7%PiNQtB}Wrc1M+eS{*Q zt_c9*Pfm6sa&QAk5I_v*U4vT(7y)|@?T3DZj?slt9&Z7LCEyOI(fx>i{O#BI!>q{L z$9}*0_s2S#kKKM?sXibh9i16VYE&~5D_2gStJ5G{vcN0L_6QEP@>-W4RL~vUW1G4< zSoOPkL3dE|?8%wsKfaUlRo{;ih)_WTB2tX}D#c)3-OG+RQoQ`gtC&fo?UY&{P)ARO z(=DfJmKUE;bXjJ)x(0IV>TuHFd&o6goeQS>YA@$Q9y%q=rhApRtkNO}8?mzF%keFP28$(XH%9vs) zWX;LuPOT_h(MxHcvB*Jzg;~m}VaU~!5915@`i$h{MhFWT43OA^`Ou+>SypSNL1!?z zb;tmiOcH|d8y4IW=T*ZJLdQkBJa7O0QQnfw9p{H1#?RZ^n%5lq-FLNJ*&Q8@m$!4; zSS*>0v){0mW%+35#Kf^_OL?nd!D_v<)lO%Ruz9K?^EZmP=A)dEwf9GHI9YvVTgp5C z^yhVbr9n3CB(WMK?A0ogW_2BSo-LCxQ-UH~%Zqe^Pme4Ub$a>iM{&k})xttz zZ2%)8bZ+cG_zVtw_QvMGv{7XVXq33=)@yU68||MzKd34i3}j6r^QQEM0OEzXUhvYT z*3}<g06l<8KV)S3sy)D0YXOI6z_0U@#fg2kuRGfBOkxD z3+(9tv}@EoKtAHFj#374xn)J)G;A>ZTwkP zI?*!7dKozr6XW{)cdToauOvVg1uP_!_Qc?x;&6~k==3W?8VdnTiyt}si;TWbPuN!Q zsr*X8pftTCQ{8ML|RjdJ-`&uL**w{t=jq+!F$b@U^@2Q zKfdaNs^hOb6-LLZRebV7)MsYqt8NBl?zACn_u8v3RNi{ezA7}2jq?>0t@qKXp(O@&!WW|;7xfHbxV z=JXoS3k=1D0a=Jd(7xn1NF;h4wj(-Z$xS>&B6}Mj3E7Y{bbHZ;^~ky9o^))CQ$5D4 zjNFyW>e!ejEuuSi)owUyl#+rHx4PVODm%ww77Wq{D#tvPeMX1W^cYYJ~M5 z_Cam!%a;{(xsgpTUp7@B6ZBxsn%Jh_EBKVx_tZ9=HqT$NLlph2s`QmAn%kothADD! zM=!pG^vPLZjzha1H|?@)t|cGmu-+2f&fbXtG7&f{-E@K8+F(9a)Nz5_l=qM#dW1bt z+OJE!s`sbv{pY_teX92c8BeKv7&(4XU1e;l+ce3Q9HdDLhdVij)`6;_ayWk+$9{Xl zmK;GtiL9)D(RYM2mfp`DZ~tMaQrZ$vcF4$~NgXB_9Ncs9U(E){&2^FA<^29RKHIWH z>KK|A$mSy7+IRdT&{eDUp=<5u%s?$YbGhjAQ#5P&{o(X}UT0^hzYk*~B(6d+buFRw z`t?1Z_Po(huS4<2)KsosOMt0_kp*rH0LX+OCeVubQruK1jVmv6QF67b1|tObO^Iv_ zb*s82y&U^^huF+4r+|FeP?QCbuR3hq|WTMwAG4j$b^W~blmt~qV+ z!yz9^2*DzNAZ=x^nxcIz2g?eo{0~XGaK1EJCn{r!zp-gpG)XdDZ2p*H_Oy2#Dl|jQ z$cu>%f2xulN`K%Fpp`>Fs5kni)M6&DaijtdlgtMS!AUlomS}At2W1`8M`tQ&RyU!g zysZaFmW=j{eRt>!ICbj&s{UL1cHgfj1CFj4+AN^E;_WR_yLV3oVSOTe*h1)_L}7@) zAHwTJNKJjCC0UNRn>(%|yM=L$R(20t1V0}hh8xy4pGFScSjI;VWAa>*o%WOv)S?SP zUsrDTAZ`)FZS0tJ+`xt^3`l3-(3MaZYAl4|a&9P;LgFHGi%vIw z{_XsRc{=Ioqb)z&No;AERk6}G?~43xV!DH6w=~bql!zu<7o5qDc0cdfYBa}}m$j=~ z|4 zZRN#3@1GjA>d-rS-QoZtEs;mh6q-F_7H|)BP%Re9M*OM27sDfJs(+LUE*y?nutK1~ zAQ4TTbG4d+h(ef9S@sx7z1)|zv9V3HFVWwFt9SQDMc@h!r0W<-OtIkQ?~eu0)*jQ- zqdj5_3>Df7kU;s{WAsDL=16agYb)a3Vn$ZvoVC{?Y)qSvdybZnT}RWFpKCX<$Jvkt zM~mE#OQrl*Q++o6$t0IrB|Emg>!dvIm(yOqzsL3&NjuU-bAwW{t%c$jUK7D-2A_rq z1j$Q41>mA5RG^~=8Kq^j;ZRqk8+GH89NIWZHIQjyX}(v<)!}tUp~c)nlSMfn^mkk0 z6p3hSR_Zw*;%Uo))w`qa?<=XQKi+@qR{v_2B|uMD6c^G*cJGV2)!*M6#POj?Ds+rz z-jO61LI-xxh(`!LK9l>6`t-PXsObgF14prSI*}HiTdRb*%xt$jz3NA`T25sZ4?$u3 zAlcCwZcRtOsPCDB9F&R!sxp__BvY_NqwgF)yQB7YtX ziX;d*5Pw>1@AuGk<7IR<1}(qthQPS*?;5Iatj@)6*_=O+j2^Zwgl0l4EG#S$N^sX=P@TS^JYZpsc~q6E zR+zB@5HSdm%7W2E2(JV~UNds1M0NB)VDrkR+{fT+Klv3G1HZ+|Z$5}E2#%f(Y-UYw zD7Q3g{7xZq>Jq>1uV`z>GanXRs@CUaB*{Fgi{ed(km-gjCK5htD$E-r;i-?xpI;r- z%L@jP2jNN3da~u6SInEo%mtd@{{E_!v5}9VpzuLt-I|FUR>#WC$LjZ?uh)CW0U$j} z(NQsJX};Kbt#BxR5?P4W23h=%>fL1*Rvm}q7T&7x>{|Kz2XSXNc2$svvd8`;{(KWz zTTfnARf)!X41Tn}@mLBV0+`#Kyp;~@yOo&h<3jybJp`b-iP_qtCLsm4REZBL` z^0Il=r5@(z1+Qw*&dBj9(PA;R*qP-i-TQVwJ9%(}bfcho)va5*qf*iwam#nF1;f^l z@PPn=_UB28@Ocqo_yC7Mc)zmjLut$y+|v{iTKF-2+Vdvo$eHcKJs+m(kmw*_AJcQ; zBsDF;y?S-8JBWUfpecrfhse=L+<5GBuF!F|SY>I|*V39_xhCbv$LBLW$f~e9^#t4C zghq5B6z@S`S7`7fjb(+&av;3WDh(2BKQ|-U`Ka;HmTJYrU(Oer2c;hK#-qH9)htrx zaZG$8hL(W!hyJuGYARyM=oZMOKiaY+;?};__N+U1I3*)N=awy7tP57*0-oWxu)y;h zc=FaxhDcr}$eEs)*=eyCHFt}sV9*+(5PwDnGC~G6Z^iOgDa~_p_Sy-g?h$kRih=*H zD^#^H5IQb1ayp$<0`VMp$2=CE_D&cd}x-tDhf7#DNpTUw-*k1rmi9 zV4nHzazROyl|m-Hw^xEh`OsMWk-W*t{9%pAw7WzxaQpVI*xbi|%Z&^OXi`850+#15 ztbU!ItMnqpuN;3CN2ksFgh-r#F8Xn;%O%qLr)nI>_pLg9{P?Ql_CpiXx9RmWjz1O7 zNvg#s001BWNkl*Es|RO~*r7fc{K8cd zdU*5%vb0{EzMUNE&da}Pci88ph39LO(ZDSfV(^-VF|mrK(>b(Cq($pO>*Fz6I}*)!HXEjjB?vc*52ph<-0X)JCVuBb}`yba;Keh)lu|y0FHQpq&z;S&~o^QLjr)-kY49?A(Glz zz!B#Vr|6&^n2Usrj;owJ%A75ik>%8QG%h`ca}kwGcE_tys)kr4t4>KD*9+d-ICq@B zkWHRq**_@W!PDs^Y$zN{P4z27qqp@EI8_kf(u0IjFult{7ifIX0wf)9sqN@#H`n-f zoOabf=Z8PT@K82JDpm+_p(gamz*Ifh1a&=ZU=3W0fG9*80*KekMo9jp$}XF4$gg2g zc@3VinjS5zDztQBDrH47BTd_xe9+}V6SYEfvQp-l5jXjuu=M26)rd&JDf~IVvorm~%*26-iDTJr;aVdpu>ZIl*|Gkqh|J8) zh$Vl01W*8xWLR>)-X15G(q>waXmTR{S+bDnJLE31T&slLm7sj0bkba?N-A|RkY1q}{D&iU^G4F* zX>KOtSR0;~f3bEgM#NNzJZ{~Z!YCO<+NFhNwfsZhlZ0h`aBA7IK0X3RH1%xx^5rAX z2xvxlvp(H2G=%F-kol%2eO`jA7eU1yauDD&Y`*TK23Yuvm^?9wBOY^ytM= za?^$BiHYfr^CgCb?(`Z{1iE^sG7*BDjY}G#_#rO4!Lce z7u|YTyIx^xs@^>wQ=>j$b`%w8VUefmVB^=jpD}5{HJ`>z7s;AqydpOD!~eCS{rr*Y zGGFS4ANS~ptcNZU8(Q;IL$i@!nm7KrT-*c`%Aj*~UP3gPcRk+h@WkgIAxjBE*0O{f zXA-{FoTptnUr2yxMGsvulMIFk3wFjU7&^X_>9CL!Mn^e+cT|`$5IDeo^n(eRn(B?< zQ6if;ve0>~o-5UU|CiDQ(`KW~s3Q}XjPt4CTaf{y3U zPh5UJ`zk;d$c5N{CTOmhfVe*22?aj$Y*xp!}B^`KZJF}D%BWH-b zx}fXIvTfTE+Kyhq6&3H^GMc`*-L73xfDVyMvQ` zTFBV2a;t(C$kO7Tw<13+6mD7a2pY~YK+u;phThCTuKw1DB5+N;|I$L}{YRO|Unoe+ zK?SW?u4&~R*1W1ZsG8WBed<(6N&Vb60h&I@3z{TBINB!|RIjfa_-|fI@t;K$ee$a_ zS(($UQn8FbLRsF`y}0fOX)0fhO(fDk_2v&wmzKo|?Dh9%yGKW-VjR-ueV`Y54`1rP z)jJgd6w-Ux%4S=6qcw%*`Ol;zYXdDPBfR5F41{|jqQ8N)&#+^m7g31a>~L7h_%RGG ztV$$k{7NVcJZ(ek%ZpjduLOEv>oE`TMju6NSzx%*89|sOfrKvZ9bVLcI<)8+1>ZHZ z3ZAuO4+)wnCHfD0xaeuudPVipwCX&cR}W`J>6Q8w?f;wY;aH&DT&2?qg+Pty`>(>7 zBtK>)E}{_#8t8yRkmn#o(WeOm*Jl^JTEQ@#ZlB~ailr`p%#-)uS@-Tc@5al|(|oQs z1dv}Zc$<+ZlL}PNVq(+?2XLNFKZeIGQQ5!m`T7jH(yn}ceTOKB`_Qx!{<0^_p1iki z&%5uRL2oJeqLPY(eNUeBeSPYL8f_EYH(QcrW?t_}MJ@ya)X0YDlvK!sQ#NEad{3!z zQWnQzs!BOFh6y?Ho24SXrZ3^W_tw4le!^D_%2k$RF2cEXfnqK_Mug z{*jtr+HE?Cn_AEll8D~bMF)c`c)h(ZhBjPub*|>Qaf$^WvVf-mBV(-dhKtMndS@e? zQKIuh`hhJp2*Cs(<>LiGrssOudYs9_6(9y=chm>EEb|=AM{{I{1|}RS!G)ktQm&^x zspDR*-`U7k`icc)97l3Q;2@2YuPqh=STcm{{4j|X4v>QSTpd?QNGMl+{8-x1k<&*= zj=`GOwrpF%jUDRB2Ccie@7+Cn_AKMrstaAZ9)b#$D}}RZ;k0u%$E6mD7}V&ZA4d#g zdk>DNgQFsDoH?^C;mMh=z#dbCmvO!?;Yq@oJvWfl>MK^5OHN$A+}5|O&v+RCqSyDl z(bg%8;wIFaAPT`{EqWk91QvK3Di((wNDvF7Q?44*_-Jph z)ixE?JDQ1kLWxffMLhAF!oY9`J#=sR(M|v(>(~fI5Of7`<>%_%h(g@faSf$arb23u z(0YUXO%`(Jv*kuwd<|g;QHauyvwlLf-cyy)zPzd(KHv31fhuoD{-BH=%VRJ8I6vEI zKtE8~!^K{N>qpNfQe4W@=r>P`zn(QL5YR@OF0pUVJMX{0?ujM~p@q7B<;sn>^W;Aa zrW^E1FGYyL$}04)4gbqy*x-aqQ|}@|cK_kVjXgIoIL=(zw(ZK9D{afZc0qZmmTlVx zF)XA#lW*)8!4@{t5PkcW)GHo-s+O!}u9r4Sow!DQJgdOOVGGfzJn>g&c?h z3#``+l94Rrbgk@KiO_*?lKpJ;+EvF}TKMG`OFB(XP)>+KB$_@byZP zF5428UKtsHkS&dmBvykT3WkMNo`LOG+Xn@*z&E%M^mqYu((~Ln=I5p?@l3VIk9CfSITUd^k0jjn@FdiFF;E z3a>}(0gDGx*g7RV6>P2!UeK18__@k5RI_*QRULsFsu|0fq@`s9G3+1*hI7M^BQ7Qw zry&~R1x1y7u0FqTj4n_=y!Z28l>Ts_j?MNf;pYhrY|J7(y39gy4N%7liX8^#6oI1Q%fFpbE; zx^REr+U3hzo)JDTJedZGgx7hY>*bn5hzr0~EDfOoy^5?GKpN`rYE0^0)*>KPKxbZV zWNj1r(xthPO)ycp4pB(>8wct(=RidkD-oZa;4UDgo|&y%v*!i%DS5u0)Ssm)`|MDB zdQB@<)l-}U$yI42vwX6v=ldN`ik4-J|~fU()3I}Q}01E~*Y9?1;|y=uP6 zW(GL>^^4DpHYJTDncc7GG)1}|Vo^w8abcjB@8{v__yXE&94pqdljt}y?VNBiLJZJ@ z$dv)mA!H+539as@=ZcH-M5bbzBeDK`CZX-gk=1wT7JbZ12n(VRB9!bP zf@uHuwW^?)mzFWBvZCec82)*VoUdp@lvk_~d9`j60X1k|WcGAywp&EJE}16?BFrFq zt0qou0_i~43MQ^ig}Ez$IFVky2vIdG#vPTXZRE?yy2$OA zbe00lzU!DS2(apHU|hL;0a-a`m&F@pGprnnyZ6yAX4NDWRA%<}?#Aa-_9KTr8i63P z{~9?cp4e$Dl(rdD+|dT7zddO(*gzUf;^WM7N6Uwb)v!rQok^PO>VKQeFxA3eL? zP76s2_>^k}9uV21)TM%v*RpE_BuzF{RnJ$(bt_%=p&!n{KnjD((WlUp;S8v-7Sbv~9bRB|jqNJU#CqnWZihFGx`< zHb@h7+Aw#xU$+;9-AHKenu*7=@_tMJVRfc$8)lIk$cO+&o+R{DLBBs^PHK)X9V#D^ z$ znTeIiiOiI=e(-G^Z3j0aEipg<7?OyYzGojj9t)&hl%J<7?ML4JqyEvB9e+gTJ#0=e zMlv!CZnu*s4^lVzDN^Z9jfT^?y5uuK?(Mpjaik{&3M1V_Fed+K_STB&$X&5Ze+v+J z-SmC#Crk0izF+!1!bKBW{of<&u@sqBeH@6xV9zi9v!O)0sgx>N4N5gBl<9^^x$b$q&K05W$ z2g}uZ;x$5mLJ*bc5rsf}N=LQar5zVU;aVv4*ERdF-KS)O=YT^Uz@+P70NlO8dFIeX zfrBneiq^T2;fIPL9YPO6r9lGZb@l4rWTy~u2~{nPPdc|k-fDZO7_9FxeSPE4@4xql zcdlso^fktUsJ(rKX2lVb8RMp8>0Ol2QfZG44h$8 zzn^dhtExRW&TKn_FoFasN4!1=b$;^i=Mv zHwKW6W~evOd9^kK;%J{!LU$91dCCPI9j5gPq%DLF+H1W~c7xBjL{tGs z(mdNpMSuVX0qeN;SC5{NY)yBp&kpG;#34sFt!_Ptup!$}P_J=2u_NEI zr1hY5`|Y~#%(O-G^t@i**w}u)y`6T{{1zaHmk@=x+v5xQ4dj@G^vFsmhWr~rkt4gd z<*tWzw3tN5^74MP?9Bdb)B4(p2W#qZJPK*7MTF!=f|6>&)rc>Vq5_T>$bC?UpaOC# z7ilc`a-^_oBkPvFHZh>PCIZvtDodFN?W%eukK^&ME^OV}C9|8;DX(&z>)+8%#Z(?; z4hkH{L%uV@Y9I`HQ(}6yqOEP7*>+`KoC34)@}-sW7sZZdra9m+OX-_xHerxtie$4U zzX9gJG&VY+G@7e~!cVmLl{)m=z(%_fy4!mBN2g9aKe*}J%bofVbt5T+);f-8At{Df zgzfdd*pw#tT&=}9U_gjl!oB*TPA|;J@Uyu9J1EFS=0%j1G(;B0S108^W&3+@3pslB zkgkH`SuvE**5y67f|3yNQa-VN^6i_$zo_MQrj}it@P~El-g{T9iIGX?lk#fL-5ZnH zhYO|ld5=aX+SB*$x^-u+baUtyzaGpfh64gcSX_mu1Rwk=60tkK2G`MsWY!fVw2)K( zde6;0%bp;BJmG7hn#HYW6ia1dRTaMm7Ag_W+=XhOU~_(>BFka9*Yg*yZ&FljE`vNE zH(XO@3nfH+qM9%PMDWv z@U#8cq=!=>jcc>N-E^$0t7~TBcU_yCzFp23nJcd^am^a@@ZxWLbhzG8MEkfcJHJ$_I+WOX`U(}(j>rd1+zS39x~l$T5ElZ^EZh2`q>L6Y9NZ{KcyODBVZ zF?a6PYs~uk&$n(`S-UGX?95*$(7&%3c=-~r@I6Fvn_dnyq0cvgp27ycsp$dISGl;6 z75@cw1tDMbvi-a1aw9X~^1~_8`g|lrE#KU4P3)BW{Yt+s_)sRh)9Kz!z~5Nc89_Vbqf(olg0}`WI>9 z)a1Q7uO0@k_6QL?5QQK>>Gap>%A~hl1YtnV3Z{|yg|G!0*w~x<4ZO);lI$LjtT3sH zEF;)ieS6-0_skWIi{_;IzFxNN%(f?4tv6*YrSVd!xZ&jFez~YUo>qz2oW8H#dGEbH z?`fIF>$h$l8R=er@Kt?)95hp~?wyTWN<5^r`Gcu_bF(Qmw$q66%d=?n?C@|N%pL`J zActU_@wq7^O2aaUS z#ud2MMqTPo%3_=*{GSSwq}k;c4-RFg*zNW&qQHeL$h%$7YKUhR8B1~H%KT7V+JQu^ z4lVU~bGIhG$YHEH@1lZ;n_(6t+eyh(JRt&w!QgCcY-B?b6flPyctfjQ41{PdSIkHg z+WL&&URFa?gb0^saWRGXxoG1j2tT`|h$dOx`jGsE@27n7pc^T$t9!5F3?$m>*a!;l zhl-Z!!qc$x8L*hcCupJ1JNbQY3WSFW77vFGhQd!C?c*)mQ@`4jlRz!febO>cu%EVKax8H^wS zMT>88N|t@-ynmQXpX8U5M{Utwuy|0*3%^eEjSh_1jpwyus{Fn-sIFD;?J>{-1_43-OKAASDZRgvHsBV4Iam_j$;!Z zPtj+WMh%eRkT(|&9r$VW)=gsOPl@KZznQN|Z*|ff5XA^QE=mL8lmRU;&B14)97X9PM zmrVoPo9dS44j>X~dWj&iy<(s?H}~H{Y_k+Av^uEff`7N?%%}=jDh=AA(PkZ_g8MZa z0s-m9?3`z*sTst)!_neWIGQVq1kL?XQByCDA8PXKG_G#7kOK2Jo$7&!001BWNkl^wfIUu&@#Gh1PTTD8B)Lq7ex!HZ)^mn}->I2%185 ze*|^na>bRtzP_$+OOWji??-INZsRwQbpSuYWu)itc=|N-TtUUQNFh+1&$8)-kNkSK zAD`8WSOS3}pS)Q}bKGnL&Pl@DVXn?;bwB-ig-*z@kGXvN8SVM)jMj%V$FFW%_s%-> zqEPb(({4Vb7_K8jX=!6)H#tLQjZS@I*}L!VS@zZHY9@ooUk0Y)rrJe+7W6Ce69a>4 z-C?H=!~v(th%l27^5SKPKN6mtxsoOm2#N%0^Iz{tfc*KgD>Zs;D2uSTNkE1lx4~)M z3`Pw9NW9{Ri*my`UpwApy~)#`rDJ22j^+{yxe#us=_M@bCbgP;jz$D^$uN4hrw9C@ zn+S6o1_|`bBj&jJpYQ<`;)eBulZ6>OGLj#T$tE<_ruvGrMJI-Ps_!7+!Rl;^v5x(A`=uP}hriD!xG@dQ(zB#1bI2+Hpa z#*ww+!J+35YZ$P07*uDLy)vDFZXY*8$L5tN3a-uFUBCHvv9~c@ESmJXzpKNl+l=fu zG9Pu{*S&0dP>18aFC&rKYRY|`LI-rzg|CX8%|}%#<7aBL0-+R%s%eq2>MvxQ#h)|K z_Ny^E6e^||*+{YRJ|m@6PB(KuDHB%V$@bC(WzN+Jxv<)U2DCY`!vx|cOvQq^`Lsm$(<9Y|`C2IP;`)1p1|3&>e!e)*2hI`> z%z|+OJW<~Hd0A!UaNZHxWpLl=+qNg+N&f0Wh0XnseUQmp#*r(;Rn=`{g=zM=Jdr5R zI7Zg%C1p?k{LcIDeDx%ePuH7xuItzTz?a7q+9`jJ7Kb<8Zas)C$!o1eF|bod;F0{; z2SKZ430DL~aQ%<}k+y9aRPXi`Q{G?0q|o+?hwUrJwOSwLIub7~R1_D_x6PMMLSyio zYn>WXT<88WTwZPzSEt*ewXprzAVP&@78LKg^>7Y@a=fR<8$Kj9Om09O%G6W<$JM>b zjmiHBA%^gtmVrLyFU()qpHDkd)N8k1{&thG_Pe+o2g@?el6lgObxa?FNDkdCK|VcM zUN0;1bahSdl#xXT4UZcC3ixVlgtMQK7H@>`ZBRl$9lINC9-VgahUQm%8-o`l)UGUw zFDTeR3&xPZC;U!lkcd&SK0iA1ID6&xHL-OenKV%Mt5qLZ%!<5(yh!Bt;5}fn2o7`Q zLKY-4gpj(wyB=(Bo@g#GHYegzZ=#zy#@f8~_*RvW8_U5-YMyUcO9Re$HkJns}3?bQPuSd4nZcah9YNsSn2l^9A$L6fMquA>N`w zN(;9%dc81b&)^n?nL`^sXx!VA8X}J5#!QhbKSuYTCiM-z71Ldh zZ-%}^zX`fk%EFbA{Fpx{s#NHnFj;!sdd2Qz`P2>}mF-J28Ag3l*9WfHpB(%p~O& zVc}wMA`^%H2TUOZ;vXejsM8yCN-Bw_2R~zkB0hvR$RUmMg2cQ+u~EU%_xRadoKq)Y zvb`Jo7zi-?b*E*Hlc#x%9ql%GO`(MnrZ4;R`|H;I&uvHKH)XRf-hQ6C=7@q8BxNN^ z8*CESm1Q^1JlUh>47Nnav>^wvXIX=sBb{p~95c6##UE*(Oe(B2YS6<0P&OLnz*mEpPXlnzcpqGSYed!{v7T*e}7YOYgCThjQd)HkeQMHs$n0|h{ z`o`Ps@_bnh4Ap*fqeu(mA9AbdgBs2T@_-0E*+ggnafl*(-ku(%4rT&{nIm-R$9qyk zx+*!t?~mcA#s*21=s&2eWS|f?%*tY;TM-kVl&*mzrrbZV1mX=<{N=l&F5MqFn8V7c zJ+$@Pi37%fSp3Z3w6Z0gEONeVcV=d$^ARE@BtwD{H`mXWVCukkHGDf^8%6p=PlT3> zy1`RF+)^N(?jVmgNK^DW@S2jE2GxOU*%g~QkPE?~D6kPY-1{0LU`=unh17*g6Sr5q zY=V=CbGKI@J5upFgZ_62X$njPj21-+RGTP8*XB2*r@Tr(Did!i=;mHcCJLCGc!$8K zlG$CIMtgb6+SRAl&(E0?TUDg&N}I7XW%Ua{!}4C31Zt6oNh(> zI=COXj$l?=TtmK#LOTT`Uh(X8K7k5rd0-H>4sFg@TcQ8btw&s9z%`4u!a;$oIBeuW z9pv9Et?{{kscac0`DnrQgp-keF8X|sT5)~2t?*vEJYL!@;az{SZCl$gTJ{`2b!Gm& zJ@4&#;t~}~&9tI8zAbI&2iGt0V^SHPt5$6Lr+5DF&Y2CXhwQBe+xZ)cJ$DeDusVaH zhv&=k%Nsh2Nuz@_Qc6ABYQ^oIA>IgIc(a2S!ma-IzGaw0aLpCK<4NC>ERh}*J77b| z##={CR?@s@KHe@<80jka_)Vn$-o3Hxy1bAnf}VY7WrvINhakY~Q!a+9lAW2s82-IN51uV2ZQ=e021ypa&Z-*-iYE_`-D&ME zPk8~|FsrXwny05HcFufs>QL?M1*U*hwHkyH-ldV2mS;pNE=>VvE^!;U1|FQI;Ks-C zh!*cB?4h`iGn}1`8M3QV%ITfi7behC(JGPX4HANv!rWOud-?J2rw{F_`;D|(8VYE= zE^P-${9DsY0LVb@=Ez#8Q;f_7LJ1*c>E8n+cVcG7SZ>*AQhIfIcaUnmR6;tYcLs9e zx+a|q@ltbIIg>WC=xRPC>K$A!#`Vx6NezTfW++IHUA|GK-gSIUow1;Y2a&+~kKdP$P> zgRdWg`4cz~vD2#b56LjJulOf2G(oKgxV597?tJCb3s)w231jtQUkNKyxIh~ek2Yw1%`_XIeG_6^#d=D{NJznuSgR(c z*e(Rv#unRH^ZEiJ8)OpT;?Md<0Y;u*>7%1p{2DkNt}|qX=+MCJF8%tx##2pv9B(=$ z17C)Jt@)=%_Z~eeY}$s2tmS`q?7Q0zP3j(BzCFI4W>i{c7du9h5{fGU{-+w)sOb&v zn4RTL&rWxKBbHljlsAZjY(+0zh(MI4euF}i+Dnow%KExO3$9Aw{?qsW;qU+cAO7L{ zTi7K@4pIeF9cl`!*NrMyNXa4Lu_4pGGiVJd7cx;*S8y(X9C!O=~vdX z0-tJsBo2#j?LYfFmw497Mly%!oDQqSjogVi<&Kk2cdG> z2W#8ARE4V$7eHjKZfOOe`EsoF+xP&V+A>%WFLgxya2gcXYB?o{FATo>*$4UxCdVrI zkP1=`S-7StZPITsHc+Vc-on5@knr|6`9^lZDDwQ7fxF#+8ag~(UY-m-6oV6boF9-@ z+Uju{<4M{rL4rfRqp~C<#KwWi$7fI;4gy(gk zOck4O@3?&ZdM?byTa`t{MHVZ&Vi8;ufWFGD`4nAKw7BSO$D0%tJ)KB%^UseSIJ)zJ z$*)~mjA_m7hUA~_68>jDzC zqxbQlfX&$$ZnDi5-;E4CLoC=zAZEVs%HF+u4_w%$q)Q-$|1fktmcJ|$=^(v8RS^_%?xz3&y!_}*0 zs)2%xd3es*g2gS#$|@L}N-1O?1&*VutE-Up@hvd!+tS*4t7~a#tSjYtaQ9mPY5ja* z!O$&k1DXM-(oB@_iU;5QKc)Hp#p%v!=lFQ>A?~8wBto^k*Uu3Z=;u{`Jz2SKvarbt z8=Im?J~zOmb%r_t-FgCP`Qtq4Fu{BvSQ)nBK5+4B8H5#S-RvjseX zLwCm;nqo~_odwFOxeJlSEZSw%)TSTU4Nlz^WfO{FvQtH;bVAwfVjjkzWSXXbRJil# z(cKR+{e;xUo#}hfckLB>6SZu&)&17yIR+u`*-D5c45y*5+Pi62+%D24-T>ehWs-09LHWD z1O}#ZwB8CfkC?oO)7j}eW3j;7~x2mjWBc2oNP;9G42@xCHP^!up%+(-%g)gi} zgEF(!7~{h5uiGG->Us3WA5tiW=mDS2P6&1@y6Y7Ss$1PDN0NOZ$%IBSI+gMim~yD4 z08*f$0xuf{?!T$%aSDAz0p-$n!|C90!pT zfEA{;k;YQ~;b~ac7?J?qndYAV2|RT=6cf-|sf0f?df>o;-F5yZswZF>8r=?#pvkEt zGy4@(g`=SfK@i-Ok2#E1`KV~;fxSO(R@k$J(&=`~V%l)ij6Puk$N5QnJHigL0pE*N zV-hknRDf0zc-2n~(W?e#{d48XZd5!J}k{r*Q#SumKrOH5{!bfs;B9cRU*p z2YHo#Al_tNhq2Q%x_jr*y`OGxz#B{WwvJbB56wLEY(vd~W3Uz}Z{|DGSc##_|EqkO zYcv{_iz6FNx8N<8oys+vdKgybB$4qgAI^6W6y^2)_{ZKKS5N>d%rG$RJM#YfKaYn2 zT(Uy|Mb&H(qg4XE|8!?=Ztk(ijp53O&a1;vp?{JD=7pXTz5e$f|Mf5E=zfQ{clCRN z;6QHq^2;x`yj}fHvbQi`gX)3Xp;SJPbtG%tObV2$K!Yf%tw3Ep2-owH2N;|a4skLV7+|a=T+IF7ct(3-Zsa{<;IiJk;jU@}S08bo*!=k%jxC%Z}`1D{`Az%yez^#bOuVG_U#4t?oX-+YWIzC0LubjPT*^Q)|F!*;YK>hpG)V z(0j1|+9aFebCanx_Q?Qr5$LofXUMQ33sMN&K2Z)+^EQpmj|ypD+H}m%JBOPIN*aRM zao}}Bhs&*Zwfe@}{m2*mqHIcF2@Q{a`qNjA{(QGN%S;XkGA1< zLol=2l>RB;x1GC(kbEy)oQgaNY`Zg#VSaFE4*lqrNb`56v2^{vyqub!-RO{}Em}5) zHh^E~?CkW7%elY2{@(yPcD!Tz6AykpZ-@W~RQqFaC0)op%b~~PGRmuM9J)*CAHqm4 z9M~&?Ve89D;gxq+TYI}Ej494P-e%<&2v1kJO~3esTRe4kq2gZQzNcTpfo^b#*w~iO z_!BIJRKxpYD5Oa$3d;tGaFwP61!x}y7l!I7Z5tmjMhD*QMa6>)ZG&1ZnZqJVqYSuL z1XtS%RtpAOU^;#5d1Vzi`M_$VbhV_kJcV^wg)IlWS_+q1S$m%HbYDvAmO_|SPw5)_ z{{hn4n$gnzs-ZOM$bp?0p~JRhofM4CYhqTeT+0ym1TvRETovo!YS?~k<@10O_!l-- z5CO;-m0YMnx_d{sa-wvrfXF#V(+wsr9P1CA6AEn*2+JXmLTnS@35VnRIwf39Q~x4gqLFKba#LfrmUe@?wPv>e@k7lMIaRW# z!4J*+amN4g6eZ_^V-Key%njk|M9_RLt*JOd3OTfpUcopfN#=tKKmttNVnaBJZr+{*@-BR5GMJ0_|}{I%ys z{xnK;i1Jbu6u<{`A{F2sl>iUOZa>Qn{Y$5gI0YNhVSwat`LXLSn$j=JgpK`=`zLcm1ohB%3;oY;7MgERyOY;88MMTkP&GIeP=Y!CNY-vpvxkLW} zwAItDr%(44CW{c4R#h-+)e7`gAwWgSme!|*t?ZJ*KZB5^rTX~bay;4wEE~WtxC?;a zug9iYY%=;SRyMO^!uDK(=LJ%VvjH0h@>5DxaE3?RB?MMs zFloT40>&@kj4gtb0ff)8)QH388)qgu#b+BREGGR`+>)%+NG|uXl_%)~e5ipU3o09p z26mLd;mEMfBy_nmElj9&4R)iM;P~>3d3{dOx6Gi}D^^ycOZ+lSmTwMin~UIzKDis6RG zz>9cOvSWxlZ9NRT___B9gVCzN&6Gih8ir35XY$#t+#X~W7-BR?I;18eq5+RM5ld02 zmNU%$`wnAeaCoDTi4|>{PMB;;=1|$u$bdrNSq(sdSb_SIgusn%hF}C3ku#3T7!>W} z6{p6EczWV=hvw7tojZ^2+?n1Zr=$qdG<5XnheqQ#wzd6Z1=%rVTZG$XW+k#* zxAVY(qkH=@aUJEW-DXU?$?L=D{D36jdBUOtPV?7zkmR^zCp$rz@8q+tgU@2bxgoE< zad9Ccz<2M|z^xfTu?E=D%1$5~{e-&mL!%w%vO_UUH-VC%4TdbcrHj*6HSS*JR&er1w;3zfX_33Wk+{K;QyuShld^_cl$Myix`S z`w(6tI`Su}z+5*;cq>qbRAUur-}ub`N`ixRD>uSKL*B7uTx-Wh#ryOBz(<~8UfbJh z^n~iofql2S4i0t!gIsuUtYu$UiwaOkazp~8kat*!gd`K4tP_n{*m7wlzUB}@bO4kD zg^W;(0uDLhFja~>`_Hk9<6w3cf0WqM?PyWGdS?DLHl5ze7OrmrstRV% zTVcf&OdkSA4qySxufX>Mi3D)WzNf0B6?t)GES=0)$^Zaa9gMfttVFLWCAR6qKn++j zMQF?X{P)NTPMOw484N=7-m=bB^^I_B5+Z;Hoz6fi%;w<=?}?F_${b8vGSvjkI2+}9ZnVLkPkjUsjA`}eXN&Fa;A_Juv!t4xLH*}A<7UWaA=0-lREKnq1)4b=;g+1 zx>xMyD8DUjd-LA8=G}At7>`T{bwlGaRNpxB5MW~{5;2zmaPW9$oiI$w8oxVyYzhh@ z5C1v)rpSR&j^V{cwgETySRP+m>SJe@c-aB(!SlzymFU=U3@^ZfOt69qzkK&sb91T?{niJzf zQw(n3RdMmMVqvvl0rrKkf!>X)3o5A=HW$d&A{Mr^q&$VwO$wJ%#xhz|tz(5_OMfD- zGFme-T2BHJ$>@r|y0YTv&IF=B6R_HkYb$~a`xXi~6n3dr%c1WHg}zIA!ZmF91~yn$ zGZkegL>*QboHbEeRH!ia`|%i1Q2{6ad~tRdRXaXvV!_c70N^NEPUs8<$0N60AsilI zo4I2~xSJc!?}ni|TPGU;(j*No>qx+X<-)&##iDs|A}rjxU6cTBdb~)E(I$_P?c%uN zmH=l!n7>jzHp^UH^W5&bM&pNsj}|6)G9j%f8u4c*D2}_+J=gs6ov-X{zLKTW*%AIL ze;k@=%JOR!d=Juprz!T5r#b}WoFwm9ZZ!l4!nz5o#_3GTD;6T`OU$_;uh`Y)PO`oey6w;r9~>u+D;I$Y>6q=j-nkZJ zw?O~6;>XE2ZfWQB4TZ%z?%e-+o77_Z#-V-)j*Zfj9TPB;V?A7cNbfEFnm}I6{ehoh zUF@_viwnBqXZCfCr3{|=zd+a=94iFGQ3wQ2>%KyuY0rP4Apig%07*naRJM%4Ko(Hy z8!d!3INWBVtRfcJ>ZQaaWRMDsWZ^Li-AF+nNyMW85{3^L^|~D@5H5GxSZjz* zT~(>}ygEOh1VgecYmANe7CsO9t^x`HP6Ps^W%cRPKOf@FfU5+P5w48y)eo+$aPAoc zaQrY=>ZQ>5+Uu{&d;BI7j}$rt0?Kt&p{{}fCrg0sd_ydjCX6#`Sw?I|V*93kgyLL^mgE6Wl9?d)N zyyJOJ9k#r@a?Nvq@DWy5C8>kIkppoimwPq&-SW3|eckVA)3ViT z8*AwrE8N1a3S6~>I$^oV#5)t!8x+ExjSjpQ?Ixl1V1&Se0Hk0ng zGI}o@e54S?rlAbiNFDJHYT8m-#3>h{=}s!FEnjzeY;-~u0(k{|2-`xHQrNoG`sV_? zOJgck5;+;F&wFc1qpm70oMOl|W(Vo1fBb4~zrnFkb&4X1?l9(aE1THn4J9}mNX#P5 zH0r`tl&fl)ShiSUAPYPyv2ryC|HEurA9S5wufpMeQ?3)oGi%KWj-zJ%>WPm~*HjJK zW;z#Uwk9jjVvEH_c1Rx#sdfg~$ZC>4;GGzl4oN4_J-~m!6~iG(r}HksoAJl^=U*9@ z4q^AX?z#hi1CIU93&Ty6KyC!5(d0j+^ZN3QwM3gUcIaB&h3&%pNtw&2IhVd0Tz2<$lULAlG zvL%U-=NZF|X(e0Oxp7Z{8)8cn{~S8lKP*U~Obu68aIaX({5%b$T#b!?)By*2(5#0x!MGbnlzyG#-vO$>J3INQ0{OOs7rUB=F`bY+Rm_vg zc*W9)Fi4m!5)&+Kf8_v7lJ_97XK?b%?#Jp3A`MDm<3 z5V#u838)|m5dMb9dhW-;Logiffz$!VIKv(>XwMOT(;eWubh5r|1=SPaHvn06Vf(eD z0E}$E0MuYUatiAy2A_nfcNH)5? zEM~$n`?alSDP&?OSd02dl(#r-Dw}VK4#JjjprwE(?ot(kd-j)b-P!xe)o0*c6=Iu6 zcG?0L0+;6oU?xdv%K7#8Qo0$)8$qES26<7K5TP9ISzw4wwe`LC&fNRm{<0|LEdY1p z^73-caH*iw5LXSJ={f>I!PfL9Q-E8Nxxgf5ZmE`9|J92H#ZnSEOG_Ci=Z|E(ajUmM zR3ie?9H#vEk4T34Jmu9v4neeK_5<#EqJcXf`TR6@CPf8>M8OJC>LAFi@+pqC)^YQx$pYoBk<9J(EErY7HQE!`Dbjl}lm5SPyuXb0cQ5VXz8G;N`QtP+aYp`JpTiuT2 zqdBnn8>Sney5e?#_dSRQW)NUqFiaN0u|2k!v6$8xWMR|r=xFn&M|U3BeqT!D#P~CP zeHSjw7@PD8dsB^^u@A0ef&c~IYF%ZPk2dboJi9wny!fPuD%Jdc7x(cE>%(V5k#QZbgl8@RrbCw9FpBS3B>=F!sLETwmGTrV9QwH z`(y07v-jU;ox-FI-~%uS5Lyy8`3%)X8PH_&pWI>~E`n$Q#rq_ZRi<+(`-}o$9c6DOD!FgJ?bV-RH5pv3P#s( z-(ta~etsavwfGwxG$TIVmNO}!NB{y?TuWdKQz1C*tIM**`2YD zXf}MZtlSD1H04xc3+T` zW#2sI!@`Q<4j2@JVJZ)dJb|PA1i%0R8p`7gNB|nx@YQn;k;LHNIN3%h3xeZF4Cd}x z8xKAyUFry1RL2b0s3B62*({?ard1 zMs4HbM0MVc8^uG}z}`V!#nXiuMy;n6hJRCZu#sN%(B<+WH5$xG8yR6;$m}$5A>Ax> zR4^pNAu-^{d3XDBC!U**9k6XB043G*ESH^j!cEr1vj~~C@CZf6^>64ac$N2G&U@#b zPMbx2>5Ysn?-#OA`0~rbmXwx#UHe)J-!Ft~W!buql$Lu>e-pF8X+N;?9q4E)1jxv* zm!3YISMAFX1C0fI2*3$IhY&DGkczGyK76>7UrL~yHy{1tz4q$PPKy#Qx(dXqqTRjA zgQ}K2sw1rB_*M(;i)-v(c|WPRmY!3`Yp)$SviZo#lV{KV;Hz1#NzE7xJ+a&!dB$!^ z96kHLzxW~sPHDh4(npYL;%X0pGTxF)TD=ha$cP(pL^(2RX>VUF0*;()W*10rU)S#?JjV=$#HQMqD&(mkSD*Qirs($DFfV; zjZxxK}xAIo%r=qN*c>d-wTfY(YetdnhAzJRa6`aW8p}N z9wi9_KPF1wee}TI?Uh-;cLe0uwr{VyCjF|Isxr#WwBTHm66h)o00q49gOlA3&N=wd z3OqOheFmVA7(DqfJqX@-5L<}LGKUiuZ`}!JuQwr@WB^zbNajiaIMP16Ez{HM!wR%Y zgP$7RzWqU8zFj6Z#)==z%{5-- z5B~A55xa5COo|;2lWo_om{Fc)1ZF^@fdSY6Zl+Eceb^(^t5#o~TnW}!@keI4vlb;{ zY$_fPGqhpGpY@TJq{I}}+e^A!9799Tno;TQiyk+0b6jzn6+ucn*!f9Jy<0zf0vixv96uKYTdd|Ib6b60<2~>EG*8lQZRicX>9pxVSj72uNgh`r&kLd6ppvcb^3thkmu~xg)=R zEH4zWL2$r9CmqQZGS7RexEr%rV3GWYjwlUXf4=`936qI6SAtpY=nOgOmi-xHkTBp1 z*|C)W3CZM3I6g#m@YR8Z0@W(GPiL(DwmOttd9Y(gNK!6QDvb@Q`IDPf#G5C(bPTLC zfet+wWUI0;syoZyAg@A$1uIO>a8HA7>#*FoQ59~g5nOE;TwOSmawNHj4Hlh@B@>2U z$FlxxT}f+e#;OXung_PywTl<$=UZB%s&3W39DonEA}nijF&~5t_81U4HWBg7cd=wZ(`tib>b%fxk!SJ)Xs=LB2G91P*}mQ6w-L0-_ZCeAx#Bq6+m$IVf1)^ z?29LOjkd~(81IW+Bnp>QctyCouJ4aO@;6Dtvf(GVOlWd`k$U^(NU_m~Dfmc3-OjxS zj_#eq)3hjgs>$fDq1E(hH}E#qKpH)P)4*ZJ3XEH^G!b)dD5)f8NR-INdoXG4bng27 zJG)G#`(X-hpL}GIX9IGx!pcJr0@+96ky5f1ps1WqyWQVcYC%4I@N?M7ex;~=TwCi$ zo*>+9Gd#*1%X{Z%wug_4BPBdtB*N3_Tr!djV?k0Nh;RCLyciB|+b=I4o}TRh_*k4> z1a{YQ=q?XPm&V(7E{9;EgEbvHs^0;>f2(8~dJVW;2yPyOtNE{;=S%zpna%&{~N8)ZhZNE%fT-27ES^kOF8&g3;ViM;4b~zs_Nn@_6P?C z1o8(=cZE8+%1pGdb$;`!M06l!4~MN)1n>w#ps?w}K}_6sm8>XL)GLJDd(e8Z_tHlH zw)=GVO3m>URdn#R`7IlxvBr{k82eXf)C3cC)C)Ok7m9g5$THop@sUB!9@iy@&gUQ; zCZ(yA)-k$L>9CZhE=4LB&ScunN*yU)k(+Qp9UZ{z8W)Rsq?$6Um=%iSR2fffgq_{h zHsHSzwnfA$Dbisp7$;&zgXUuYlaJ3oyW_{*VTULif`jlfj)oIFjCWJ+_ZRbmT0Iu7 zDW!Te&f3xD1H0?4xo;BpW6H?(x(juE@{h-bIWsaw$Z?3$_)fT~_zB=cD{DRwPiI~T znhS^%D439d1WCRJCW)4wV5*zjJ=Z*U#bS}szF=aUC+m}qKkGOQ^MHyHpP+=t)A{IxkYN%) zRv9+^J6|q3QJkB5c)9~%W5mMeoAR^!2&ykKbEq>ZtCEg95J<*x*$&)}S?hFaYAT#D zkvg4xY~%$(W~ZmqNa8qKz_l@*7g~GCrG;+SX=7*Sh%UaG@g)#d?-vgK)nFkE>vpy5 z12!aM9-PB2)x{Qcbu%WO3?=7P?_g(Ta*bK$eM@8W|CiX)9UtT{Z0um8q&JyPXFgDz zo|Lv#JsMQ+``z#23{lFTPUfDg1Orzq3szgADHmI}j6EL%_d;ML16hC0gDhpJgfi`| z%^62-WelVYblqxE6{r?cR#pZ7XO?fw7A8b|TP)QAL{Fd^*yDHJ`MnJeRDk2qOoSDw`HLU=S9D;)z z17hqB&{ew1b047w1HnOEROu9z!|e=sfF(GD$`No|-{omnP^d6W^ZIm|;Is~38@+HL zeSA$v!2Nlct5j-oBYdSaTNVy$h2!U%*8B>ZaM(lk^oF1A-1)<~nJk&W-QNDAnOE}d z_H*77h$c4DWQ@UJE-Zi|yIkCe60u z#_>Bh0?A-5&+Opw8WXfm77n^}W`|?bf5fHMjo-L_`9=prstbf9m#M7g9Gyew?1!axuxn=9e*RP5}y?8|Fnlc4W#rUEJQ^D zq3IA?>mJj@0u~_LO?(U2ttUf5DxZ80; zyKZ#y-MuaWhgN*hSCAF6KyWxMas@4;4SMmqf|uwft}fFnYNCP`CM=Se1bj7IM!O{* zV^O6H&O0&LEfzjF&i3Z?ojZ5_^g^W%d~UbYWW?dr7j7(o+$01!_AF!3_}rDr8f;DD zPXBc00oYOTRV_g-r`fYi(s5E)gL4Dy5L5(#ep7y_(eHFO;w ziIZg$Bqo91G6aVOyzeY}wiP4VJ~oC4mqAS!s${-QN$d`)j}%)ze(z&r5f81BWL+rv z;ep++?CdiZVYO-P?XX|3Xq;HqPEE@6wN2NAM(?%?v$?B?O-~c3)y%1j5d{cRd>>{zxVC7wkq+Yqyw0aKxc0GVTnY8z!AK#g#qE)&k2OR z#twchr6}3MRB$+qV1+%ZQtAXB&v7l#Bq*3D)C6{m@nw`Jl|wVGEcHTDo9r#0m9XkvGW6YYK>mQcv;cFVKzYbIFm zH<|wF&kr2f`Dw}IDeVcPGp6JQoH6c5wm-`k+}d>a*nNfX*J|~? zV*gB|UeEi6atqZWVyUV)Rde1 z&d|O6tF6$Yf7!b98n{i*Z%%o0{-RdA`Bm!V<~^#-_sAdYN89jnIIg;17Z#LIoJ=1| z#@}4}QYF@s1CE1x)X8LFm|?IAHkgHmtENNMnzb6krFR|bX#C6>%A135XNxS;+_aU_ zm8(}Jlrg_?op8oHuy}Syp3NE4C}Uhr0EnUaGYDP~_v4y!E z9m=oFf}U)eM8$1w%Q?LS0VK7s-bGMqSLwQ=U|FjbQ!cDPKINcYIgT9iuFuB;w@&1=^Gf(| zB*4h+>@_oSyp1Tp*GKC<1+wbs_B9bzg&;RyzS2D8{_0dkRlBmN@|?+zXkc|Cj5bxX zNegGwIiAn>vt4W)O9O-!q>FZ7p^+yVR%-zYf%!q)ZnU?@G>A!hGwpQ;;W|!fdn{&( zAi50<3=?2q6z(dOOF+poFvwV5$v1TM;%^W(m7roTak$!0E=ZgRM(v^jI`ne~@Ohtg>Q* zycpmTjOd-@JC(DOj~sDTOW9`&95q%iHJ&0ACaXp+Ub$x&OxgE&;byi}abrv25<9|r z3oKwC+b|s&M+(Czv9C4buWl_YsN$cjxHu)f8M-%0K0AHs#MG|^zr%iAl2e;wvIM46 zxf+dUmnX(948<+ZbDYFIDz1(u;;$R;*YJR!Bpohc6?Ynzlo+LzB*Ao-204l26oJLj zAnl--pm?Pxr@=ghVq!1a_5s7FNmr@vYKfO1330S)nHH$kw3!WQNv1oiJzw1S)*t~5 zqH#{1l5Ncnx?@t9B!6Y+?gzuLycfUQcj3azQoGXMNSY*o(2N3Y0fC_d!Q*cGmARdJ z_a6A^g`-&swbc0Wdv} zetz`mPcPJD>0E11@S}Zsu~+;z&PFcFx?ke<|bQe8$1oF4Avq?jpu6#=ADF#BcpU zd+)6lwCb$bTlGk`Zn2){F6M+u-l;o0#js2m{Cv+?tBOR)?r7JUuwI{xU;&V@Mubvt zg{v0bG=aVu|Lm=9*;QAVDy1=^M`;`RK)h0KNNM@rAaEfs@UbP?WjNN_weN&#X$i=x z`HM%6EQv|=!o7Ie%6$DN1t%+YoT&J-f~vCPzjpna`JL;8$d7ll1G^D|>rMk)*p?Af z#?lnScq!qiaxnCs?mZ5*T5x(@ltTq+qRoyQOYZfSd)(?@&4 z96A`O9S>^5g8MiOKfxLh55m@iXjpyq#1baFUZFyYK+0grLt_irG&WXn0q#gXY{jJn zp#`?}#C^ic1PLug1Q`MqWG=RU@%L_`#P9rAK6Cd+?$?*KYsm0}qdRvu@4Qg_UIU?4 zNb&b9&myvLgL9(##MQ$SMDw1ei*GBt-2M0E~xeA8db2Q9>4lp_$h2QeiE_UdSTGmT z`OtD(CUa3}c#8h)6V<}S*QogB&(R~F?0Ms@eFJZ)2*I8`%+}v(nXMw8ls{Zm^_iL` z4N@M>0~W6;n?gT#b+u-k2{O^>Ui_^C07*naR2fH&>M<>fX))l{g#ag*x6OW| zvpjYp=t_uQpQK%iDMt{^OpC~ER-~vt`oZyot7jHeM_@nUmtRj6g+#K4z7jtI1I(LO z=Ud`&THXD|%Eh0aTsdi2UFLBNWxc->{6<(Nc=S=Gd$HZgm4vv;fMnvGi4cM#utVIU zH0tA3Cxnc8z(sO&yi&jE_4Qzo6U8q198*5vAC~1tyuFDM+4GqJI?6CIMNN-LCo_P% zbiIRQ_PEr7m5)SK>j~815N62*Q?yQJSP@BkaE)X-WCM3^IXLyQ>?UJ7V)3CB-93E{ zH!>a^Mx>)hkM2EsAbqq6NgFYa6rIwAg^^cSoiP1D(WKshBRA78%r)0V zjEksZ-4|9TgpHNk0=8}acPmSQs)`6ml5T{igX0jGOE>*RT~Wu~+`lbnaWD%|l3YpB zvDg9WSs#Tz>2AIvNJ%4yheCDlt%))UoLC}x7*ifaz5i#7o$B+(L{8a z5-w+(tJb3#ttm9)8rY+XGmtk>7|0T`v0jXFZ3Q<#3t}=&zW(tr7FQ^ALWRYKz`PoN zrMtJRrA#%j4-S!o74=_kth)uWYW`Kii)L(In*SfS3I+KoIZBDC*BgkQSP?Z9vp0{{)os5vUhK})hk6keK9rzymSGDKU6n5bmS0h1YG5d0 zN{RfCos_b-Z&FGPx3?EXBI6(82rp>zAeR3AS!c(gJEtlu6^clSPey}h#1#aJaz(M} zFYi)B`hS_*spRvGM!u4r`m+cDGTV{*@J8T#@zD6~SI!46AMRukl6u1`9liF)y$~RC zb)z>eNq}sa5QvTrz$sFyLi(+d)^{nqtAhKm7UTmNz%Qp;i6BKrsXH z?twV)6UT@7F{i|88c<{6|54DghwvH{UXoXPs@ShF8Yk(L){J@*Qpi(M4P83ho6dR= z6eAuP`7tGe;Qnl0Pc5d)UtB~s0!_}Xj@}cc1;5+3M|ETsZhwYz9Bp$9F(o}WS%qkF@heP z%MAfT9`Jzk&L%n_QkupwFF{1@8h`}5+3V#@B6hb42N-$c+4ThB15pLTx;8EZ)2^TG za&|U*y#-n7MrD@hOEsAW+oyn1EMbT!dyl z_2FU5-3RG)7q+KAI5kp!xU&=H(5K6}4e9A~eSO&I=!0U*;TKV?S+?|q%_pX&0cSS- zO&8MH7?!P9*4D0@Bq7az`Tkk)!sasS-Cyv;??x&pGQKhpccDR7wp@8wVlxQ|G+LJR z{j}Pg$(~|Ue}~7W>Ew<~P7TbrcDWdOU_kYGILKxSHyYGYR7kuzsZ^ROb=@v)g?g*o zJq+YEoS89Ui*>jQ9LEa`sxcCh@3&7bVD^MpE5P>STS5#Z4dM?N9tVfuRkzHxd|0mGn?rEzx6)xv^gG z)qv^H0r};ZkITUg!96#+`@md!Ne<Nq=0DU-PfQfAq4FXF{5Euf6xk0C< zT|_WdQism$i%4;!Q1`m!N0GkKQSF1tbJVaVb9;01h20m-xE~YHVY-qRmfila!*-+p z*-*B^Y^W?T`w~7~ILw4ybjixfroY_Fe7nDoptQjG0!|LD^jMP7tcRB^<1k*;+`M=9 z=%<$QP^Z-jSCQY~9*Xp(Z|~FH^>ZPsu->Et82RaBjg}QCwR{SdznC}&RaWR%vs=x< zpm^QFo%VeEiw5GeA8^E9<#?k8R9i6+9~c-wQL&a>>n!i&7Emt5*{_`M8fpwH{M_7Q z)=n$e8Z&K8q%38`)l7G^<*Ay)FpOb>Kx4rdMyMqVe6)eXq26SI*u7puaB98O9nyH< zsJ~cdeRpr$V8*>y3op)RtY#F19puu*&GQ#mQ&OTS9DzP%1b+goGHgR#wT8`1ORV^Oaw!;a#+VX6N0nBB^EIAt zvfG=Cc)-fVe>A!iTtC0iCZ(b|ZaePWm?Yvv>=t(|9P~$oMfrYvJCsjcm<)uec?(Tc zcpaH;*0aa51jLU~$Uj7Pmea|ON@OFwh{xvCaFLCR{l5nI4FZKP2>isj9__>Ke|1Hh zeqiT;1L>7nGKC%Szx?vt%QHBx3r`}8L%h4&G=YbY0XTROGcV$kH6{{aZCEXEIJ!6e zWna-q@tw!pn$ptJnxvI|M8)#(?BWRU9}>~%ZWym>o;xsiEe)>Vwz7e&!&dIYL)*?T zvMZ9f$pF_ZjAmKk272&d>WxJmv10vJAZy2UqgtF&7&jg64B7t6BoqB@FEO>%T$vN0 zD(HB8p=@2zQ$n5S%+1SHnvAb!p8=Mu-dQ&I{6f%$y3iap) zhX6Cepe_#6YcQxQj!RD)7;&`w9!az*t!ziC_2U}Dz4Zc>s(bJVo8(Y?seP-elz~F} zy=Ygeq=&&69A+emNmmK(3aI36^E<1S@oRPj;Mx} zU%eeA-mKz73ULe7B<$kL7E*UJrNAkRTf#^8?J%%Cq+tYDCCS#1Zs9Gw0er; zcOrZ~9QEU#@^WhZcDu1?@3qk@MxX)_QTk6mg{6PeuS&_S>_9`dZwZN6Is$&GqJn~r z48U}WG=aq?C)*D0(crZJA2n;>6QMbYu^(2TVRJ*K6RzZ8>kOTU#{(P+!lun(VF`k_ zBN7R&&?d4!#NT`GW4oLubbIcP!cO*2ca9GGsVP3*4*r*EcX(8frrP$BCva#6W;)D1 znCbATNnJvxbD38*{U^9wL*>_Vfe!~~-D0Y#AjHFqBdMu3xDBiwpPQR&ZWgit;Ur9a7c89E;p^$_tu^6|~g{>I}A%z^g zmEd43K(t!6>OC0b+!Lx3>%~1)J#8rqm&)FVV??(-Iog>Un-qv2U2XYw+2(oG(rXt} zqAuOQnE0e(zTimNBZo_PsqBOOrDq+#akQ=bbOM(i_+L$DUMQa@C|S{BL6P`^BR z@73rYk=?RZrCJ!MGMX-ND9W`pW&spZ8|)TxNXPN@sw@D74h!OTa0CK1>8Saz2}d*% zpiJ6vzk*P^T#V2lB84;&rNyppH4}6xrgB6*GOr*_@{-X-VhpCwmI6v>*RJnlvo=Z=^0NkLoT_OqC_imqS-o5>gcIPB| z6;E=96Snl(G)5iUC`u5N(3icq%c4hfVr)`Slf@&voHf`d%Qkt$+-iW2-mP{30Kgoq zKX-bp)e?_Q0vDAa@P{$_D{nuuzvm|!@b;`?UE`JFkKO39(|%>{Xmj&{-BhH9!btP8 zqHLcqal2nr9XfPpC_ADniI^igU1Oh`PN->tL$T>U$<-ZscKw%^0Y2a?Ym1*G3?^7o z!mS;J0t>FK-X7r}PWBFtux4Wx7V^Rj$VTo1<`=;~VXGLqmNe<9MuJ$+`xb-b<(Bi? z#ONhUdG3y5qD5}o)1n)O#!Yw?q&8Yyz$APP+fLElgqkl zjU-Ls>Wwaxtrl+n!zV`y_ml#Ue5CD-f|CWRK|{BTT=|3I*Wydv#~+#7TsnuC(wbr8 zx3$O|F|S}kb$$Ip{qYs)Z_gI&5d)EBe-|Uf@~nG=kRXn`0YH?)dhGa=sLD)YQY9aE zrsbPC96^nAO0jIQS|zb|W78cosfL-uTB?3UO{qB!TC5FH*M!eGQJwHIIw*6xHo z01mYAS!8_1|2p1Osm)1_Q-Cv0G#*d;Iaq-1#dOQkVROXvMKMT$uXh=<<DI6k-E9iwl1~p*EO6^*q#P)Yua+NuI9DD%P5I z-DksU*TzL^!CKL6wJdUHmYaH`|L&=5o}+{pX-x2RB!^*W9?uuw^q=S|8M^$pm!U|S z9a%hY>A}2hmelEohexiBHbdkd!qGwinStO zW(5Mr9z9xOhr?ov%q0RKvBLGG_4UW&^^;YrLh6#+vNg_V331L=S4m|^5@3QJoSE0M4!_h}~$)TBmZH?(|Ba z`giUeU3UgNi08ep?56y28Oal|acQ{O3AhKY%?~tM!XPpk`R)0^ibPN4ii4_h!^Xf^ zRtZ5kCY46x213dw9yY>?V3Z_-gnCV*fl}nfF|!L0}1VvrrjI^`8wiXewOujlR9_FpgO=1N2rXi!`r&pCVY>?gnDIVx-Y zBZuLzhLKunl}PJ~4#eZ}v`}@mGoVyj5#!{_nT%GI3s6Y>WL(H$urQo(!Z1P?dFc`< zemfQeiu(SEs;U)cp>5!Ej%%GCkc8miD1VegN6&u$2fz5=zxcP;BYI_X2vJ5MU6l7~1I}1V$2bJpF5Rs#N&RT!Yp^8qBoLePCn)B^h z<54TROp!GwuvrpO6gi~CKF9*snM~!WEG$&3HCJdoW+JI<%&EUxTQhc2N!tb--{D^T z{eDL{+qv`oxqrWJw#{*Z!3J#bdCv1ZzxREgcW7yy%2M2@%q`GnO!?l9fsrcyO}Q6}e=H`SPAVtjS?d>A-Jn_l#=eWveQcDy&CRsciD9 zVJYYZc;MUG=3&PvI3wPYl%z^qVILScYY=)i$&ZOv~?gHKC1D5c4B;q>j>_leJt@Qg*XYafsq`z~%1 zda6p78<=+eK%v^++MDm6zIA&RudoPRghg^iHB8EJ>BvL>8ZYGb+#7Q_SWE{HnKy8@ zXsI-`vf-CZU!5K6sAmAX_&+C%+J=OG`5&NT$YgT1N#P(_wbS5aB>w)@)&8!oKWtch z`Q_|Nhm-Z>G%a-}u>E6Ooja%SP4?i505#r@yvIbHg(--Za!WZeDxk z=G$+d$S#++WfGso;>(0Yu1K8SymsN_FMs*k*Y3LH5&6Vh?Dt3ZpJAV-Rq+uOc!pY9 z)I0!41aWoSB0VC$M|_vo7CY_s)C=LP&1S_^-#_~%mKb!KHp^3*v<${m<>7P$GjAds z))BLrB-x3EARMLeheXM+n6#TC+}dE7uGlHsjhar4QFcWb36%`UWTU&uMfC+1sT1*af&Tt~f5)%{gs^8XGCpyoJ(Zo>w_Xjor8<4;g(@v*UNu6 zTDZ5RSKU54J3WbsgfP;*i)vyJJf#$Iw&}}{KKkXY=2l;?zm_`cTeAJ9pS#wNuCIlG z5thL)QHlB*)9CuM$A9x!T(P!x=iq0%$5mK&a0VE}_5 zE=-ZaTyA&IFiiu1WV4T{I7LCs9-aA}i=t9JCLRT@(Raw9 zlV(Fk65_$_R1H_xT()I4UZEnGN)gu5I%_y?9S-8%sYr_AT%=2{P!yzX-Vi~g%_;3v zTIR3KDupsWHJr-;;E2UwK7(H(q!GqE#7r`Vh8xrgB3NdZ+|ghVPLcx`LNqC;L_)4?@J7=e z27nN_cNVY?0U#3#L8O)tyJBEAEt{X!QHq}2g=2gE>YFd_J8-daOtBe5?=KW*+X>k~ z)zliRn?7Z+z{e_1c9KWJBcd3yFsx04ErmU7j5 zEqi;9ADJD%zoSaMd-LY*FaP-DkN;_FrTxYLrq2i*66!qjyZtIN$8pr9AXG6Di+alw z?1{e$D5M}>|Hbbfed)EOrs2`y;lZBQetqz@@3=6m$L$uC+`A*}iOAY8vR;UgPPkIW zVljC;RS|g)Z{h?0bnWCz4tazsYwet?Y%9ns07>z`BQ~ND$CB8mTh+tF+c(?GMI0){~uQd{QhnNUnH9WlRJ-CKhL zcmcO()ZPNrVL>%T1=++VdKyW^cMPse;Y8HQ4HChIsUi?H@>E#6%u%cxpdyy31$+wQ z;zHQF(2|((=lAXfJjoM4TA{p579!m6(3prK&~$XeLRc!A5dtA#th6N*Vi?a>EQm~M z>aLwEO{Zr*Q*xu33m+cXclhv&FIK%GtlG9hoFruJ3zJ-1tankJo4!3etEFjR!{e8A z1#uO8<=}hz(7*Oeexv@4xqf)pm+DLoN;L!QdI_>f4H!eE2b}Q$AAnpK)4XA90GMKO zWN`nwT-fc|$*lIzy-}a{*AUYD^3EoNms^hOsVvurP)WTGx!-ypL0qcH`kgyp{pwe5 z4u1A107#ovm=$gC<@5QLK>FOXcc}!2WzB<|43o>}1HAgA>7eVYkH7j!1oi4Okywb$M{A*Svu&6YJvHhlChMXe8N<&kOwY~1H1CYghc$fLqgD6kEE ztV(;yN^wmYzlnipsbID^Tu#HJaV=7@XU*&J@g>G6mz@7c3!^8P_2HN$Iw!us&oo~yz8 z+?p<1rQc;(9DS}sUJrbA4t8uY894B$(Lw^ic1-ajRrK@fQ7DE~el#+qn z??VtHz?PK$P*)8>&#@xm8Rvc4P9?&w!NH>{yO0MDzQw8Z>#twA^4HBUs2AMmzTSNA zV&0dl%heB^0z#fnBD3{?I;5mI_2!u~cTOC=`R1LQCpLfl<7*d;R5q-7_ZNe3@nGIZ zbpGP|@h~~!noYa?d0$J*BAVa2M(mC}{_5jjRYXS4{_>@Rjc(CP2ZQPK2d};M+Ou~K zQAauFq@B<}_#5_Rt)jE_!F6}SdC67n&D zV}-2Qn{ilG1+&7QtZ2NZOs_8=6Y0WcdCHbzjj&$<6BH|m}zP_^20q(kE- zwnE+k7fazHo~Z{+BUpJ9#&iLt1`8RrR9rY7uy*1409hJ`Xj3nQZZ)s_@ z1Wq!qRlfE3tG@vha_83oAWQDoUOMO<{ou6^zIJwfjXL_BDVtR+HfKjKn3#};l&6My zzgk#M)u)oP_{4+~&6zBwZC0*Trn1;nuR1ipT?0tChv!W)QJF4QvUc$qYh;)(;CQhd zwgJ@MR8ib|$~x@kJ=gRsKp_ACAOJ~3K~&uC5bqtJ)>TRZY7lhFI^rU)XBeGL>zZil zqvP!vb!^LYs-udf;`&jIQSapY`+H+3pLQUH_(EHB#yf>5LvVLitToUYt2y$(jw6T7 z9YRVQS}WTLv1~l5q{5Ta*Y2Hok5etV4cFZ;D7`liKIqytRPF1PNjdV9vKtW2HDMyw zl7Ue~!ckZt^B~)>hPTikUbT==049k)55q@<^W+fP8i>u<3*~9_q=#s9j}}}+%y9mH zfBx{{Zyulo&^#m3=t%&MFy7{5hE}~|s@A{o1Y8dN1QjpM z_4a~Cepho|!VL8fm6X<3zW(^lFlKfJn)kNA?WLkDSvV&>^9rDkn@8Wg39laaZu2XT z9eVT4H`mujQJ5btbHD#t8(UDa5ot|xZM0ZKk;GPGVP$DV_kc=s3%E-30a+N9^7JJozL)vJqd@!8t zK1b~KG8zFO*;Eruk`)ui61cI5d=p(4pA}2ae<^a^8t~vGEwkDXg!}Dstx5DKm5V;^AY55ASM2XRWEiLfh#Dopo|yTAk0`yRFBOB974Ufy;3+ZcgcR zs)q-M-Zb*F$#VgPfL0XQfHJ>_H=f8FZpszeEw z-f{`Jm<_H>pq6>?t8={;$+R>%h4xvq*7cifH^Y?mJ(Ew^laP}*$J)H6-A@B}99=&u z0A#;+xA}j0YyFTaWuwfy`4!nvfAE*T`~J3e(i(X>s?PWJwg6uoQ~y}@77i%nank(m zowt^ZPd6>8{=OtJzd^yV{Taqg zrEHzSjMttWF)z#D`c8C;Q*nhhHKPl2=I)XB(YQ{Liu9#{{S^UJMZ|+7ix+@Tm|r41 zF^h=q)WD#0fiPg~twk{7z-55DUGl(N3(IEU%?!E4vW0r1pHzoEd{86`hAeP^d@;6V z5eg$Pxf&R>t!o1P@EJ)hNEZ$?Np=F&Lpz@gJau+xsg}|s6xt=V*mZzKiP}J`K&09%H7*(M=DOFK8eiK!eTwndmL$Lx;F%TE*%$U7{pJpV zeDzGz($9YWZ;w(~H)f6RHZem$#DBTxZaiX5V5yWL1lM}D9N+RidJ<5`4_^KH8C&Gt z{mNH<(DO5um9yRX{@J6c6!)#Ke`{GDDJ;7gIO!+T$XT)cZbuqs$nhGQCCgz2HW>2f z{RW&}7$j|&>VJ#8JN$`OtGzUtEf{h`jI0C!lFAl-Wz-l%A^?zcNTJa5eVaM5+_bqF zG!Y#-mCKlx$sF2p5ov%=YztFNb{yf=Xa}bFz`Sw7cQyybx=s@a4cT?KDmrzBQukOD6W8C*GlLSYt)J<_U%`U>tc z3j}KQKv*oQAqF^d3rq=yzYY(hc=YqVPazrlfIYyU3rq@>R45E$Q2YEACx;=oOT>i> zqK*M;PyWKOV}JGH;TQK!dYx7!x)nNdc_WxnO$=GRI!YVf~5FdXitX75?ce+Ds1F~xEM7lKO&jE03)NRboz46ACD_sbd z6*k@ilt8UT?QdT|I>F=g?qno7Cj(F4@=Mn&f!^jTbNw}dzwt@ml3qfA{;J zAI-+AM~BaZQ{0@;UFrKxLgz8=?V2jw=~ zp{I|kMqst$Jw;Y=#FsbmB_mBAO=Wcr;MwgfIdFOcDd6OK^itY&++;*l8ZEeMR)pE^qRz}-cLMzc z83QQ&x13z&X8wp z@+$|99X@bbB&&8KV@HU(dkd2`-E`~X>XGTIHxSZ=Uo0XB8IOy@aWTniM;`j4zSfHO zZ(OYh@Tl97Rj>}YG9+W1ZFGT4C|u)b##!CDp}AGyzE|s;->B`2_Dy3p;6S>q7$6I) zg5CD&faSew!`8_A!19;c=Pg}x(5~m3o4aZebg<`!KSr$j~%!@DMcsfK#{8WaqEhnEpDqY+oAnu zsK_v`MV1R$dwLNn@Nv3$G+fX%@VS=bbsc~~SO5^>$B%Bc9zX7rfKS_A)QuY$3#!G; z)vJsjE&&Xvh5XS_8@GSEXv8TOS=f}Njij!y(C%IGx>0qgeJssbT7?@j1GoYKO~_@q|n~oQB=WErdM61Kk9tTw)fuBDQAafvXSXdut0gV366) zXDdmiA~jP~D5|5fwl>Bj3+){6TJkM$&|G*gi-c#|^~tQlTu62-P@^HwPlbG*4`-&Z zsM>pR*K^P9`Sd<9hAFQO*cCQi@z#dG95{(+NdOHptN_$eh|B5qhyM64q{G)dw^3I! z=FoLWc$rs&S2-%HeQ*DA1-cI^$>z zbhb{$5#Ke+pJOsFC0`RX}%eXti?w%mXo2^Tw;t$z3^rvoVDAsBl1YZUQk572k`OO zQ@_&6!$yq;uJn^RS(bb^rN~Bs5Rn;J7AaS=*aYuGEhV4}mT}Cs_RnV{=D`Y$ET*0mjuqzXt!sWEs&Pi7q`Fu_6@kmm!n2n48ngu~ptzZS~&fE`d_#U-E) z9?dX}iEw|S(GWXZoOlZ~-@uT>AX~sfyFeX63L>0|1Fm7zuvqG^GzUg0LN)Q~ERN*OKpMv)LxNqAHEENN3!Jl{0~izhuOV=Wr~mdUg=w)&Oa2R~7cVykEkXmg(XI znbM7V4DtkfNiV$w0HP!qSSU!}YLi(kgt2?1D)t6q*B%K7Wp0=^2(Lg+(r#6W!>rt< zqdQ83XN!=U1iuY^1H98M5F8n`&}xf5SYx(xBD+<4uv) z3FlG%fG{ArQ(6}ebK&1WcmsO#e2qFFP@Emo4tEf-H5w?ZS!@V)IJ}Ut0&qYcmgvFd zLF;6mEp&!+d1V)v)2IL3+lZ%nV%|@G`uwp2`;N^LQxtu=Ep$GZ~c?A zdK%G!A5}6QPDbL9h+Ki8+-27YUILNXaEp-KP+_g z_V%jP!i1E+j+xT8I~hr?ZlfRg_PUKa*u1s6+TRawF*n!MRpSuw^8*UW`C$Xsh1b6G z_S?_C{leQX46{hnK}oRjt-BEz41{Uj!k*jw?c|Ly+D1zic5VBU_ZENKV)4a1?%=^n zM6P)3qaQu|@b4dc#Gk{L? ztQ-Ku*6Ef=@{9v7PE@dLWNDa6L;z`QlM4G_NUi2gN}8UKE5e#!n~tk&^X(;~%w;JOpo45$j*DGho*>{xC?WPu4ZapM1mm?7Vcf8UgqH#{ zvp`AhnoQ4d<1*QcyFPs9*mIN4(12WDD8%EybljL8^3~tFx{yS0yoki(^0=8)q$2U8 z%k|Ko))kSizTTW;m~_X29d@mk4PItwXi#7dSm_Xc?l$;*y@C7=6~F_oT*%EZ@JvfU z$HwX^V4*sIihkfdfZ6Wq>gosJ@Ij!=`Gm1tzu%YZ54`{E&w9>|R4&DJlgam*f~CeE z+Pbrp4NFiH43JcNbJV%}r=^tm`qg`Fx{K9xOQ1Ku6_UvgYRE|8m4E#AKY9Gy4?q00 zRu%u%@6WvO_^Xe9^!11T5|6B@6xh)q07$9K%12UJ+pr7>aOW6aG^zlD5bA!*JOoIm zZ8EYsQ!x&npo^E1g-H#c30O=Tsn#Jk>olQI@SJN|kDtSJRlO)=L7kXcVIJhcjeTv) z@_Ah^1`v?(=b>4KxBU^lvJ?y{@vs^9W`wmfF-r*QDEJDvpq+s2=YbgdFVq2RewkYF zBLpiE1mV3-130qswM2K8<2Z!|;t)0s)*N|^&pdGCsA=alAgTbps59x}BzA(hpG{?{ zZG*i!5p>TG|MCY}VCGN2)G=VUk)4J%B$cw>l@NXBf4c80`wmM1q_@&u- zLXV|mnfiqr({=vb^sMv-;0?JJiC3$INF*GW%USxNKfP-Nxi>f6LEAYFlLK&gO+yWSLwbXezjf>OC_Idb475MvBeCz2Mjcxgj8_1&23m&~uM_5*eGMsrseBoK%Z z@UuW6b94S21WxnI&H3Z+zxDH!){q^OJ8s{G%WI%9YecFzd(+ zWDp~(bpe13hJgAmIq-$D%4Vw&KD7lf2z}0I2LLeq9DvP;dhn>@-d*=Jh2R+q((H} z3rmbU80@ePOM=HP?mK+!@V@5^ZbdT9Tmzgme;T36v6kZ>tNqhgZ#!r$PUB>itWN68 zkz_TAR37>hz2vjEILewFaqU0%iA2bftJ|2X(5-o3r|rhE4uZ`u2D%XC3S;zU;f{!5#PG#OF6^6F21 z^U=2-{|x|0M5UloPd)zoZ=E?aSeCPZCs+Uw(|jLWbcM57rHqkeR{C(dOkwRRr!yFGhs{zIsDj z&IY1IujcMKw{ch^FMi#{uh3goFzE)>eoQeBQeSz$-g4O|$_C z$Qk>pHjWx!GEBi?S(pRKhh&hqOd${9HjEYfyhPMm38L;7CnqnH?FW%KY&|@1?AU?l zF3Qq&aluSql@4IG;;kXyk$bmir5Cjt5C*`@9MD?%{^sVc2NQ-ZE${bO!^@)0q_y$UYm3b-i^T44q_RpWRp{si z@MxZE`S`bR%~VUv$L&?NN}B>9@Ei=yY-;3k-TvP{_0bQ2u6mkYlOIZ@Y~T8i-|P9^ zuRquU$R@0W0Dx5DS=%-ouAAS+*|H0>v+jT;v(i?f&yCv)^4;L`5mOcV60VzE4yh%X zA!UVj-~+lTKHqvIIoMfQ)(^yu40yN)c%zP8FGf*G4HnQ%2=+J+a3Tq%9Y{Fh(lGhn zJUsE`)qa1kFbxO~bS-LLY3;TZ;yoeZfiBdrVPZ%|IEXS?co>7=P`bDT6*l%13Y)zW zJ%vRr^CZRDFqhYq2|-J93%QPN1qq8JAgDALkC^eR^C2Tm*_)D-LV@8+)hseGV-nJ) zVel@1vcv=cNH{x?lv&P(v+{^Jstz98_0t!hKd{Ttz-cUe$8&r3Jhw29lDg=|J;XjR zI}Mb>?O8p}vIs6k;>oJcuBgUI7GHnpPy9lz`o6omz){_2fxH6v_%1xntxF32oa+Yi zr#mG#rgOqc*SwL!nr=imSDS{*MjTOtkxeBit{Y3)wsWg+^Q zH#dJigWLM$MxExzkG2=W=^wZ3?Ozzc+w_==?Cu`xeR=O<3*0*mz_Hky&u<`+xI74> z)Me>-m^>sG(_@{$bo}U}$E2(r@C0`Au~)wT+Ls%RMRrXXnFRo8W9dr7W*c{_GZsmk z3-5HG-lvNA3pZWLb&R6L>*!4rZtgDLd&h1PFLuJGF!5&U4cEz&0xE zGX5;?>aj-LYIqO@yax)IBi{=w33!dbwNp-0Z8;O%Ka&^gfRJ5yQD28CP~y0o%Y(~G zA<;ARVB@RcwJjcxOmtnUv)T&h@I;uR>|ts;y4;pe zcI^|E=oB0ALX`LLr|RZq^+ie(SbV0{@2|gq8<%QXtsEI3t2(pThMD6CJMz#M7wk8= z@`l>kG1j9$$82om=33z4dIQ|Ij3p8&d8bCi48Z|IU_dt9%ZY8TDq)qU4TGI*wp*Ad zNG0j1k|YPn!`Bbw6<`ftS95b7PzZD(Kx#GTKaX+P+xqBftnGFiu!2BRO>@dy?R0`{ zzdxOa>k0S%wq^0-MSmVxmjEM`Cy^Pokc3OA-en`IYSsGK!;k;|pZ^kv0Krn-k*}V3 z>m|2C%d$2BAQICyPFIpPY~7vVGdT^8S1Pti)eNu!yrzsB2X*FnkA%=??^dLaN4LmB+BYjL8fDgW#3-`>l87h=+1`dqmBr-hHFyU_5 zgW5X`=wUPl!sF?qmfgh6SH5&{*6>*y_emx?`Qh`&4!rnW*)s+6NzB_)waR_bTg5?Nq9HR)0& z2YrbU@3S#qR8W2Hv0LetRpuN8kGZ&P(l}j*%0yF|y832-j=WC|NCY4RD6B4EMIc(P z`2J-|{rEGF-aww5gFD~$URhiy6vn2feZmGfh>qin;N8Kq7%)gqDvyv}3(QC$9I8P8 zkO+spd*lpHz8wHW4t%*A=)Hi!h2zG_f_w%@ z65dd8l?MTXL;-^s2P?R-v!E*zz%C4(F5~4+ozB4wb&$zzW4Y`YK){VE$SRN1;Dskb znf|U?p9Uk1$0Ox5qZYgd4;~A>u~wmG7=p{#rmNOv)UC+cDf94*(pXjw7O3rvU$FRq zIYI=i3%UVxlrsg&McXL6(MX*o>Q76#KGY;)2vid4uu&%(IBTbiS~gMzyR|aooMAF3 z!w~IAftoV;py>zv<%VmX0=>TJdT-Scgdtb5P;e&QAvYIN1*xHsbW8ds_Z&Fz+@A81 zj&)}=p8{32r^uHumtjF?#U_zk^*R52psR{nyvQOX84rgesR&stu6+THKcoC#Y6QfhY!2`2C`_ek!v^pbMSI|RJ^YBU8NMEW+71xO%=%1XuO zn|*n8-UodM9KD@`7y(EDZvEwE-^-uxh+f?L@$ugZ+tdM}xDL7M6$w|XkG%|*frK`4)h;}WTRsHVQ@BjJ(sjIkF#j>eXDq-GTnqt`zTUNZ8 z0m#+>fUtJ^h{WWR+|!hymKC| z&h+OcYR?QNKd8436Y=hz_OUimNL1_ymGqMe$0z_+C?ga<;Mr{+F0IQWoE1DD2E8&~ zW}2y(Q^`JOkZ6}?u^#n>W0U^|u0;PdYOs!?=+M=#Jel?|0|il_)iQk~w{iragJwI6 zba5a~+6&c`u1d<;wJ#v?pHs;FmMisF5qxPh%G9mY#-(yYj08|eNnhv=H^9TKjn#g2 z$Z0ql#;A3m#5OjDH0>oB${g8trGQbvFzONmOvoxgM-G^EfDk|-pSzH*E@An4EpYM5 z=R>)*xA*Q{TvWq%TwDyO1qJ~=GruyXm512{y)0lcx$#ID(W-3LwXglt`yOu@*N#N6 ztT>+SrUt!JIP0=!&E8yI9XnN#R`9Id6%6?OYNx(}pVOt1qP$GTr^}t4gK=}U33%L7 z8l$T`t{cE*@I(p%#5geEQq~6tu%3y|o^lewZG%Bzerji>!0&ob->9ZWy#8F^kyg0C z6SjUVZe5cZ%CLG7HS{I3@d!sHBGy4d?JZzpYl`DiKz`csCSJk=o09Rg({h|jP>N4_ zI5U?}x^+}%^t6;x#giJ7I)n1yubhV#-h%ceI=4Bx(W!C6-5ePQ4JJ>h zzGJ{$uZydsB4gErRLw{GTl>WKK z@_~E585s4h-o5|XCR|7;u-_^Vt%|w^4!|I=kdW`SbkJIP3bXaZECHU0>gB36n=SIS zU%pi5bg)`Hf+@n`M54R02^{ykc16Jp{Dl8hnbx}$3YGyf#NzC%;M=+sDYBS&lh@Iy zACBwDH0%X87%Pg~0|-!NO}gw4n<`BX1Sz|;ZofnVp4PDD=GL3V zuBkMPQ-f!@5*Vfv*kbf?8%1fA;IGATh!)@UPU$F0J{nq5q@=erw(hvm;PeUw3Ga0c zZ@D);J~;pYAOJ~3K~&DAmZS+W#f?};sua02Mo}CWH>QEELQ&buP@whN7IZXuo=#xf zPLaqP^7$neOAx1QN43=Q80Cse)4T-G3|t5-;A8LJDyAAr0I(YiCiRgWFZ`mC*@x_^8dTb zrM>TKp60Ch8nte!`y3(QIyK*CE6|1&uVI-jbPKU!-39Gbod6J%F#&$58%wFy^w;Yo zviVZ~>RdCd5Bh|ItY*j}@T4~fBvWroFA!S!8b$X;9a|g&Kn$FnThavXV6$H?=&i9{p!FYo){X6xeML6Qb);W+QU?;sfS*l zQ4?jr8XQ@nY{P^}j0*(r4pawpRdFO9 zN3>t)s{cm{k^aTs&fPPFoPA!Q=N)#vuhiN|R?<$U-|MnciL5n&Ws_smC6p1Z2puNF z3CgO7RHoV))a2aO+FYeKV0)svA2yjZ3mU5n!ewr5s4ne2rOvlBH~SV__URx}*kU2O&dS-i*|r_(4P-JVqgKmecJT+-PM)gY#&I0Hq59oR zTk777#zmJ4x@?ocAP!)-Cly*oor#4+j*5Oc9wvdv$qYHmW&Ln+pqf_aES7X%*)=gh zl6qNAZ4s3#`f(CLCk+-V*z8AG6s&qdQc`khI=!7 zMs_aJmu z8XVQ(N=D}KSeP3+eS?lliI0k8G!+jDmG&*vCpkU9QQINEdNE`1L=_GK70riWkcA*f z!OO*upSgBzD`o+I=CU&w^tO-b&sNzbOT(u>eeuBIeTR#|4sN-GUPDo4T8i09EsGzw zW;X6US=PHMG=32>N1P1D0dvT|aOD5*V>Xj3*R{ zZWcWMZNqko4fPUzlya1^Dx-R52)>K#)P1J`qvD%-d%;Ha1@)AXfRRPcj0u1G}z= z^r?sfDeIFq`#{HrzkmA4+1X;TQUtn+B*O)}EgME?mi^-H|1aw|nf`~ax}31Ga0q&j zjXKGEX=Qa|b@ku<%@x1DNnUPCGa*@eidJ+3D2Tm6OUjCjF-+lMEI}m{W^*K|tg96Z zg^0ywfDvDRheKhd-Fj|vl3Fu$K@_y?z0y3_JUu&LFN{hlC5mtjdB{6?ctLwEnVv2# zgGcjPMa#x9tRnNnX7O9BcFmqm?LK)eXENY=++|b54?Y5S+NaC(2~syXie@r?XI}-M z2%8ZvY%^#2%6&jpRU5WqA$71}d+HPI0J(hYhKOnFD?5|`6Ps`uBcZ%BI6R<5aN}s( z0;~ANNV$keXHeARCOk385Yb6>gNuqZ7+hF(9ge{yFbx_5&YPE@N{Smr4P3(Ih$m9C z!!U30giwnqeTy#GY^eyv-St*ES8$B74$d1$N|Ro2q(iXfke}Dw!xsodj9af z=l6Z6Xk0LFO1#H*?b$Q%=Y)n+%BFAYbT>}d)z#mdrD@isrSW7HSn{|+Q4q)Fs_`%G z{Qu&U-mAB-P78VMLS*}Du1=p+Obo4V__}&~bE|a{9*8KGv;td+rNUu4EdYdBHe*6V zd`hgsZyhl)LN$GE4%S1U#+vihAqfoAx*Kehq!nw*HUIUMu6%y+I>he@d3)y$|v*%TkpeUizkdkN(^jiwk!1{8QHKcmq)?hYVD zFJzF$%DaQZIDM%M>}sbH@YZ+{>2$-I8$95(1Vjqhl=eh-B65gI913UQtJz^UY_1Af z2m~Ou9=79GsKlO_4|_TupI`vT}uGhDSXyzbQS2ES%MG z%27@?N~M!P{dH*>L9;zrB4x*veON+lY=FI0LNM!MOZHL1cU;Wz`|x6zg05H0BANg z{7TsJi^b*T=@pYK4L)XQ?hT<@2>GKK7D95@!}iE_kftsVaF#afS`W2g(*u@3r~@1C(>J6iQ{zQeWw)_2flMI4pJugqA)9UT1OnH9Yrs40 zh45}T{AvNdV;m_cMq%qX(^kgM#j69+j6WX;HBF56B;x}Hm^0W=K36_RC&}d?v6cBu z;~KvUZkT9@H~Aa2<}=G3eXL#MCW4!TbVXS-x@I6cg!(j37~vioz#-ULf{OPvSz#O) zpu|qN`l}L{24I+~#6e7T51mQ4i%4S?bD3`3|+g!y+$~d(I6Vs zMRub>!|cUkhx;@0hzxb?dGWxp=MS9U)1$LiJ2j>DS)H{YU0L+4PT!i-$Y+|Nf2D4Q9T*Emyif`{ADRlONJ}x^5MSrq$Ke`jUxV*28Yf3{uyW{?XX%diI^G0q0j!4D(#>!Z-PcvC6M`2x1dCX)O#?RY+<6xhIL+by z4VqE_brtW!DO^@}>on8b3&7D2OVi-C&UNt`ZGm*Sua}Kln$6lGUbQI`u(aW{%bc|v zENCE~E|;a91)Vtx8wfL}CUA$gP*9rud9_Jd#+T#q0T_X3@obLmoGQ^V~uI>#qTMa zQ5%vnn^Q?;8L)=Tab9uYon4oE+N@0(@27j7+q37>564)==+$Hv!^qpyImwYHZ{S5O z5+?_ANm7T9S+h8t)P8Z8``>twH47g7Lu1vje&*QuUA61{MG?%qdi`&{+ofK%$)&gI zGnrMxHk$%qSz}f=Hdb?`67LqZ;SoSD9Ne&}^v`uc8`4#4HEH(wrHOD{tUO3wzFb9i zpXSK=%ngi7ob%Tguu1$>f6gS@5W*M(H40G!kld0xqyQk3 z21_7-I*pw;@a5(n3wX=2GJ%)bLZJ^0pgd%d?If_`7Kz%&_l)gsDv}5?sUY=+vo5wt zkB~|kgJwQ+bPhHZ5oFYW%j4lxct5TLppblLEi$sMTH8;uzmt8QrvO+&PXS0!^6xZZ ziL8qPYy$bDIwN$~x^W#qurC=MU3z%cm;{zwUQOA> zRda-ue{rM#H{0}u*(1$rY4<39_59?gpT6_XbD!?nbN(D~A^pvJ^SM>#6caL~+gvs- zL3P6x52sLFuS-|Na6f7yn+-?s>veue9{&J)Oq%ENf(vmL)->|$rs1-k!`|gmniciN zsSdK#oo2H3^D^ypyt~vv@5L0 zYT(eth7m}t0dv?Z41S-Q!pkn5&Jk3r{Y<+N-!2a5(s0t7ndlomhYu9>8iw#(XmYI$ zmyrQwkVjX7m2V6VFCe&BtT%XnL`25_}87#wJ^J5J{2~x$rRe_%p31QGy7C zq6yawalw1~emeLW9a*x>od4;IhY#;NrYEjb@;0x?U22yWINGuZb=9nt*0S>AMWmRl zhDmWjSCwnYFAj76yRMPq4S`D|ow@;PJcxTnDYk+9+m$n6fbjtF8LNpG1nI?6goD4Z{EsRe%E_EWL;j=A%$kQ-_ zYpx>5wk+mB8#~QM&q=j(a`(xT2b+2{$xE6ABpN!~Z7oE?sYA=i-H9MClgTmx59&3H z#k=8b%oCJYl}MAD}8`sT62C4XxMb=Iu+wM%>*SljmpsYIn$TieC z7D<`$^b#3a$^@lw`Pb!il)GzkJN6uV=h!=!MKYbLqASF8w#k93_5RiAtFuL|i>9^0 zX|76_&5B8_tMbJS{@<^$7N(o80L620*W~$Q`wky?e&2K8Uqh3FFaRi7jlzr*E~P4W zbevk@Wtu5b|3=;FYLksp$UECtB%ygtIl@tqQnRnQ*C$YjP$$gSC+X|usyE$HV$_+H z`?I%8wW0O7p`SnXn{Pk-_*4J*LKKKAnC{!$+@F)=`u!Ta7@ra?8F6}Dkrj*7IZ4Kn z#-)`A00_|ffel9)cO=a^gAlwt-{*3abpvGrSeTWx13yQTq*6bS)#1aJDtF63Rq=jF zW~-rde7FxmmX}UBkjR_iaidGC9YtkJ<9MZlTpHC~@@Cxo&DM9ZR|Z+d$fiWXTllTu zIXaa{P)|UFbU%SbsD!r9l}%9LQ6dHh1VaI}-(965jT&lw6t^d+hznRX%B(bHP}CDD zol4uO)To`h#8^5w&Km9uGN>okyKTcLs!2-ir?Hs~%n5DH*Sf2AbX9ANXp?8n zNMCvinM`GSB*b4?U;L{V_Z_&rBsBv_bzJ*s<=pY!?r^J!^9vlxKtt1A#| z&BO9~UhOme=wWbu`>DrX?P*y&a(h5$fRlvHu-9bXyJQNkk5urABCBiQVLnK@f|n89 zVVo1RAwcLKUPt z0fkj!9p9c0HYTZXPe>B72uqn_F?5?sj0Th0-5%$Zl-lmlw;6zq2>DALMO}Q@kyZ3` zQp>!WaJD<$yn5)=>09nmAiof5Fv*deI7*24T4S!j9eelw_V_c8o_rLQ1UnPs2KQ${ z_sqc=W46bC;o`Bsdj9b9``&SiFxD$O>G8;z`$=l7wdHuPr0(ABS(cU4co8XH)RBnI zUX7E-zhH2&?4Kp29 z{w)N^!yi5M>I+ZyDY{b_P8@G-{n*00)3<51$33`KrjLddx>30J%rcGRopPQ1J;DNq z0FC%KtJ49!1xzWUtdu7PsyGoqWrnG~%6KJ7DlZTo3qP~%+AbH7Wr7c(pADx59pgou zTy7)|8ipsx^@?6UWBEXAGpkhCFP3k8M`7+v2OAq4$?zeSm|fmY0HcmZjffQntip`$ z1m#+CryWR^8|H^3JDYA|e1HpCb^4;dSX35z3^LzH}`gGT>^Pk2eEIiK5`2zmBjn#~^t&@c9iP@|T3v2JMz*5NS z{0WGbY$~j(bZSZ~ejltAb~V5L*DnM1045zEWOWrF1GtR3Q=?Bm{n+2V&<~&k-tPM6 z8bJR2-@SV1L^-^_d~QBt;`t$d*!m6CpWTVhjN|mtxNhQLo$k5^Zhk2#%K#vNL1JU}g0ipTC?m->!apR*xHaR0Q%JGnAmQECyTpTdnO-mk zC5_)o9C2>Q~L_sx?3NJyE9zsoNgi3T%+2ua) z7%14`iG-rTUmJmiL82iGucRpLxv(~kW-RVFWluZIwk$P18c(IDtUHvx?)7$bh$KQl zoW(8AW~ulfg()gtLMpZFIC5w@jvs#}cG77iQ(>CcDe!_TC<#_~J^$k2cg{x*-AzDM zO+NSBJ5t826K`(Z8Ym!Fk4T2amItgSILWXtma4H){So-J}_w)aZev`Q?&HcBG z9mg)8Kfmj_59yJD;so}UGmsmKh*;&K9nedz^&9O z=`ZhX@iqJMLiEp0VPv)Eg~$Hx)gOHOpBZ1?-*x5Xm%sM#ug?7D)t|ijli$3ci5krc zoq-1)U7}t}z4`TTKkZ!^1pt9PB)pK5XslFNIO7B{(caf-tmp=o(OzKRhuX@OaU@B* zL+z)%UI(C)Br+w-pnRyub>}^0vFLEb!(?T!vRytZm2QWKXW7WRhvaK_6la&C9-^sp zaQW=r(dkA4y?|SXU;5?yFKG~DsZlo(lt=;@iv@M}*(vKF8uHRGDGbOhTaU2Z!%~Y& z?+qCz**=ks2xT(GcPRp#YFl9j^r>LlZC z1WlcQ5y3Ufjq+hgp))y=!wL(NQY7O#0if+Q71(U9vQMYhepm|_*qT+?3 z1(m8;2iJ*cau*hV5yB*TQ&boBRZ4DYkx;P(wu;cm&t4V{O85%4p2qu#ZEe-&jfqNE zmc=AznsDrScwCKf^_HslXMNE?KW4oBIuG-j?dTu%@3zud* z5a96UL+orOyndLywra$vL3L60fzxn1yZJ7@>=S#O)%M%zTzzMuKx|;+j?`+svOcy8 zv6L$*VkgPU#*Th%$scFN^(Nh|_USD7a-mMC`PN{lrHe-=Qf2ASjvcBwbgYf7EbNm? zvXZLvLUx7fl4)r2#p=Trs|4U9gkT8qEEp6ED2R1^&BA|ZzscB^A8i@OScZIrY!u6J zikMTtu73`M6f72=q;mPim)b{cGkJ>+KUCxn4eVw-nxT=MZf_r*oQy4wgO&7HKkw04 z!4S5)pFA)kyL0qP>eK5VPC-${yOVkTp(^M&`*iC1TtAn=|8-0q#UKtuYRu)EeD7;NW)s+^q;IbDYJsexu9y^2s0yUQ9 zJ+Q4Ua!(TDhD9RXqUQpSGk~iNNTsIa{pC8f9r7C3LqB1nGI`zchGJ+U1;joQLYdv%OcF0hfTFjS9cS+}4^Ck2a z3pG_Loo{Guec72S)T0`vW7n?f2Ihk-jYY%8$xff;UqzK;olD3x4Lz>#ODPr7;56-A zL8mPoyE<+g8C|pFGMi2#;^uL?sIlccZkt=C)7ji3c>;yvhy^ZDJZ;MoAgdOohVEBj zg-f9Vp;D9E>?$B}hZC;5&OWepEnfxc?YTM zEsz7eG6E;fjahV6QK|qZq`~4+nDljLSWxuz9S!Ds^wKHobdkX0H>cALT#d|h;Hw6b zSTZ*=Ua4GBhJ6*3&Wv7*s9j`P;rfMC3%p3a{O5QJ`sz(XBDk`=@l$oe$kf0|84?rqvK`TY5KZl1_!j7<&34kG}BJil_~ z$|kR(Pww$}u*SuP()y#oyLU}f=I8%m{<9+vg?QdMKKcCUT2N0XCW_9n`kst-GM%mf z03ZNKL_t)Jo~(aBGUkzn@$vBwYI8o!IrW>l4^uXj*B(xoD~Dx}>nYn{syFBG<;%j` zq71If!TI*I?<#WpB{O|NvZz)G7E0j|Zt2~{!V?h;Sqel=CL_D`B^$vOeIqhz*tWE= zc-asdOt+!R4BFy_`2|TKcc_1*`7$=VvNK)Le1jytTO=2sC59!_UI>qvK0+z>O|9rMAE;-u2wY#nu5N#5UwB zQSbJJLM?(wG~sNZtC+X0YUzeSp+%IB@#i_(1qodu%EZYiyV9G%qooQ{D-~C1QMeQL)xp?T zw=$zTU04Qm6&lX#XcqXFEQna@ay1|nH8;a8%O1Ie6ltP1S@vlZ=@Y^wqcNM&h3A#|Mz9)ORkr??5>?1FP>93 zJ-F8qvRZ*7A3$K0+%I-8A{_NPb^NEh5JCIrTi|G6Y~c2Mj6)!WJb!-lr|;f5J(@J% zOf@2|dB6OEc7FcCXW#tnkAJ-I89>NcirCK*GZUX5ovfFz2%Jnx6sfHYE3hz$Mgz{G zSeM3UKA5V#UORPhTX}85Dez{)jl(f;#9n@L{SVg5i}^{)hRZpB_+lwse|j_{cL88R zppulH&dzp^a~C9M20|fOP|&jErukE5r_INdwDVc%%bF> zhRQo4Z#--zm-R0itUk22^CeUG^9Eu2O0StFxb^SdKrp;fMEafR3=78A5| zv4U((w}=Kw!jNA$$hE+Y?C|2{$Xd|QskQECav^3ohuf$c-fZmPV$puyLazv zEAB-&%y0m%m&>KQ7`6j-L)p(?bie~ouzw^pAcz3kkrENix^6oDw-gKc?Vo>sB_^$) zIY0kucf<3<$vNDk_6*0sF*OIw`iD8+IJ}4B zKeD9fT~^@p%u?zon%lTgcvV0eH1KqCwg^@`LWt0UhKU#r1(+is#Z+oH~Ze_aV3q+yk@nQ;h+VoJ}$~f1bim1 z*pnLNO~Ya*hshH-I+VAl2R zRsZ`ky)9dQx&|=VV!yIH84)ljgvrQ6)Ln5k5KOWV2ruUcE)Sgf{bW4>>LMFdR%D>sD2_rTI*A^G803Sf~q_m7S5I^DBk;cE30% zqylh6U!4>jF-nT$4jL-L{ZhZxcaPN!h{G+D883CHT6{%#{<2)*t0q|u=tvmu1dW-F z7(yOD-k)jKpF{joetx9FiV#cn%F3P{#}3u>y!6Snx(v~9T3TCwbuV4aoLL>L80cuH z$|iR{90Zm_VvvL|Ov+-h2!dd&Z&~=?Od*41fI^ku*@%i{nR^g@dGXp?19c_QW z#;1!AzgP??k=WGVu6$a1WC@Dk~KgE^NmD zKxE+IROVM2)Bqsq8DX2z!sVPjA_)}=iv~!}!uH$St*w&5^swdwzN2xPa)Oz+=dGov zlBw3-7G8dGsd^=_q82mX?_J@lF@#2oELwVnE|1(Vm&%uUbeGzzse0eXrjul|QWoD` z6~co|R9_({=J6sWyqc`n09OumQ()yB-W&#+QQWGyAGj%9UQh+UpEWN!eNky)C%ZT&Yp?xr$JHabtb)tccvhy?OOb32D zdnhh5aeUL*y}>~P5(=phzDj@vJuDVU^4E3MUjT*d-15^ald)Z+kGZ)uhxV?X(m( zo?+|jkB*FtqyvBeU+#oQ(3N?u618D4l#UuRjFtxJ{5<=dkmG6ATUM4{FSK5j-1FLK zA2Xy52J470k4X%0ofh8fyeDdAdo|Z9!nG^2?=u&tiC_bdD^3mYtgxE1YueW!e^f+z z81~3uWfD+tXnePYoR=5*EG@XdfDod#u=1tr3@w)FwT)0Ua+b!e%)OhQL4B3!wV`Z$ zfmVpK*($P9FU!teYpeq37#f1$Fl)-Z7M+EQHz;+Mf9x1+@$%Smp=?RINb6 zX5oH*@l0%=yP$(Qbg~TSDhxpo;Kv6dDkP{7lMci>z21BHmyzimZ2!s6CV|K@)_aSQ z3WB?UPpds@?|H7{!lNTcko;TP?QePd9A_`wfBRGpc&wWa0(cxwNO;fQ*N2O_i2xz> zi_&GHfO}>2!6c9wcV=c1MSW+F+@F7Ms-C>tsOh(w}=lj9li@P%mc7mJd?P_xoPbEa!6PP7VFn;Al7>HEt? z3&iwQNf9>#W%~UDN8Y&Sp2*5z5eo|g4o0PLj9KY%H7(8)` zoH+QtPq4@{o2&DT?##HT%!WqeyW=fODqIm-;ubBlyW1nvdv)F-QcAF-MNCD$h3dn4+G^U8 zZ_Up<_UGtQ;w5#6RowAH&4(Z@*7iM+pGc;`6Ds(!lc*V`UC32eP{vE~P5sMuZ zEl=Bbn`Z32_OCRqL>lRoxdZX>fy|)*3Y!nzQMZziQyOn|DwSSbv1C$WII!f-J0tK? zj!vmx8X3tj**c18=Wu_6&E$^SY}I+15p)D5bBF4nt{Qq{=y6?URM%`WG7cH)ai^5ALiwvHkGH#lo?l6R!@Dt+F_6^s23#$1W^ej$YaFFF*as&&p2TaofD!=cT{E3Caa_SorfjjT{buLHSe)aOAZx zE|$Nlf^18fg7LxlX_!$3Y%zLt(wJvgD7G)YwFn*-W=3g7S6H-bQ7ajwx3a9oUMH=& zk}n+N_GT-WfdFYF9BgmWg4L;0`aXL9qnFE1()Aji75lW?d_4V0F`dox;=<_rjqtbO zk+OLbkJaxe&ci$rNv;Kr2D;7B?(yng*i{9-sH%bmm7v%vw9D~ZfCO^&h+G(jom8@n z1sCC*5u{u0^*uo)a&igQ*GFXTlW?2^lE%=`Z-*Xd#`o%am0=pm>dffv^|D2lDv@g$ zwMhCm@7TS2v)yY6`irZTX64KSL?Pz7>+Vc$+SxG}vhw*7!)u6&7?6s^9x29HZ(IM% z3pMg!%gze1iy}-U{i25jL@;(I$>oAGQlD|0CtL(a%hUp41;JKVqBlxqpE=kN_5@#1L6seKWZB41tqV%b!Kb8y@O4T&f;!9;4tRFwf zN($R9_mKqYr)WhYt(?MV>jA&0gm;B!q!Pa{Z2p}(zbM4FHhfC*tKxlX+*5GjI8Wpf z@+@3L-R!LD4WK9*=qB?KO%t*Ey%`oaR zDskjdvS=cV2O_x5LoR*wc$s2I^ zsLW?IHElc63YB>k#aNIW2+Hk)?c<}9FIEi##sC8TFz81j2+Knu1SDhqh|OQB3+dSM zlgU9`VQpS0fUQ?}Y%K#Y7;pWb_rFcBg;KHSkx#zSBprgCnZ0?SaW^R4= zM?d)SyYIdM8x*(v?7YM3m~I|7vTx=5;l0iz+P_|X@A$!k<#TfYAt}(iqyVt2aR|Ui zQ%Xv0lW)A#XoQAb=5}W!`Pi;UjTc%Mkx(JcBC13f98QCT-g32b#Myv-(rQ%;A7m{w zj5u38#976z+qqdzy|=PLtmbwym-D$iZiGXl@*2e)k|Zh9$3-sYHM7sTMDq!Yg`uegzj2q#Q8c|M&4^X&xglf>51W*?T|#{PV4`1Gjtk{`f~f{>gb} zBS+o&+~|Ac@_($)_%!u$(a&#`PtBDB5`hSriusQXd-iOYOPQ+$HvNXLz7!$^d}J7n zwsdjdqehN49|<)VMH~{g_p%l_!(R1`j2!m_&pvWYGw)tft7%bXZo@(0akglcr|W$p zzjf_eRr4akc)}C98Zu}X@SsbqP;h8WmjXM%0R~uSh%_fchC&DqS;%?DTwIHHVwgS z)q#74g8VE+MI{fIm~Un4Lq22p-(0LMRdT9VITlaQ|SsI|j z+;FwqpoAa0M!**UGf!XScnUg(6@LR$jLSV9 zNwaUIYPK6jd>~4FesuEamd}5@WpWap?%ezNyKfvQZPa?ILKzHY3^$u^KYvd3r?Pu;X`Q-950Z5!sH38 zsf7_KgxTn|0RBln_J`;3+@_GWgzM{ zxvNz!xvO;n*YYIz#|yC~yzQ&hp~sK6#!N>h;$rL~Jkm3IB~8Vlp-OiD@Njh6QqY&`5?O>C zVnO=JuKTAF{_t5u5u*@1wxt?(H7==H60W8jN~_uK`1t4uY-~(CI(g*^0LanFy|LrA z2M#1oS}sdD%abPy@q#|r3B6D4V!i#nFTcD|yRCc*;9+X&>ETx$O}9pz%;u=>V?Xvhz?mX}HB+ zopmFJVrBYydG*OnxTVKujUCPRzkXTSI5jqf$3 zltX+p&80N0;Ugsl!UZP8x=Kr_d$(@Q4%=+{1qQ~*KT~vH61tbG8MS;&IL_{(G(5>` zo$fVRxYqebEwgi{u@|M01hdLQ08JfUa1vYXk*!sT+J;4+VtS9bPZd%yD>Mo^ea zG#Wqy*XrB5b!d15`0;4B?cpY;Q7;gC3b?&WHO>r-04E;E#SAUyQEDKNk(;Yuo0oD1 z{SLX>lB5rtOm|}K>T8|3kN3xAx=~A!$I!xc_O1xoXIxg_X<8cphntV>yBVS7`Gu%1 zqpU2+=`6-?+YaoHqh>#Ee=tU;16jpDfa4gbAUU2$1VDWK!TW0of};@QE|1^Ek;02> z;;+F`0FffTU}Y67DosPbedErSEqjmFpYBRBwg_Ac<5#Y{`|jue*AF&%m%s4-%MU)k zQhx$>;f?xHBfRO?HSRpa{`vR5cjL=1Q|4fENlL6=al^K$x!PEgcdF?I1jvZ#vD;=e zE(tizP7CdKok&sE3t!i$kK-X64(XAXW7}Q%)fUUO*LlrH^#7E8cZuy1D!Xa7wFvQ6 zDsNGm8s#}4jwxyyS8+@2A*=*Nk|m;{VKm?lL}vpJdVyw&1^|O}qdW6lx31#LJY`k< zEE{Ks-Kfr@i&F-!^_tPu0kOQ#;iTGZZUEQ3LXk4t1dAL{R1MW_jWy;fHzlp;bfP}( z3Qd#SG2GLW%5@1xXptS8ch?--VYP^GzvOn3(p!m%SsgahflckJEfTBMDv9k`AcH{) z$&wQ5j{L7Iq!1u-mtQOwiwj~F{Z9ejE5zbP&Mx1{EhkOX(bFTNFV2T5IuVyx`~;eh zqu%BBP9=Q!n~%4=yX9yn=9uTsj3*|J?%g^%PSx3HKw^FQ%rY{GjoLzfvixrHd zy+^NHxqK>NZd*!1&SCH8@9sTqG?r2msrA&+?4dW_J-PLB+xNZ)T}aG=#8g#E%3SO{ zETjVlnH)88(~AlJ_GSgs(u#W;?_-3Oo7=$fW$PO_917<|!&q~tMSrHRQP|ljx?3co zrHdcYMuY_(R!~m*8+nWVhN{3y)u+PF{2+%Wi=Rc?XXDy+nE?Qhz^p0S-TtBq%|KCE zG%hpho>7pUD=j#Kg|k<3bCqT#YQ)qlD;SPoeIGOA8kB4?!<*!A8n7-_1svKs^tdiA zPN$?xJ&d9xOVJYuUTPwUZIbV?uZ{ZDT%=c*s2O+N@CBI)E{G z#fnrJP1*--Q$aHg&Z4T>=L{rA&Gn%f=5Bqv+5AFjg7v^?w;Ao;G{$pNWhS7uq5-ol zPv8nRpHr#z%0PE}*(z2f0$AZGf~m!LJ{L)fqDI-!oft441Ax5oTfiJjbFWTjVfY*L z$`xZ-wPi&lUJmz$+TPi*WB0z2ewy8Xu3BeSmWm7lSC;$0(49@dk%##F0RuJ=LWl^% zLHHFO2gABvB>(G8W3ix3hu~PtT>Tq~g}eL&Lz}1Xg0r~eTt@AO38xZ%xoOMi@18uc zb<4rEv{cI6;mLR3JqhqpKb|;4?W#A9Q;k&W%m7ve`6UtL70 zD9xW%ic@>_Eu@<5{dKR-mVuhhw)4H_F}=L?yRx9;ET*2&$_=UF>tO|)Hs&n5NTI)Q7ACHIj#|JV*5|UJlENq;K%Jluu(w?zy z@(_x1LNK{#lY3g5NvB(G+P=PPn8>(JS2ma2`H z%+NeU&9gFemi92$9Cia^4*mjaDWH?xIglCWb_e1CuSBCJ8EOh6Vps5GI#R&x#Bf2U zB}trTaX}yp2ap)P~@%3QC~^P&2Jss-NV(p8r;enS6W*C!(5SA zqLht4d~Iyg$avZ6!@+*UAVC;bl5mhD<|m}2b^Rjw--5`Jce?Z=llDL<^r^Fc5w@-luRqviNr4jKzj!l5(47ThWS{D;sHrM+9VN z)l1e=_NNT7T<)sC8+lyZ!x!b!z~f6Yw3e{W96;k|%al5}^3B{GFwa`XMBod+AOIn= z(X!I0?7(mL#{~jrXLZJ?u{4?`O;t(=56f37Wu``->KO$Vrx zV=8M+<>8!v&Uu=X@T=_8r|Urg_JHs(c0DgOL~4%QXu9zyfNcA>G}1Kni13RG3KRp3 z{06mD(#&k&E!}P;D%6X`&2p_pR@Fcf1f~}H6lc&tCjpBx9HCQ@pJX722nP{aEIL~_ zU^eUGXGfK~3;+<_Y(m53ji`(oCsZ=%Gl@8X@NT+?rq5hiPEUpsq zO9=`0!CIac zBj)%{TRyNlNRNX&@@b{V7vC+C*1i!pWmvHqmQ!GohA0Px+jygC;ZoEq;1dIWe zSZx(|x@S6i`VZ}{Nq)yCzm0~u!zF1Y!+GXB*OQsN!HVEuUZVT-rkyPYK3ub4=vNJ^ z2n9h5C zG;?U^PFSNSWOef(ik_6CbPd2x zTpip$0$}kN#(v;ZWR^k&)>5Wf>9tfB;)|9$zMezh*?esCv52q5<3ywNm&(o?HFBLlVz)g5`)!h2*J&6!$BYhDGaNGv;HvsZ32Xl%D=Md_;&#^ zzWXNzk)JAmkC3v_Z0d-~J-%n|!w>&(s`lw`o*rDP-;(t6sq(LSb$>NePlXPoKE@wi zGc!js*jVAQ-3jGQ+W>t`m9GJ0+t>Wjbn!mZsV}u%5*HP6`nETV8*I%A&NQizQq-ST z`cpH_Y`fe;`GDtjH7HkT9TKL|*b6&w-EP1P*EUVMO(u6(*Bu{?54Um>{nV*GU3i%W%ct7MUGpuZMD1SDLUOEL!5 zW!2wo_*qg4u<2h3tnc=@US)h??D`|2m>$qyxpI_Re_ngN_QUJ7*RSW)e(?M}^Kc6A zBjxaMPno*mgbE9~^O^A(V^@YHsZ;9U?>=-hHh23e3O8Lo6>K3ba0jwR1L{WZ|WHTNJGpS)e-_o;8&LVnE&QxTrgBXw1` z(P#i|uZKqqY&M{`0&vz`M$L{ZLs-GvOBgQ2waUB!jLyx7kKZ3#mAfAXEC$B8bsFIK z4d;?jZ(+nGP0d#B>$&-4-?2ltH#Wp1Q_5V*2cy*S85l~7W=11Y6OJHJx+S?0-PoGFS7_KqxkOK5P_+iEu|=U@@?HS4{Xp~ zgi*jC=m_dIxoyCXMC06}R0t0MkN^aTJNu3ajnmj&gsZR9oG16_vjgU6Aa4KTty|Yx zs{nsw#+iEq?gJWuf*I(p%1E^J_MTHPN0iq7?;P5FXkVLGqafH_x`57@+YxkSWrBb6 zXkytIoi16F(CL`K5n)NmAVE6TkJ$Vjgu+8{K%4$ufDl)Zlq&q3Pdu;8dO_bOhu{AG zeSMfZPCdWp4*(x2AmFopal?i;7n-J0=H_Z^uh$+NAFnssG@8yLFm`tFNkJ@!`rv`>GI zl&ZPTDka>s9_S9B=C1ZYZ0kA-abVh;4W|R)`zR1z*&}fML$uqh>9T>ZO$RbaoaJHY zhjig2)O2TS-Q$=ahqXZ1n2U-!umQT4wtx$x0ZquB_Dq#a3#yf++-Ey>OzbEzSn?EV zK@hPL3OkaQc;M*di@b$GYvE!jgkhu#!T6+u!QroO1^xR74~uYk zwvB_kz8eFG>#esxIrV+foufxbpYKV?0iOKp0oogdO;b65Pf~yhF=~wI=d9{qFi1+O zvuM}b^B)W5KSpY54wuL90gQb4#qznsmn-|zlG92`hTBT)kyMLsNmM!DhnlXSV45~7 z^hc25<_4>ONfw>$weVJwVoS1Y%GrRf+nd)L14wBU5CRIfRk<_WaVV^j!$H7kR92d` z;3AEtI|tlu-6j==Wa&^-Hr!nWG!>u?IQW#A888+xf+YQJOGJUmZ&^&5G}h*Qhjt`0 zx$-5GElX8Wf{mdwu6&ewzC-o!#c9)I`%bzcw78b88X)Wyeg{LvVDQ%;oWCCzA|)Mu z*Z?T?-`|!~JD2k|2e$WqSL_EO!f|+RYOYm79m&4JOgOcchAKb2Cx(#n4clr{Vy5C? zv&3=4?};>{3~w-@*1acXBI37~&06!|?%&Kw2pRmz2Ye9I!>=-mOdzSKCACyr#?8QPy|%1&JEkVp)M{!qUPt3gz(pwz=K zFxDGL{>}gbG!}FrewNsilk*Q8Is5}%?4f`kW#Q7pQz_+Vn~gKZ@rIm)+O-_in~N7; z4G1=^mBruW6ufmj-^Jo+ty-o&72|LSEqPy3Qq%Uu20$He{_>N;iITMb%{SBRfIdn9 zK++;_dF0@yA?PngGauL0)ot3TQeXt7uYl9s2`hcQYTTuE0?&~F%z!y+);u&rFOEX1 z5wDAFmaOJcMD1rawEjd-sk*ZQhKCB8XIqF5Ocpg7==E+LI@TSR0s$b zfgud*Iy(ODg5sxe$O0EGmis*(q7N4X>Tm$n6-)FIhc8~7qnvO81I|qN&2@;6lkK@|^DT(hY=UkxD_W)PaeE$k^macG-)L{*YB|fPK0BAuIwYwgThx*B$xa zXRs)KhqM6i1IQ4&6jD;^VTohYAVFlY=+XB3zqmjMyNu()QyL48Dle@OG;ZQb;M+f zwb5<`O6UPDE+_yH>0>dtD>OAuL^^F@n;C9HG>$pf00NUzI$JElvK3Mxtwi0`a*sdA z)#;*fLkG6L3-=zrs*%?L$)%*TutKh;*KE8yfNOPbTF=4{e|Ynq-3HnKhZZo;_OZbbf*3-ffye-c3G4zE$zZIftNxCIRIoTwgZRyMi$9fV2=A|S$_gUhX8dKZ+p;^kq$CZ~R~IzM z0%K`A+S=MCx=Jh5cQKEkLLs=El#h)%zcNJlaxy!{Jj;oBlLD`&ETJRwci9R=(Y71ma4g zU*iztk~g)8;5_Pi)(nQ_L4I}_d1O%H&q z;!8py#sCJSm6Sq(ZR_gwO2>M{LhNx|c<%!6t9dJLUfcv`X~n&+4ifYC8Gu)#7T4dAU>QD55*;wG7v4@UNWp&W00Ef zeH3b&IQYGTmrn>JpE^UyJ;^|FrKLSfdj{TynlV!1?RuX17@BtAupi$k8yP7@!?I{R z0Eq4d8kIrfh{6$bH|mCN{PF%cIPkPK4!D0UnQM+SnUdrVJ=%Q@NUUBZg8AGQ)uDYr zRc)TIcwLKLU3@?p-c%UGx%&YW-PE!UI-hSC!1!1M3;G>EXEFw?hV^vSdi*J*e(8mI ze-Ig@(+vjf!rKV|00&>c<@qFKD&_497dW_F!CrDC z8jEF#X>c%7jm9LO#B;gz41@F0>&#~*s`?f3+Co13fmTCCb!I%nF-e( z*1;}ac0b||chNMVP{FBUx9 zWV&;wY^H#j4CbA~V5J zzoGqayaDGn9%sUt*#H%|4jI6OI{*NJx=~s7(1ERW`{CAH@DF7^j-Sah1POW`rtom& z4K~!7+<)`f?vj39h(gO$KD66QCdQOy_-$p`i`NAAUOdkp-SnWP1zxZ*7zP|k`mr^3P^RgZ;P-O?)6Uq5K_K>;mFHo<`YG;^Xb#; zQ(r-1syqdJnwpByNO}23&4`D?Dew~<3VB<223hdY{SMqJn0~#gzhvU_>#x7RgozEu zTl2NFjlYf$&~^aH1qcMa*eq~~Tvd;5qDo?>>#K|`@MHY#4XfB)7yG8DLu zSVTdfroHdN>wv(N$Ap#4q%2g>R};hsc! z(z`B+4XC#`w`uZ0N1=7m$`6GG2KbnOrI30k5e8>{KhJvnf4GqUV^^bkam-6w*fl@> zv^*gpXMXwh%irJg-kv32)kgEU#=u!R{^mEP)+|R16y;D~#a^b$Z=C7lRP3UhFf?$5 zsp`fPerB_vu~D)hKmPid-L7TRkx*f=FJ0gu{Yz1I@6CytiMHXAWIN0zO~5anrPenPGR#p-+gfL7+_#KX* zfPyim*Yj2D@&6Ontc|l=2kCh0Y=O)1-nT!kV*0A8Hg3Fj%{*@8DjHJXydHBPF_4sh z9YAR{`49@{QS*}T$#-hf>;|oMnI`dYf`li?REr~I;eux4L-Hd;{jmYx-Wy15tLdL8 z8BQCn0VshOso60BD6q01DH|DO#e-}U`x_Dbrgv4=w1@7TAY=q#L?f&((ZljULZ#?*` z+9v48{|!3IW3wLHm`tm~>T4cO?nz4qzGC9{PH)kt>4lwx1jboddcUG2t_*LedjE-m zq3E0i1OiCIUb1_lEf#=74nc`!Pv$E}!m$qCSWjXASdO*TBd}S$ZtELc-!Q2Jy*pWg zvOCa~QwKbeLaxz_<_^kT&bl~n&&_v!cQN?*tfFuO1fNRdYpN36V;U6 zJ~k+k7%;@3LNItY)8nU5NXNRYT95zEXtd^<17jYC$L06nVooEi``WB|L9ZISC?InI#cZc9eEww3W0C4^Q+@7$%bKz^2z&M%-|=!={Td2nw^gGBgv`$m?LoR^63B zSI0PAOr*!hxqC^{X^!tc-@ZxNTkX=0M03;LIdo|E=C*&dkn((QhS@xG&QRfM$^7l( z0|%b3c7zNP1RLN-Ff2kySqg$e^7$9mzw7JqKR_Xc%1p0^+yzf4fBU|)b!Fp5v(f2f zTNwlDhE(pJxs)~Av4)Kpm27KDINNXUS)fJOJU+n3#O_0f4#Da#0+ca4tYRiPn*l!B_H90NZ1e84wrAXHRgz+-(ahtr zNV%}JDr9T&?}o@)Es?DpYE|3tsN(r2`M2Lfa>poe1<_O>)W&nqvG8#d;K z7NiPid}dtc(N@5|4 zx?wFO&Xld=0_~(US1FVJQN%9b%G~Ka?`%GHXy0zSWiVKc2I2!cJTb)b5TB z9cUlB$JOXGiW9wN&5O`*k9_#kLBcuYv>!TDvtu`lYm0aU#9&sQ$}d)RJg*zt`(mua z05?}5Duz`Rsi^RfB*{P;7uLVY>+!!LvO50h1$Y)QRp{P7aS{HaReZm(Z@W<_mpgif zpIKqeqx{W1-?k2?^(-=PwgGq;`27Bw;eEcOQYFw>(4nUReAv~l#`iaJz47rI%}R4z zoGt+Sq);Ud@l)Qv#x@+=T?4#_-EL=j{KKlAWP6&uB)Q)gb-UL{BetU?x`q#>J}(pr z4$y;siNK+E);#Np059J2olaM?4CM~D*-P3knG41G`UiAHaPYyT$u#*Quh75%jvUA; zfdiuuEGY%Cs@G>a*5iNKrW&cfA6~fpa-yGaC|p>O@Q1I`G#brP=oxGrN$z>pUsx!z#9xcg+_>=?Y%a`<&Y~~4 z1A-vO@92B9vFfVi_pwr82>{fyXUWij*pnyp5Ff8(6)cxWQJE|()9@pVmYG0zd>|LY zwKiL2&!O+^+q`f0urCyG#s#P^%4SN#g?(8jxN3dmblJm)_kbZcgvbG8fD{1Qh)6L8 ze_d9s$G=O2I>y@J?i}mNhAVP)kNjbFW0CS zDsS%Fmmivd01*aXdJUMp#BkTE(J4{cY2$WSCd?`um`Mpyoi^duf0d0)v0_N^sy+&zMO2k4mzSp~RtX;W+5I&P8?dGvV zhi)G0VL!l$!dx3#)}c~VbYu?I?R~L&FU02~Awxfg2v`^<^;0+lA?xD$w{<=K-89zV z_~Qd7M@LK5xC{4u@qt#MFetYS9YFO8d(Sibuzh#}xDE_>k9|$T#nyez4L|(hzUD;; z5T69c3^S(>fTx^FrH;6jm*~%2JwIHkS~6%h>T&W(UV&8NG_GviID4&%TT{~378}5Y zO})uI6Is2{I1~k(;SSqMZAxYOZ7V62E~ax`4Yo{6O)_vc_M~*Y*&TRTQUhdF@~}i+ zl!XZViV9UnyUDbv{XxedUllSSSg0T4JNzU^8o{jm6YJm8_4s!THMV-?%E|irdLcpV z^2k{)tpr|-QoC%o#e#vLVAx(V9OHypgW{Ny_TAN!b%S}3tPABaptLvIX4 zsih+$GSu7CLm4Qk+0NKrk@WRuEk$lDeEtRy}Ug=$!Tr(a`mWN z7Ddshi8>;qq9Vh9gPx_=R5{{38!fA1KeKi{(V^y%Y znv9nUtuI|QoHjfhsWDg!7j80}_IzjGqaQv30BJb;|F(DkF>Rb_9>D*B%8H^&L3Y%a z;21+{Kr$&Dlq;Uj1+U?3g%HLTn;P2_L5#^%@hTV%vS5V-DsXZrIksz49IZtniwb){YOE+N${h&`b9*U)6;ikv(%n1h?%%fg@qQHL7ee{N`RaL| z`SCt?51Fi1iK&pQsY#U=dD3Z-O?_^8ngD3*i)wlzsNW3Oi+S@i1M!;~!P-hBV(Wif zk%r?&bng8m(w*>aAc+&1QFVrunkf zepNiJnIC?XO65xSLI?@?6*dgckr`x3iuGdfXgBER8Pln&EiI#WB-r9L#Y8fBe)8E& zU{Hl^1keux165DB9t$V2$I;fIqi0%&xOhBlZEZdCuzK8O)!Oa$_Tf}bx!fiaDJR|U z;>*jH#V10q;p@z{p!j4_$vvi0c2jdR`1=7aAK_h(&8D>RZB?4<$kIxiP12m86I~t` zin)$E)!aX|5VER+JrnCM7eNR8L4XS9<3xZZH{Zl*(aXzde%8$)8)%;TEztFZNk&LAHL!y_u3nJIo)f4XNX_@zP^BNycAHYx z^=aSq@}Bc*a9&yPC#7A5R}&5w1px_Zk;Wm-V2l)`8ze*lX{9>^=^BVXVs!UtL{hpL zj_w#eH@XpNg;5{>!}ren58iok-#Pc*Wd}2vKSr2edM8YIFF~OPRV6ZwEhwgp_Q~GC z`NDj?1g6V2YGJD*!^y>_8&$kO(CgRSgYd&P9!h3^WLquHgwBVXg_GiIsx>op~V+M11*YEY9XTBkoY0N{9|GC3*8@I-XLW z;Sthm3i|P@9`K?@k#3n}yY?A0Vdb=LBn)+Dpcx8w_LXJc+~VCMxR(|&AsZP?cE#>j zNS+1!60Jjas`T&-BVLq-M z8d_A_+xmuy%%b_UG{2fhW9>F8*@LO>WKz^yO&ujKVVP-rVlIQe5fzHp%$~hF2c1cv z(N6))26v3^QoaQS2o&gz4b~xhp)H4MYB<5SJ;ifuciD z@cH8I(4AsaQk|KZFmcWQHBU~0N>zUUjT$(%t{I~&@kJ>Mw^G15rbG^QRrmkW87hth zT7^P?isu!Wi?YTb`+y79&`a0^+w{q-i!Y8&JK1u?E7CY?reAoUx-RA~xnjBiG9voJ zI&9Ty2?ho-x8Jdi)xV0*OJ)q9-x**wWBZ4lRs4Y2%ra;0ud{7g5kzu1M=K;y<>++s z>^extcnRnVxtXicyp;=FVG!_qRtKq0+TRrqhsp8CFC*o0HJZ$ioH}=W*g51qe%4Eb zBV(`A$=ORT9+9JQ+OT_{u@1 z;awX8DWmL&*IQNV>K=5EuuY!*m~OT+jE3y`sQGNc+c#|jG3b?Npbb&mNx1^41srIz zp(-o+Fxe((jYDjP6y5S-jx%{hTHYssbgML50n{u zG1PfEXAP1|qXYpcr9xhhZf}B~UEIFGbo)1qNW1O(o`|SPjE!%FxqD2%bo`mEeQgNYp$E>uX%3}lDrd;9oU~QP+c7rs>YAdsc1S5L@HpDrHoPt_D}LT6t^NA^f$e`*nP^aeoDl=fJtt*wS`XcDA)O_O<-bp~(aLPsXIO-oiBDi5<;S&vs?ySkGX#hC)_T5a zB(NL1nbLwiq^hne*1SK-pH|sg&>LDQyV*f+6l>`=QqG(%94m%>xfGTAjR0 zkht)QugkjVmTT0l#m!b&AjRNd6Fl)p;MK1%|G1O&{-^m6Rd=zKFRr`xV?hS#k%Po+$0-#+xc?2>B@uY znI|UMv)r%Tvd85m{qn6WG{j4!{9do#BxMc$^F7nMKww5dD$u=Y&{~8nTT3%6V$~X= z0dBxH1@Eugv{YA|Y3b?dseHI)X2f4va!uY&RG|>?Tv@Egu0B^v267D;xo4}KbY_&U z`!Tz*g?q7l5lw?_brsu^o2J+EX3u@N~5Ma>8Mp@;aa;fXvQv5Af#I$z)QM4+}EgC%B|D(q_i-669 z>JS9`AwD)Xa!4F@X?lhZI&OAto@(;6H;_fm(UVwm^a7N^8XO=d>c!vnHG1`E3+S2# zi%wwZx@jtb7p5z@x|riDH)&~aN2ya^z8fZ;;IoVCe-iWamvSIz^yOB4FK;!U<&9A_ z%riUpmq8l89&+V z&BoQrE!~soG$ZKR1GnTrIlB3i|0x*Adlx7Ssi)m;=((SZE&vx4 zyo*_6D}EW*BI9co(($gW@~mH&Wgr&qq^L@=MIE^=GxwiT2DsbsQ@m zR!S7;kgA@)zjbX2w~JI}UNmbfpsJ3_6$ROyDm85(cg^BxPTTRg%+GbNPG_aw-cDlB zkCNGy<;|e5FQaQ2NG1HFufH1*8Rf~au~36q|8&cl!6}EMT_E#M{UZn9;yy*=x6hzD zDXwU=X6Z7AN}U9;CgC}9mQu3LL?l41PcEjkiQI&fAVIh7uQU_ieWntA*cVp_xualE zu$)=dIQ(QF&sFfUsz84fxKE_GQ~7yKd~fjV`MYZRxvw>A`hTkK1;vv-eHM8&*@HtC zUm&p_{`A$kZsD;@4VO3@lD6?imkHWubK#D=cU@k#u9o-(o<*KaZIyP@k6yDwF~&5^f5^?J0h-2;3UubG8$S#GXRD00x4yO>#p; z2nms)Vk+0Li4yu)Y(#y)R+H z2lqd+53FH<$p~X!#uB6Gegr;0%M{;>*CL!^*LqPHw^R4H`Pj9yh%aB@^6&MV z-qCjME>&+D)=;%eUdZ2kdpqaSU1jmDyw6rmU}t4%10cIuukh$68MAQQ+b9i;`)=sR z(*ITu4#kQGRsM!)UKq=F^tX>{88&FeKCIKoK7Fno5~{wiA0mPGjfK?=L&-c2zcpke z4_2NC;Xpn2ezwA+kq$h5jZEhxr|SiLh9V}l6TX>ouHOb@Tro_t<{y5%Suiye`_9nf zO-IwU)RKTc5>J=}@lssQoUXmU|C&fIr858`rBb55vuTm$>tDT+p5lvoba1#8?>U3m z#H>mQgxlGTdB-oB+f=eQugA1dpmLo(=YbZ|J3*-Ys%pTIi@zJ;f|reKpqvFPFOkPSif7G~E1j-ZrJR#OpCdes5LJ}&&>jb*c!GD4 zoNshyss?yUs7UijNV9e4aIZcsdrD>5`!& z0N5LeZu4MH5Fy5ya`Zygezz|r>Qp1|TDL*=T~Iia^R(ikwFrP@IrD8-TfaMBF9GNt zqda-9s=kJ>yp6RqiiHj)89}m5Ql}*pd!$&V4sh&!oJKTH?X+!gT`MngsrqL{wne4z;IJa)@Fx7!Q3Xft7D2e>IuQ;`q}L z#96DHnhj61N1Ma0f}~iP794B>z{IQlX1m@!k3#(Yi8UC+B35J7_1}IA$^8HvIkZ_2 zO4f3*y7_3FMX9##!mPfgcQAFJny|ujTT3v$Fo|=EKs)SD7q2CE@d`mX1*xHHtpt;V zbm5JuUnUI|e%KQuIz~oK;oh4yfT20FZg|Fr9i1@@N7j~YZs`V3INqkf@5+LO_s=KO z@3(qSPp!oUZ_M^q6Mk6Xgg~DC8J{teKp)Gpo=ct;jR8hS?_19RkxJ|MMeF8!wK&X! zZ6hzj%lPFJT`aqVlqu_sVqd(rP%yTxRXZxJv@|79kWM|mB6`ei71}f<8jbY8PbVkB zs>!DZ<6A;;XM47BaX8GZ@D%QUrG)S8ahshKY#c8s5n<&5Vy_4o2{|4PF@<|Tu19a- h!*i7A|4FRMtvIgSa&4*(k`?D6UaP!Ou2HlI`yaW6w+sLP diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/main.cpp b/examples/arm-cr/dpp_launchxl2-tms57012/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/philo.cpp b/examples/arm-cr/dpp_launchxl2-tms57012/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/bsp.cpp b/examples/arm-cr/dpp_launchxl2-tms57012/qk/bsp.cpp deleted file mode 100644 index 36613f998..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/bsp.cpp +++ /dev/null @@ -1,458 +0,0 @@ -//============================================================================ -// Product: "DPP" on LAUCHXL2-TMS570LS12 board, preemptive QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "sys_common.h" -#include "sys_core.h" -#include "sys_vim.h" -#include "system.h" -#include "gio.h" -#include "rti.h" -#include "het.h" -#include "sci.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED2_PIN {1U}; -constexpr gioPORT_t *LED2_PORT {gioPORTB}; - -constexpr std::uint32_t LED3_PIN {2U}; -constexpr gioPORT_t *LED3_PORT {gioPORTB}; - -// NOTE: Switch-A is multiplexed on the same port/pin as LED3, -// so you can use one or the other but not both simultaneously. -// -//constexpr std::uint32_t SWA_PIN {2U}; -//constexpr gioPORT_t *SWA_PORT {gioPORTB}; - -constexpr std::uint32_t SWB_PIN {15U}; -constexpr hetBASE_t *SWB_PORT {hetREG1}; - -constexpr t_isrFuncPTR *VIM_RAM {reinterpret_cast(0xFFF82000U)}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_rtiCompare0 = { 0U }; - static QP::QSpyId const l_ssiTest = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -//............................................................................ -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - systemREG1->SYSECR = 0; // perform system reset - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in this project =============================================== -// CAUTION: ISRs MUST be both __stackless and __arm! -QK_IRQ_BEGIN(rtiCompare0) - - rtiREG1->INTFLAG = 1U; // clear the interrutp source - QP::QTimeEvt::TICK_X(0U, &l_rtiCompare0); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~SWB_PORT->DIN; // read SWB - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << SWB_PIN)) != 0U) { // debounced SWB state changed? - if ((current & (1U << SWB_PIN)) != 0U) { // SWB depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_rtiCompare0); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_rtiCompare0); - } - } -QK_IRQ_END() - -//............................................................................ -QK_IRQ_BEGIN(ssiTest) // System Software Interrupt for testing - systemREG1->SSIF = 0x01; // clear the SSI0 source - // for testing... - APP::AO_Table->POST(Q_NEW(QP::QEvt, APP::MAX_PUB_SIG), &l_ssiTest); -QK_IRQ_END() - -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QP-unaware" meaning that it does not interact with -// the QP and is not disabled. Such ISRs don't need to be defined with -// QK_IRQ_BEGIN()/QK_IRQ_END(). - -#if defined __IAR_SYSTEMS_ICC__ - FIQ -#elif defined __TI_ARM__ - #pragma CODE_STATE(32) - #pragma INTERRUPT(FIQ) -#else - #error Unsupported compiler -#endif -void sciHighLevel(void) { - uint32_t vec = scilinREG->INTVECT0; - if (vec == 11U) { // SCI receive interrupt - std::uint32_t b = scilinREG->RD; - QP::QS::rxPut(b); - } -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // configure the LEDs - gioInit(); - LED2_PORT->DIR |= (1U << LED2_PIN); // set as output - LED3_PORT->DIR |= (1U << LED3_PIN); // set as output - - // configure the Buttons - SWB_PORT->DIR &= (1U << SWB_PIN); // set as input - - // initialize the random seed - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_rtiCompare0); - QS_OBJ_DICTIONARY(&l_ssiTest); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} - -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // instantiate and start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - LED2_PORT->DSET = (1U << LED2_PIN); - } - else { - LED2_PORT->DCLR = (1U << LED2_PIN); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - //LED2_PORT->DSET = (1U << LED2_PIN); - } - else { - //LED2_PORT->DCLR = (1U << LED2_PIN); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // lock the scheduler around l_rnd up to the (N_PHILO + 1U) ceiling - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO + 1U); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); // unlock sched after accessing l_rnd - - return (rnd >> 8U); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - rtiInit(); // configure RTI with UC counter of 7 - rtiSetPeriod(rtiCOUNTER_BLOCK0, - (uint32)((RTI_FREQ*1E6/(7+1))/BSP::TICKS_PER_SEC)); - rtiEnableNotification(rtiNOTIFICATION_COMPARE0); - rtiStartCounter(rtiCOUNTER_BLOCK0); - - VIM_RAM[2 + 1] = (t_isrFuncPTR)&rtiCompare0; // install the IRQ - vimREG->FIRQPR0 &= ~(1U << 2); // designate interrupt as IRQ, NOTE0 - vimREG->REQMASKSET0 = (1U << 2); // enable interrupt - - VIM_RAM[21 + 1] = (t_isrFuncPTR)&ssiTest ; // install the IRQ - vimREG->FIRQPR0 &= ~(1U << 21); // designate interrupt as IRQ, NOTE0 - vimREG->REQMASKSET0 = (1U << 21); // enable interrupt - - QF_INT_ENABLE_ALL(); // enable all interrupts (IRQ and FIQ) -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - LED3_PORT->DSET = (1U << LED3_PIN); - LED3_PORT->DCLR = (1U << LED3_PIN); - QF_INT_ENABLE(); - -#ifdef Q_SPY - QS::rxParse(); // parse all the received bytes - - //if (sciIsTxReady(scilinREG)) { - if ((scilinREG->FLR & (uint32)SCI_TX_INT) != 0U) { // is TX empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - //sciSendByte(scilinREG, b); - scilinREG->TD = b; // put into the TD register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-R MCU. - // - _gotoCPUIdle_(); // wait for interrupt -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - sciInit(); - VIM_RAM[13 + 1] = (t_isrFuncPTR)&sciHighLevel; // install the ISR - vimREG->FIRQPR0 |= (1U << 13U); // designate interrupt as FIQ - vimREG->REQMASKSET0 = (1U << 13U); // enable interrupt - - return 1U; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return rtiREG1->CNT[0].FRCx; // free running RTI counter0 -} -//............................................................................ -//! callback function to execute a user command -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((scilinREG->FLR & (uint32)SCI_TX_INT) == 0U) { - } - scilinREG->TD = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - systemREG1->SYSECR = 0U; // perform system reset -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The FIQ-type interrupts are never disabled in this QP port, therefore -// they can always preempt any code, including the IRQ-handlers (ISRs). -// Therefore, FIQ-type interrupts are "kernel-unaware" and must NEVER call -// any QP services, such as posting events. -// -// NOTE1: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd b/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd deleted file mode 100644 index 40d510b62..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp b/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp deleted file mode 100644 index b135a5c38..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3379 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - launchxl2-tms57012 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\dabort.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\esm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\exceptions.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\gio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\notification.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\pinmux.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\rti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sci.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_core.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_intvecs.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_mpu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_phantom.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_selftest.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_startup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_vim.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\system.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww b/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf b/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf deleted file mode 100644 index 46b1bf98b..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,46 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; -define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x1000; -define symbol __ICFEDIT_size_svcstack__ = 0x100; -define symbol __ICFEDIT_size_irqstack__ = 0; -define symbol __ICFEDIT_size_fiqstack__ = 0x100; -define symbol __ICFEDIT_size_undstack__ = 0x100; -define symbol __ICFEDIT_size_abtstack__ = 0x100; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define symbol __region_DRAM_start__ = 0x80000000; -define symbol __region_DRAM_end__ = 0x83FFFFFF; -define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; -define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; -define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; -define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; -define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvecs }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, - block UND_STACK, block ABT_STACK, block HEAP }; -place in DRAM_region { section DRAM }; \ No newline at end of file diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.ccsproject b/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.ccsproject deleted file mode 100644 index 47581724f..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.cproject b/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.cproject deleted file mode 100644 index 32a75a210..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.cproject +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.project b/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.project deleted file mode 100644 index 878762dac..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qk/ti/.project +++ /dev/null @@ -1,79 +0,0 @@ - - - dpp-qk - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QK - 2 - PARENT-5-PROJECT_LOC/src/qk - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.hpp - 1 - PARENT-2-PROJECT_LOC/bsp.hpp - - - dpp.hpp - 1 - PARENT-2-PROJECT_LOC/dpp.hpp - - - launchxl2-tms57012 - 2 - PARENT-5-PROJECT_LOC/3rd_party/launchxl2-tms57012/ti/source - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qspy-output.png b/examples/arm-cr/dpp_launchxl2-tms57012/qspy-output.png deleted file mode 100644 index ee764450fc698007b726222ee98e0c4ff8a2347d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30404 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

48s!6PLv3#1J$zTBSi{a{Ql)}O! zrDpT2z@_C!k69H`L!9)4Ro-`l$OaTx^zzyVv;+ipxH|~DEff676=f`NNVV1NNnf<~ zt6yKt_*B#>IO#@hlaa(?@hNG_@)>Yy=q~Yc+ap?F>ckVt#OUrW0`E9-a{-g%I&rcB zGE1c(WYuxLTKn2Ng>SiG?AA;NK`Y?B_Ct!ex|7u1FU?UQHr+Z}H`!Q~<`hEFVs7a* zPu$RwZ0lHm$*(wRT=bGuqqUc^$bBKESG(NOEyr*$bfb;gBvam3;zgZs9ljpM&^y+u zO^;gT`oF%pcXUanENDjz`b7d*sB~U+(HW!+K?F}U43%V(VJ5xkYe3qtU8lX|AmQ_` z*g_M2=yro#YO=D9#gaEp)U|I+N*sUgWZ7%xoBtPr{0ArAPt!5o=B0w$Mr-;(Lz(?E zgaeAY$w-6tawFusOmI;Zr_&zbUl6I&i#(=}I)#(N=}AZRD(4kF3A8WtrI;y%W=2_P zT#nK=!e_s2DyCee_H2%OSmyWRL(!<`YEQ)HukA!zuhm@B>Noeho!G}5jLZBvSQ@F` zs?-PIr%dWl0tJNlN#Uy3)4$X#rjTaGzT;&D&xb87s8vKUNMAdeoo87M`Rf}ItDYK+ z|1wf-%0rU5!y+GH-hY?T{;crZcis3mlv_{~P#15sHP&8jTly07Sz(2RYwXQRLX%+8 z+Q=#mamG9Vkp-rbVml&(kImrDioeZ9t;R0Q({PH(xYL_#@4b{Et{~0uK7~OrFRjk^ zoOx@Prs6VsXl;Y3Yo&oTE`rBzgQ#Ib+=jODr(Fs{iA9=mDMJH>FzgTDm{Y$@|+Yl6_XaQYAA=TR}4KHJJ zo%@p28&87MJT9TD-=wIp1GTR_S63wE160;4m~-x71@>}}W-OM@lutIW`JvSfH%?Vj zaf?;SzYJ~1$hT@vN~YTQU5*a@iyK3}-(N~@_bi1j&f zz3w|v(I6}NDmx}Yzx{d_^!FUy=4C)#5)cV`VP(8JB>ayo>J5$i!+HDUC33f8*AMS9 ze)C&-`Y%X#90xApz(7%JWa5tQIj04K+Vb^{F5HBaUskkh=5izO1hbjt`=h^g^D8?K z$DE?q#lxl3AjWpRcak=nB_H@=vw_?;fgo;{>LaXJDN zvh`-#AD0S;OMU58TjsCH;>VEzKk5XGAf)9pdB^F{#DFu1W#Os&h98EGsc(`hQ~(KO z4MAxl;-ofX5iYyWN)?yLOY<105VLl%pP#K=?{k0XR~RgZWl$QuyYbsUI)m3FBKg}w z-Fu40jZ33}3}dzQ1;hD9h^HpQ+Bn9cDCe11UJ7C9;DA>oV32|aEK}N15EW&S8)+Wr zfaKpVO=jx}JyJJ${lmh1vJU{a3pN)HUxXddNFzHp@W7asZ|_~tnRv4}*&}X&-G_5u zS&8R=570>T1hb!;fgi0`7Lelhv+V)dg);9$E%s*5J|~jEQ}r#`q3N9ZPOa5 zt}h1-BXht|VoRUnT@B8T-Lyw&r6JuvN)14QmU(shHlwi__;nklF7In<+F!-}ToYiO za`w+U0it!HTNv|{x3K$assqY*}(+b}PR_X-xf&7))tcmw#~cIXR~x4KI* zWc072KDyA=+sDq7%`=1SPrq*at1lF*DcT4nL!TUtij2Bk%G6vl{0$K|n^ebk3dAUX zKQ=#a!coswR5PpX_i;1%mRBYspXpeXXDU{%_7j{M6c=T_x@bs`5{7n2>-^k5+FCAV znW%fpD=$nQoR2M}M7*xl%leGR+9A&fT;Z`E?=6^@6*g9;q{sXbuRLZLj4JxgiO_Y= z0*^nVEetKZwe|v`O`H$Sxt|e>Pq@K~Pr8I&u*bWQ<)+gnjXwd;8v`;GjwQ339(S8% zEP;Z9catl0#@d^v2-6Fl1@m^gM`cCgT~#xkwz)H6>TiK2q3fzHz#c#!dm5EL5~G52 zR21K3r5vL}gp~>E01suq(bCwjKEv-1g%8L3xD$*=YiX?+yzmE54XS z5rW4qj_RJBfTQa<`GMDoXXd%YGDqym(X>PB%^_ES$HY%)Nb_lcf}b!u;yUnHHza-J z3oAkt_Zj>44(@YB;X}97m7cp5*hp-lgTY`5hAo+ea@_y8`8n`wF`*u)@U(N!UmL(!qr=mK?)cqP^VmdzO>3NZExM4nu1jF zI2H1M|5=(*s9zu_8kFM*rg%PFqZ7m3N3iI&dJXl%L&b~E66*>K|3YEXNKedRe zFhVtbdL%O9K_}MR8ch+4`sc|uN^xg-;Thg6VQ$j~`<2dD6joOyX2dH)T*O5Q8lP+A zv8Xc$7U&FWpr3{En$v?U-}5oi&G1Hip#P1f{FNJa=@Ag|7C-{tN-QZn1SCk(?|VfB z!N~cXJ!ME;tXuvbFYO{C-LP7_x1gls#io3!5rVJiMJPT30{%!nDKIUCQ623H09|7tCp*sho+?=?7yTVmXni3_;7W*P0^dnqpOa|M+iB;TJs~>YMN3OeVu}i zO&o4We4w`hrZqr{EDYMHvuh=|?y8ak=S!DymJLDJEs9PHZLs>3RI_f?ID+U8h+h3h zSmQKE+AnH-SMXQD_DdPE5)CIwhbD+V43q2r-VMN??#b29htEIX`5_;5^R((~5RYA| zV5C;?K3+NGCLxYKY+pZETxJ*OFIsqj3<|Kf z+*^}%bQM1^>-Lq@=uZt-NhRvhe%i}nX>lxigG8hk(O`~@iK5G<9O%vcuhfU{=$zzS@YrJ3pRlgamltLvDX z*Au1g9_O++9d2V0s+5;K@qe@NpZE)T zD3dCsF86%t?l$x=F)nA9v?%!>OHnXkZ5p3_b6_)!IsjDuEwmw- z3<_i_hQKU}_4Eh|-5;f*qOCF?j|z>Y6OW07bp*Q>XHl*I1fZrd7S%{g$*@TArtUra z^#1X3t3EpWMAz;@F8T(p!@_GS&P;M5L`V3*G1GQ<(V;+eO|S$1%xS{?)@X+@Jw7wL z>ej9Q+t~J671I_xYCQf0Zd!-R30?smECs0wkdBBk_HzDwCImr$VDCAO4S z4AZ(+^z~l9WFiZ+S}UQLEDQ^cLkVZ1di2YGwpeT)!~S6QU}gg)a*mI{Vyxdb(Df!x zwZdMFF@MpW-)*sBiH@e+>?1#qm(xyXTkma5q(p-lObOLD) z-EA!ZNp|42;h#)X93tV3wN~+hsV5}bk(+XnA_I>ANwZ);}Wu)Mh zlAHd8zrR-IrN+~vQVmt*b%PrP=ICep=%=P-S1gcMR^?79VDn#mr>k!f8H3(U{7E`7syjkj8qz-z&asE zutJNR(rju5`nc#Z5lhfv{lCp^Cis_{o+56bHIHZ_i#am+NC1^QNj;A}Kp3d?1xLN@buJ5X@6Asd31jce_DDrB6aUr=wMdY2AHR;wE-FYY2h$MwqC55?9b4 z1i8QW>gDGhz`oV~DJWx_+jwYz%2Hh9%3opI z%ddaf;dPPTWn?2$TYIWstDP>!Vfdz-;^iDFUtVi0YEXg+M7hTCMF40LGdW1;3d{r- zq7U=#p)2+;0KO&MD?40hx!Tuo(AuV=V^DGWyof=b|IoHc01|q%$`Gf_#p~aH&f*F* zv(WuE6@k_<9ih*ZjExZCwRUhE7n%Z`(vCI{q8RjVr!C%BAHEq5O>G0+Z<%!*0<$37 zJmPmHS9*Lx@*VDpE-LxM^5={eoI$FVnONI3y4{)(jaT~jE~}jLfsWi0)o!|rMR5W( zQif$-(W#F*bNKCbHK{qC9(wa;Cbv(UhdV>8J60q|zlEJ}jzwg6)hy{{)(6X7b^b&X z>urR%%lRhoLFTPGniIkk#Rji~K~W~dBG~F9p{NqHCZ?5Kf(NWRulOpi|B3uaqxVvE zb$KW1{k~J^utBAAj^b0E{!mCOv}8TK7U$inpQ(%^zf9Ua zWYOkm2LMXCi-}XhS`e)CE&~1V_K9_Jr+T!eyA`-=JGS6YVa+bf$!nH4f4WxqV0 zSW)jO>Yj{LWxM`_Q>Savm+jT$y|mfB&nK<|jlx+Xb%YxxsstXyx&1Z~@Vl8inkAhJ zB{gV2wW5zC?Bs$^Bn9sdoTXbD@EvbvpQjzSW-J_RU(Bdu@_NNd#MGE1DJNp&P5J19t6M(o)pQ9Efoeuo4~6EzpA( zmo~2@{~I5U3C`s}ulM&TBQ8{g1Ah&0Tvu4<*LgjvZOJckdL=$Adk!spFc6iKtAXQj zfM>9xgQ0{~bb;J2?;>6SqH7ndUbQBwPw@^8Iy`8*)8G8)qRz(nI_}g0N4USgWs<&5 zSt;hvV5)nz&yRLv2tAuS^HcT1mV{qgiGKo>ru{&fVo}xE#b*D8iB@9)qk0(7&i~~S z0LnK!agtT9^YwX_vNPa7-)YB;kJ9~SWAt+mxlwAlxd#=%>{~zEIMp0H`aEK*MJD{3 zOO#`V#@96}C1C@K%YYR&3PW|yDiNN8vPlTJn3ubLVW)>ALjz?JWs z;@dn_wBeneq#Szjxl4V0y*`pmh1?JeZI#rM+~@3G--*x`Fgq(q*?tk;PD`p_QZ|st zLRqNq{J4JRns_NoY2gPhDg-m>Lpg(u$Yh_2-IHfvD!bYA!JYssqNEkx&cKA?+Zq1x z$<1ZFaxARAFefAOR3(>xR80Zhq$eR7-!<--6?OxQHQR?;H&j_9Fnus=O2uMFDdsA zsi}y#vOht`S}8t`i;K2?3{B+K^n?GqWi}1A%=qHP(3w?Z4kAF`9tSID z)@8&~-s1kn*zwaAnyHN}J22UZH>{^5GEH@4Nw+{rdkYR^UW;J_rWHR(z+tymx)Mnx$WW7W#l@qlp z7Lt9`_xAZZxRn5NQ_tg!v*-`KU$V^H&=CcjQ^s%~X}dtB^rym`aT~-bm3xK%g!gR~ z*KPz;X-c(Sa<4y6eAdyzd~fbJyqt<^s%iWbSZ2e@IfZU8?&jQ?lhl#@W#RVGbJhL* zD)N2SoIM;o##{^Y0CVgWNFPGngd%pou}%Gk^J7P|Z-?=8L?QkPFSxAuMuPilYXb|k zjN=ccw;6Cs^w5#5W!#iqVkcUiz78$gSVAFaBUGAXzrun4$`U{lw2X1Pzeqv~cy_Q` zI(o|VR_A_c!mkLa-*~+~H2ga24R=bxDUFx6_GzdGr18c%SNdqmSC}oiWaojmSNLT- zIZJDX6Z|Y2SQkypVt=f(@=%A(J%LKSg&lG%2JD`H{QK><6L3ob_M7wjax!@Ky665G zMU(C90d|rHzBH)G(Q3zqd=f>!qbVh7b~6}^=vL0PEQ&xyp^|nA(Wo(wUzx3eK(-m{+x!^?UO(!H*e9@&J_!j z3oL<`s>0u~3n*Mgm;{WGzwG*7?46_TD{j=8%***^mA`{dkej_9Ccb{#UTn+gt zV7Wg=b6a>{_vIpnN_RW9HdVEnQgaiHgB$ey`^v@Or_Y$?U!aWn@eKTZf!* zWr4Ud5isGdW9RbfGJ2tA!$$mowb=+Sp%sdGMTq(b?jS%bR?dOk%dese8?$|}0NE=i zwgFaPTmBp?@mXd8^%;m42S~*cGk8CV=;dUMKN}{482sG+3%fClg0NfvrHgOa%c^fR ztn+j=f83ouDHB=x-1umZ!U`@tJt})QI=K|wryw(gDk(%MKyb=2)8?q>8YMbdH7_|<34`AdXuWX3hW~Md?&q+y-3aQf!30HN-!AJm6MJy z#5sHp{D*oo*ru1paGUSZ{=_h$V_?n)K#lYY+JM|OpkY>9a`+1#_Kr!EFi)ZDc1lg~{9_vGqb zk}c#8kOEB+VGs}@ZY|LIO1kge>$i0;+rMc@c7=4tne9L;#KlzB6p$7jtl(l#X!Kzd z%c2xi18dp#BPIyWC)zReI4E0Ve8!I5pwAVRtBBDfWC} zjVo`(AZH{r%0ZQW$B9!&<(6h39_F(UgqL8Fx%*hyPBpb-tZzvm@`Dd<$#Yy~MOM+6 zv2q0Xn11SPz4Vn!T_fhsn9HlXfhcl!j;i@?9?Rd&no{)WVlG_yZb^GLv-6M0+62&# zZC79v{GV8^zV3_zCfhG^BmT}e>3%@^5oYip!MbcN!>jj@Y*(%bC#%p~0UpTLK+@>W zpbB{{qv&siWzsQF>Zk7CW@QJR;*k8>VzCPWwi<$E}0>&A_C;^OvS zN#M;vUQIirR9?8j5=Gmj`kG%CQFi0--Bo{9@6~1zMpH-%DbZ?FkC8UaTPl%O^)O-p z?d40X2ie*y&0yErt|H%Fkl_z6Z*Sw^7au%-aqIjQMx&CoXmYSoCxf0S_FIDTl0KUaa-S6WJN-zA1>LqF(bUanakAmPDMVAQW;NBA^# z6dzH&uEPW#xse>E5uq@#$ik|oWh zyn$0Ufr!uMjxJy_+A>g$rnJ$0Pg1XuPwg-uzS|QA;!w23osyVlcd(F7oddz2TItpWDP!3^dOUM zLCV8bkd*n)zjvVhe;yY=qu$!>eL@5GQ`9@isKxT_n;p!36TuGHFY& zzD_&C*k#N-tgVDa)BXx8=$fAW`ZnWN*jbzQ2qt7{K4Xz=KrV|q?lKyQF}x&KOW(m3 zSF6Wdy>d)KbdZ;P{8=KLmUOABE_d-tZiCHL&Yf%s1Qp`T(yp_%=9X)UvPkx4A_qm>qS55b1Ss8-kR(%{?15nJk)CvDQo~b5 zeJm_z_X#t>xnkAwbd?j-n_r+l3(CYrXXX!-uw~WrMY2r0L&d9!Ke!W#!r&_5ks36v zGST*N7}42s#=!2)gpP8f+XMGZ-X#W*9=fXo>b$gKX;p?5C~K)U!7w(N)+3Az+}X1n zFsatIxXVIG3Jmb4Ia_XLvxwNGhtqZpDNsuCC9y2*tgLEKTTMM@+THeW^Ujw3`mN!~ zGI~~^Y-zQ%5ro^kBpJ%RSFkOHcY=|iC>A7VE}v_HUfPHsB<-P{hE_D~2q zCT8}Xi*HXXDI-hl#RB;s3;O9CdM2#!C^Ia(#0@SChjd_EeWgr$X+a4FDTTs*BuT?a z(~#O!_hYc(!*goTzfVp&hRA18mi)H>T^eL3ivEF?`heaa5)y;d^0O9?ThDS z?Dvca^*aM4nejS5HT+$=IWqqiZEViLaHVK?`*!3 zT=#lNRjOQSk^xdZ<^Us$_)ZdiA!8^UFt`osvtE(MIqGo<^##6DI~8cv$?J?>-jfQ8+Ti2qig|93#tl?@Dtf|7|ym=t)jUPfT+4rxZ- zQMJhv*MV1!d^{WaB?ABEIkz>aUiz0riw*`9zS34d`W{b*IEb6^69IRx za(lmdigNV*)wIVo*94)F30FXo?c%pVe)0F_$e1+!*unnEq)-^YrFl4ZjsE7Y-P-XS z31WWv$@JrSXxMybI;eXHaD7xa+{3>~f9;P)o*0Od10+<*tB+ys5q^kv#$60;+o)%4 zRy5fq9h#Ov*#0H6!?fbB^^I4DNv9j&JAdR2i_~a3R=zP-1ZvVYU#>Rq)DQ(;*~T|Q z`(z}mJ~7{Dqsdm*U-g}#Ldaj=95n3;k z8%3j(_wDvNz~FXjuCLhs6!?$YLqL3r^12QBH@m^-3DNwcI=^&V@RNxcv*9vvWO}N+ wJ4c*?fxom~(6s+Jz(Y5*Cb*F$@S7$m!81QBzmWpmee;Z}l9nP)-YV$-0oWw=`~Uy| diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/bsp.cpp b/examples/arm-cr/dpp_launchxl2-tms57012/qv/bsp.cpp deleted file mode 100644 index 0af6350d7..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/bsp.cpp +++ /dev/null @@ -1,446 +0,0 @@ -//============================================================================ -// Product: "DPP" on LAUCHXL2-TMS570LS12 board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "sys_common.h" -#include "sys_core.h" -#include "sys_vim.h" -#include "system.h" -#include "gio.h" -#include "rti.h" -#include "het.h" -#include "sci.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED2_PIN {1U}; -constexpr gioPORT_t *LED2_PORT {gioPORTB}; - -constexpr std::uint32_t LED3_PIN {2U}; -constexpr gioPORT_t *LED3_PORT {gioPORTB}; - -// NOTE: Switch-A is multiplexed on the same port/pin as LED3, -// so you can use one or the other but not both simultaneously. -// -//constexpr std::uint32_t SWA_PIN {2U}; -//constexpr gioPORT_t *SWA_PORT {gioPORTB}; - -constexpr std::uint32_t SWB_PIN {15U}; -constexpr hetBASE_t *SWB_PORT {hetREG1}; - -constexpr t_isrFuncPTR *VIM_RAM {reinterpret_cast(0xFFF82000U)}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_rtiCompare0 = { 0U }; - static QP::QSpyId const l_ssiTest = { 0U }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -//............................................................................ -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - systemREG1->SYSECR = 0; // perform system reset - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs used in this project =============================================== -// The QV kernel can use the standard interrupt implementation generated -// by the HALCoGen. Here the RTI COMPARE0 is handled in a "notification" -// function called from rtiCompare0Interrupt() in the rti.c module. -// -void rtiNotification(uint32 notification) { - - rtiREG1->INTFLAG = 1U; // clear the interrutp source - QP::QTimeEvt::TICK_X(0U, &l_rtiCompare0); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~SWB_PORT->DIN; // read SWB - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & (1U << SWB_PIN)) != 0U) { // debounced SWB state changed? - if ((current & (1U << SWB_PIN)) != 0U) { // SWB depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_rtiCompare0); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_rtiCompare0); - } - } -} -//............................................................................ -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QP-unaware" meaning that it does not interact with -// the QP and is not disabled. - -#if defined __IAR_SYSTEMS_ICC__ - FIQ -#elif defined __TI_ARM__ - #pragma CODE_STATE(32) - #pragma INTERRUPT(FIQ) -#else - #error Unsupported compiler -#endif -void sciHighLevel(void) { - uint32_t vec = scilinREG->INTVECT0; - if (vec == 11U) { // SCI receive interrupt - std::uint32_t b = scilinREG->RD; - QP::QS::rxPut(b); - } -} -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - - -//============================================================================ -namespace BSP { - -void init() { - // configure the LEDs - gioInit(); - LED2_PORT->DIR |= (1U << LED2_PIN); // set as output - LED3_PORT->DIR |= (1U << LED3_PIN); // set as output - - // configure the Buttons - SWB_PORT->DIR &= (1U << SWB_PIN); // set as input - - // initialize the random seed - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_rtiCompare0); - QS_OBJ_DICTIONARY(&l_ssiTest); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick - QS_LOC_FILTER(-(APP::N_PHILO + 3U)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio/pthre. see NOTE1 - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - LED2_PORT->DSET = (1U << LED2_PIN); - } - else { - LED2_PORT->DCLR = (1U << LED2_PIN); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - //LED2_PORT->DSET = (1U << LED2_PIN); - } - else { - //LED2_PORT->DCLR = (1U << LED2_PIN); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: no need to protect shared 'l_rndSeed' in the QV kernel - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - rtiInit(); // configure RTI with UC counter of 7 - rtiSetPeriod(rtiCOUNTER_BLOCK0, - (uint32)((RTI_FREQ*1E6/(7+1))/BSP::TICKS_PER_SEC)); - rtiEnableNotification(rtiNOTIFICATION_COMPARE0); - rtiStartCounter(rtiCOUNTER_BLOCK0); - - QF_INT_ENABLE_ALL(); // enable all interrupts (IRQ and FIQ) -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // NOTE: called with interrupts DISABLED, see NOTE3 - LED3_PORT->DSET = (1U << LED3_PIN); - LED3_PORT->DCLR = (1U << LED3_PIN); - -#ifdef Q_SPY - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - QF_CRIT_EXIT_NOP(); - - //if (sciIsTxReady(scilinREG)) { - if ((scilinREG->FLR & (uint32)SCI_TX_INT) != 0U) { // is TX empty? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - //sciSendByte(scilinREG, b); - scilinREG->TD = b; // put into the TD register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-R MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - sciInit(); - VIM_RAM[13 + 1] = (t_isrFuncPTR)&sciHighLevel; // install the ISR - vimREG->FIRQPR0 |= (1U << 13U); // designate interrupt as FIQ - vimREG->REQMASKSET0 = (1U << 13U); // enable interrupt - - return 1U; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return rtiREG1->CNT[0].FRCx; // free running RTI counter0 -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((scilinREG->FLR & (uint32)SCI_TX_INT) == 0U) { - } - scilinREG->TD = b; - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - systemREG1->SYSECR = 0U; // perform system reset -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE0: -// The FIQ-type interrupts are never disabled in this QP port, therefore -// they can always preempt any code, including the IRQ-handlers (ISRs). -// Therefore, FIQ-type interrupts are "kernel-unaware" and must NEVER call -// any QP services, such as posting events. -// -// NOTE1: -// The QV::onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd b/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd deleted file mode 100644 index 40d510b62..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp b/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp deleted file mode 100644 index 956f4d249..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3388 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - launchxl2-tms57012 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\dabort.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\esm.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\exceptions.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\gio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\notification.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\pinmux.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\rti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sci.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_core.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_intvecs.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_mpu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_phantom.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_pmu.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_selftest.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_startup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\sys_vim.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\launchxl2-tms57012\iar\source\system.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cr\qv\iar\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww b/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf b/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf deleted file mode 100644 index 46b1bf98b..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,46 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; -define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x1000; -define symbol __ICFEDIT_size_svcstack__ = 0x100; -define symbol __ICFEDIT_size_irqstack__ = 0; -define symbol __ICFEDIT_size_fiqstack__ = 0x100; -define symbol __ICFEDIT_size_undstack__ = 0x100; -define symbol __ICFEDIT_size_abtstack__ = 0x100; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define symbol __region_DRAM_start__ = 0x80000000; -define symbol __region_DRAM_end__ = 0x83FFFFFF; -define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; -define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; -define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; -define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; -define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvecs }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, - block UND_STACK, block ABT_STACK, block HEAP }; -place in DRAM_region { section DRAM }; \ No newline at end of file diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.ccsproject b/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.ccsproject deleted file mode 100644 index 47581724f..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.cproject b/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.cproject deleted file mode 100644 index 14656c535..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.cproject +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.project b/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.project deleted file mode 100644 index eeb31420a..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qv/ti/.project +++ /dev/null @@ -1,79 +0,0 @@ - - - dpp-qv - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - QV - 2 - PARENT-5-PROJECT_LOC/src/qv - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.hpp - 1 - PARENT-2-PROJECT_LOC/bsp.hpp - - - dpp.hpp - 1 - PARENT-2-PROJECT_LOC/dpp.hpp - - - launchxl2-tms57012 - 2 - PARENT-5-PROJECT_LOC/3rd_party/launchxl2-tms57012/ti/source - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp.py b/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp.py deleted file mode 100644 index 82567887c..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp1.py b/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp1.py deleted file mode 100644 index 5b0fe6726..000000000 --- a/examples/arm-cr/dpp_launchxl2-tms57012/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_DWN.gif b/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_UP.gif b/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/eating.gif b/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/hungry.gif b/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/thinking.gif b/examples/arm-cr/dpp_launchxl2-tms57012/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.cpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.cpp deleted file mode 100644 index 6e0b201b2..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.cpp +++ /dev/null @@ -1,481 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-H743ZI board, embOS RTOS kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeH7 include files -//#include "stm32h7xx_it.h" - -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -static OS_TICK_HOOK l_tick_hook; -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QS source IDs - static QP::QSpyId const l_embos_ticker = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up LED - BSP_LED_On(LED1); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -//............................................................................ -#ifdef Q_SPY - -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the FreeRTOS or QP and is not disabled. Such ISRs don't need to call -// portEND_SWITCHING_ISR(() at the end, but they also cannot call any -// embOS or QP APIs. -void USART3_IRQHandler(void); // prototype -void USART3_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0U) { - std::uint32_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } -} -#endif // Q_SPY - -// Application hooks used in this project ==================================== - -// embOS application hooks ================================================= -static void tick_handler(void) { // signature of embOS tick hook routine - - // process time events at rate 0 - QP::QTimeEvt::TICK_X(0U, &l_embos_ticker); - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_KEY); // read the Key button - std::uint32_t tmp = buttons.depressed; // save debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced Key button state changed? - if (current != 0U) { // is PB0 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_embos_ticker); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_embos_ticker); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif -} - -//............................................................................ -// OS_Idle() function overridden from RTOSInit_STM32F4x_CMSIS.c -// -// Function description -// This is basically the "core" of the embOS idle loop. -// This core loop can be changed, but: -// The idle loop does not have a stack of its own, therefore no -// functionality should be implemented that relies on the stack -// to be preserved. However, a simple program loop can be programmed -// (like toggling an output or incrementing a counter) -// -void OS_Idle(void) { - while (1) { - - // toggle the User LED on and then off, see NOTE2 - QF_INT_DISABLE(); - BSP_LED_On(LED3); - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QP::QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - uint16_t b = QP::QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif - } -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: VFP (hardware Floating Point) unit is configured by embOS - - // enable clock for to the peripherals used by this application... - SCB_EnableICache(); // enable I-Cache - SCB_EnableDCache(); // enable D-Cache - - // configure Flash prefetch and Instr. cache through ART accelerator -#if (ART_ACCLERATOR_ENABLE != 0) - __HAL_FLASH_ART_ENABLE(); -#endif // ART_ACCLERATOR_ENABLE - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_embos_ticker); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][APP::N_PHILO]; - static OS_STACKPTR int philoStack[APP::N_PHILO][128]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - Q_PRIO(n + 3U, 3U), // QP-prio., embOS prio. - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStack[n], // stack storage - sizeof(philoStack[n])); // stack size [bytes] - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static OS_STACKPTR int tableStack[128]; - APP::AO_Table->start( - Q_PRIO(APP::N_PHILO + 7U, 7U),// QP-prio., embOS prio. - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStack, // stack storage - sizeof(tableStack)); // stack size [bytes] -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - OS_TASK_EnterRegion(); // lock embOS scheduler - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - OS_TASK_LeaveRegion(); // unlock embOS scheduler - - return (rnd >> 8); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED3); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED3); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - OS_TICK_AddHook(&l_tick_hook, &tick_handler); - -#ifdef Q_SPY - NVIC_SetPriority(USART3_IRQn, 0U); // kernel unaware interrupt - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = USART3; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // return failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - // NOTE: wait till QF::onStartup() to enable UART interrupt in NVIC - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TX FIFO has data to transmit - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - // place the byte in the UART TDR register - l_uartHandle.Instance->TDR = b; - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.hpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.hpp deleted file mode 100644 index be2d68e87..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -// embOS tick rate -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.hpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.qm b/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile deleted file mode 100644 index 142ff1edb..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile +++ /dev/null @@ -1,329 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI, embOS RTOS, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/embos - -# list of all source directories used by this project -VPATH = \ - SEGGER \ - Setup \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = \ - -I.. \ - -I../.. \ - -ISEGGER \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/embOS-gnu/Start/Inc \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - JLINKMEM_Process.c \ - OS_Error.c \ - RTOSInit_STM32H7xx.c \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QP_ASMS := - - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -L$(QPCPP)\3rd_party\embOS-gnu\Start\Lib -LIBS := -losT7VLR - -# defines -DEFINES := -DSTM32H743xx -DUSE_HAL_DRIVER -DUSE_STM32H7XX_NUCLEO_144 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER.h deleted file mode 100644 index 1be626042..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER.h +++ /dev/null @@ -1,231 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER.h -Purpose : Global types etc & general purpose utility functions. -Revision: $Rev: 22733 $ -*/ - -#ifndef SEGGER_H // Guard against multiple inclusion -#define SEGGER_H - -#include // For va_list. -#include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32 - -#if defined(__cplusplus) -extern "C" { /* Make sure we have C-declarations in C++ programs */ -#endif - -/********************************************************************* -* -* Keywords/specifiers -* -********************************************************************** -*/ - -#ifndef INLINE - #if (defined(__ICCARM__) || defined(__RX) || defined(__ICCRX__) || defined(__ICC430__)) - // - // Various known compilers. - // - #define INLINE inline - #else - #if defined(_MSC_VER) - #if (_MSC_VER >= 1200) - // - // Microsoft VC6 and newer. - // Force inlining without cost checking. - // - #define INLINE __forceinline - #endif - #elif defined(__GNUC__) || defined(__clang__) || defined(__SEGGER_CC__) - // - // Force inlining with GCC & clang. - // - #define INLINE inline __attribute__((always_inline)) - #elif defined(__CC_ARM) - // - // Force inlining with ARMCC (Keil). - // - #define INLINE __inline - #endif - #endif -#endif -#ifndef INLINE - // - // Unknown compiler. - // - #define INLINE -#endif - -/********************************************************************* -* -* Function-like macros -* -********************************************************************** -*/ - -#define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0])) -#define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b)) -#define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b)) - -#ifndef SEGGER_USE_PARA // Some compiler complain about unused parameters. - #define SEGGER_USE_PARA(Para) (void)Para // This works for most compilers. -#endif - -#define SEGGER_ADDR2PTR(Type, Addr) (/*lint -e(923) -e(9078)*/((Type*)((PTR_ADDR)(Addr)))) // Allow cast from address to pointer. -#define SEGGER_PTR2ADDR(p) (/*lint -e(923) -e(9078)*/((PTR_ADDR)(p))) // Allow cast from pointer to address. -#define SEGGER_PTR2PTR(Type, p) (/*lint -e(740) -e(826) -e(9079) -e(9087)*/((Type*)(p))) // Allow cast from one pointer type to another (ignore different size). -#define SEGGER_PTR_DISTANCE(p0, p1) (SEGGER_PTR2ADDR(p0) - SEGGER_PTR2ADDR(p1)) - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -#define SEGGER_PRINTF_FLAG_ADJLEFT (1 << 0) -#define SEGGER_PRINTF_FLAG_SIGNFORCE (1 << 1) -#define SEGGER_PRINTF_FLAG_SIGNSPACE (1 << 2) -#define SEGGER_PRINTF_FLAG_PRECEED (1 << 3) -#define SEGGER_PRINTF_FLAG_ZEROPAD (1 << 4) -#define SEGGER_PRINTF_FLAG_NEGATIVE (1 << 5) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -typedef struct { - char* pBuffer; - int BufferSize; - int Cnt; -} SEGGER_BUFFER_DESC; - -typedef struct { - unsigned int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size. - void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed. - void (*pfClean) (void *p, unsigned long NumBytes); // Optional clean function for cached memory. - void (*pfInvalidate)(void *p, unsigned long NumBytes); // Optional invalidate function for cached memory. -} SEGGER_CACHE_CONFIG; - -typedef struct SEGGER_SNPRINTF_CONTEXT_struct SEGGER_SNPRINTF_CONTEXT; - -struct SEGGER_SNPRINTF_CONTEXT_struct { - void* pContext; // Application specific context. - SEGGER_BUFFER_DESC* pBufferDesc; // Buffer descriptor to use for output. - void (*pfFlush)(SEGGER_SNPRINTF_CONTEXT* pContext); // Callback executed once the buffer is full. Callback decides if the buffer gets cleared to store more or not. -}; - -typedef struct { - void (*pfStoreChar) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, char c); - int (*pfPrintUnsigned) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, U32 v, unsigned Base, char Flags, int Width, int Precision); - int (*pfPrintInt) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, I32 v, unsigned Base, char Flags, int Width, int Precision); -} SEGGER_PRINTF_API; - -typedef void (*SEGGER_pFormatter)(SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, const SEGGER_PRINTF_API* pApi, va_list* pParamList, char Lead, int Width, int Precision); - -typedef struct SEGGER_PRINTF_FORMATTER { - struct SEGGER_PRINTF_FORMATTER* pNext; // Pointer to next formatter. - SEGGER_pFormatter pfFormatter; // Formatter function. - char Specifier; // Format specifier. -} SEGGER_PRINTF_FORMATTER; - -typedef struct { - U32 (*pfGetHPTimestamp)(void); // Mandatory, pfGetHPTimestamp - int (*pfGetUID) (U8 abUID[16]); // Optional, pfGetUID -} SEGGER_BSP_API; - -/********************************************************************* -* -* Utility functions -* -********************************************************************** -*/ - -// -// Memory operations. -// -void SEGGER_ARM_memcpy(void* pDest, const void* pSrc, int NumBytes); -void SEGGER_memcpy (void* pDest, const void* pSrc, unsigned NumBytes); -void SEGGER_memxor (void* pDest, const void* pSrc, unsigned NumBytes); - -// -// String functions. -// -int SEGGER_atoi (const char* s); -int SEGGER_isalnum (int c); -int SEGGER_isalpha (int c); -unsigned SEGGER_strlen (const char* s); -int SEGGER_tolower (int c); -int SEGGER_strcasecmp (const char* sText1, const char* sText2); -int SEGGER_strncasecmp(const char *sText1, const char *sText2, unsigned Count); - -// -// Buffer/printf related. -// -void SEGGER_StoreChar (SEGGER_BUFFER_DESC* pBufferDesc, char c); -void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC* pBufferDesc, U32 v, unsigned Base, int Precision); -void SEGGER_PrintInt (SEGGER_BUFFER_DESC* pBufferDesc, I32 v, unsigned Base, int Precision); -int SEGGER_snprintf (char* pBuffer, int BufferSize, const char* sFormat, ...); -int SEGGER_vsnprintf (char* pBuffer, int BufferSize, const char* sFormat, va_list ParamList); -int SEGGER_vsnprintfEx (SEGGER_SNPRINTF_CONTEXT* pContext, const char* sFormat, va_list ParamList); - -int SEGGER_PRINTF_AddFormatter (SEGGER_PRINTF_FORMATTER* pFormatter, SEGGER_pFormatter pfFormatter, char c); -void SEGGER_PRINTF_AddDoubleFormatter (void); -void SEGGER_PRINTF_AddIPFormatter (void); -void SEGGER_PRINTF_AddBLUEFormatter (void); -void SEGGER_PRINTF_AddCONNECTFormatter(void); -void SEGGER_PRINTF_AddSSLFormatter (void); -void SEGGER_PRINTF_AddSSHFormatter (void); -void SEGGER_PRINTF_AddHTMLFormatter (void); - -// -// BSP abstraction API. -// -int SEGGER_BSP_GetUID (U8 abUID[16]); -int SEGGER_BSP_GetUID32(U32* pUID); -void SEGGER_BSP_SetAPI (const SEGGER_BSP_API* pAPI); -void SEGGER_BSP_SeedUID (void); - -// -// Other API. -// -void SEGGER_VERSION_GetString(char acText[8], unsigned Version); - -#if defined(__cplusplus) -} /* Make sure we have C-declarations in C++ programs */ -#endif - -#endif // Avoid multiple inclusion - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.c deleted file mode 100644 index d4569d40f..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.c +++ /dev/null @@ -1,2068 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT.c -Purpose : Implementation of SEGGER real-time transfer (RTT) which - allows real-time communication on targets which support - debugger memory accesses while the CPU is running. -Revision: $Rev: 23622 $ - -Additional information: - Type "int" is assumed to be 32-bits in size - H->T Host to target communication - T->H Target to host communication - - RTT channel 0 is always present and reserved for Terminal usage. - Name is fixed to "Terminal" - - Effective buffer size: SizeOfBuffer - 1 - - WrOff == RdOff: Buffer is empty - WrOff == (RdOff - 1): Buffer is full - WrOff > RdOff: Free space includes wrap-around - WrOff < RdOff: Used space includes wrap-around - (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): - Buffer full and wrap-around after next byte - - ----------------------------------------------------------------------- -*/ - -#include "SEGGER_RTT.h" - -#include // for memcpy - -/********************************************************************* -* -* Configuration, default values -* -********************************************************************** -*/ - -#if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #ifdef SEGGER_RTT_CB_ALIGN - #error "Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_BUFFER_ALIGN - #error "Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_PUT_CB_SECTION - #error "Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_PUT_BUFFER_SECTION - #error "Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_BUFFER_ALIGNMENT - #error "Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_ALIGNMENT - #error "Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif -#endif - -#ifndef BUFFER_SIZE_UP - #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host -#endif - -#ifndef BUFFER_SIZE_DOWN - #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) -#endif - -#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS - #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target -#endif - -#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS - #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target -#endif - -#ifndef SEGGER_RTT_BUFFER_SECTION - #if defined(SEGGER_RTT_SECTION) - #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION - #endif -#endif - -#ifndef SEGGER_RTT_ALIGNMENT - #define SEGGER_RTT_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE -#endif - -#ifndef SEGGER_RTT_BUFFER_ALIGNMENT - #define SEGGER_RTT_BUFFER_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE -#endif - -#ifndef SEGGER_RTT_MODE_DEFAULT - #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP -#endif - -#ifndef SEGGER_RTT_LOCK - #define SEGGER_RTT_LOCK() -#endif - -#ifndef SEGGER_RTT_UNLOCK - #define SEGGER_RTT_UNLOCK() -#endif - -#ifndef STRLEN - #define STRLEN(a) strlen((a)) -#endif - -#ifndef STRCPY - #define STRCPY(pDest, pSrc) strcpy((pDest), (pSrc)) -#endif - -#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP - #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 -#endif - -#ifndef SEGGER_RTT_MEMCPY - #ifdef MEMCPY - #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) - #else - #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) - #endif -#endif - -#ifndef MIN - #define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -#ifndef MAX - #define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif -// -// For some environments, NULL may not be defined until certain headers are included -// -#ifndef NULL - #define NULL 0 -#endif - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#if (defined __ICCARM__) || (defined __ICCRX__) - #define RTT_PRAGMA(P) _Pragma(#P) -#endif - -#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT - #if ((defined __GNUC__) || (defined __clang__)) - #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) - #elif (defined __ICCARM__) || (defined __ICCRX__) - #define PRAGMA(A) _Pragma(#A) -#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ - Var - #elif (defined __CC_ARM) - #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) - #else - #error "Alignment not supported for this compiler." - #endif -#else - #define SEGGER_RTT_ALIGN(Var, Alignment) Var -#endif - -#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) - #if ((defined __GNUC__) || (defined __clang__)) - #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var - #elif (defined __ICCARM__) || (defined __ICCRX__) -#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ - Var - #elif (defined __CC_ARM) - #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var - #else - #error "Section placement not supported for this compiler." - #endif -#else - #define SEGGER_RTT_PUT_SECTION(Var, Section) Var -#endif - -#if SEGGER_RTT_ALIGNMENT - #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) -#else - #define SEGGER_RTT_CB_ALIGN(Var) Var -#endif - -#if SEGGER_RTT_BUFFER_ALIGNMENT - #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) -#else - #define SEGGER_RTT_BUFFER_ALIGN(Var) Var -#endif - - -#if defined(SEGGER_RTT_SECTION) - #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) -#else - #define SEGGER_RTT_PUT_CB_SECTION(Var) Var -#endif - -#if defined(SEGGER_RTT_BUFFER_SECTION) - #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) -#else - #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var -#endif - -/********************************************************************* -* -* Static const data -* -********************************************************************** -*/ - -static unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ - -// -// RTT Control Block and allocate buffers for channel 0 -// -#if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #if ((defined __GNUC__) || (defined __clang__)) - SEGGER_RTT_CB _SEGGER_RTT __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); - static char _acUpBuffer [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)] __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); - static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)] __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); - #else - #error "Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned" - #endif -#else - SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); - SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer [BUFFER_SIZE_UP])); - SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[BUFFER_SIZE_DOWN])); -#endif - -static unsigned char _ActiveTerminal; - -/********************************************************************* -* -* Static functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _DoInit() -* -* Function description -* Initializes the control block an buffers. -* May only be called via INIT() to avoid overriding settings. -* -*/ -#define INIT() { \ - volatile SEGGER_RTT_CB* pRTTCBInit; \ - pRTTCBInit = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \ - do { \ - if (pRTTCBInit->acID[0] == '\0') { \ - _DoInit(); \ - } \ - } while (0); \ - } - -static void _DoInit(void) { - volatile SEGGER_RTT_CB* p; // Volatile to make sure that compiler cannot change the order of accesses to the control block - static const char _aInitStr[] = "\0\0\0\0\0\0TTR REGGES"; // Init complete ID string to make sure that things also work if RTT is linked to a no-init memory area - unsigned i; - // - // Initialize control block - // - p = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access control block uncached so that nothing in the cache ever becomes dirty and all changes are visible in HW directly - p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; - p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; - // - // Initialize up buffer 0 - // - p->aUp[0].sName = "Terminal"; - p->aUp[0].pBuffer = _acUpBuffer; - p->aUp[0].SizeOfBuffer = BUFFER_SIZE_UP; - p->aUp[0].RdOff = 0u; - p->aUp[0].WrOff = 0u; - p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; - // - // Initialize down buffer 0 - // - p->aDown[0].sName = "Terminal"; - p->aDown[0].pBuffer = _acDownBuffer; - p->aDown[0].SizeOfBuffer = BUFFER_SIZE_DOWN; - p->aDown[0].RdOff = 0u; - p->aDown[0].WrOff = 0u; - p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; - // - // Finish initialization of the control block. - // Copy Id string backwards to make sure that "SEGGER RTT" is not found in initializer memory (usually flash), - // as this would cause J-Link to "find" the control block at a wrong address. - // - RTT__DMB(); // Force order of memory accesses for cores that may perform out-of-order memory accesses - for (i = 0; i < sizeof(_aInitStr) - 1; ++i) { - p->acID[i] = _aInitStr[sizeof(_aInitStr) - 2 - i]; // Skip terminating \0 at the end of the array - } - RTT__DMB(); // Force order of memory accesses for cores that may perform out-of-order memory accesses -} - -/********************************************************************* -* -* _WriteBlocking() -* -* Function description -* Stores a specified number of characters in SEGGER RTT ring buffer -* and updates the associated write pointer which is periodically -* read by the host. -* The caller is responsible for managing the write chunk sizes as -* _WriteBlocking() will block until all data has been posted successfully. -* -* Parameters -* pRing Ring buffer to post to. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* >= 0 - Number of bytes written into buffer. -*/ -static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) { - unsigned NumBytesToWrite; - unsigned NumBytesWritten; - unsigned RdOff; - unsigned WrOff; - volatile char* pDst; - // - // Write data to buffer and handle wrap-around if necessary - // - NumBytesWritten = 0u; - WrOff = pRing->WrOff; - do { - RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime - if (RdOff > WrOff) { - NumBytesToWrite = RdOff - WrOff - 1u; - } else { - NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); - } - NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around - NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesWritten += NumBytesToWrite; - NumBytes -= NumBytesToWrite; - WrOff += NumBytesToWrite; - while (NumBytesToWrite--) { - *pDst++ = *pBuffer++; - }; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite); - NumBytesWritten += NumBytesToWrite; - pBuffer += NumBytesToWrite; - NumBytes -= NumBytesToWrite; - WrOff += NumBytesToWrite; -#endif - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0u; - } - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - } while (NumBytes); - return NumBytesWritten; -} - -/********************************************************************* -* -* _WriteNoCheck() -* -* Function description -* Stores a specified number of characters in SEGGER RTT ring buffer -* and updates the associated write pointer which is periodically -* read by the host. -* It is callers responsibility to make sure data actually fits in buffer. -* -* Parameters -* pRing Ring buffer to post to. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Notes -* (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking -*/ -static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { - unsigned NumBytesAtOnce; - unsigned WrOff; - unsigned Rem; - volatile char* pDst; - - WrOff = pRing->WrOff; - Rem = pRing->SizeOfBuffer - WrOff; - if (Rem > NumBytes) { - // - // All data fits before wrap around - // - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - WrOff += NumBytes; - while (NumBytes--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff + NumBytes; -#endif - } else { - // - // We reach the end of the buffer, so need to wrap around - // -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - NumBytesAtOnce = Rem; - while (NumBytesAtOnce--) { - *pDst++ = *pData++; - }; - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - NumBytesAtOnce = NumBytes - Rem; - while (NumBytesAtOnce--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytes - Rem; -#else - NumBytesAtOnce = Rem; - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); - NumBytesAtOnce = NumBytes - Rem; - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytesAtOnce; -#endif - } -} - -/********************************************************************* -* -* _PostTerminalSwitch() -* -* Function description -* Switch terminal to the given terminal ID. It is the caller's -* responsibility to ensure the terminal ID is correct and there is -* enough space in the buffer for this to complete successfully. -* -* Parameters -* pRing Ring buffer to post to. -* TerminalId Terminal ID to switch to. -*/ -static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) { - unsigned char ac[2]; - - ac[0] = 0xFFu; - ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit - _WriteBlocking(pRing, (const char*)ac, 2u); -} - -/********************************************************************* -* -* _GetAvailWriteSpace() -* -* Function description -* Returns the number of bytes that can be written to the ring -* buffer without blocking. -* -* Parameters -* pRing Ring buffer to check. -* -* Return value -* Number of bytes that are free in the buffer. -*/ -static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) { - unsigned RdOff; - unsigned WrOff; - unsigned r; - // - // Avoid warnings regarding volatile access order. It's not a problem - // in this case, but dampen compiler enthusiasm. - // - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - if (RdOff <= WrOff) { - r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; - } else { - r = RdOff - WrOff - 1u; - } - return r; -} - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ - -/********************************************************************* -* -* SEGGER_RTT_ReadUpBufferNoLock() -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the application. -* Do not lock against interrupts and multiple access. -* Used to do the same operation that J-Link does, to transfer -* RTT data via other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of Up-buffer to be used. -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -*/ -unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { - unsigned NumBytesRem; - unsigned NumBytesRead; - unsigned RdOff; - unsigned WrOff; - unsigned char* pBuffer; - SEGGER_RTT_BUFFER_UP* pRing; - volatile char* pSrc; - - INIT(); - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - pBuffer = (unsigned char*)pData; - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - NumBytesRead = 0u; - // - // Read from current read position to wrap-around of buffer, first - // - if (RdOff > WrOff) { - NumBytesRem = pRing->SizeOfBuffer - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - // - // Handle wrap-around of buffer - // - if (RdOff == pRing->SizeOfBuffer) { - RdOff = 0u; - } - } - // - // Read remaining items of buffer - // - NumBytesRem = WrOff - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - if (NumBytesRem > 0u) { - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - } - // - // Update read offset of buffer - // - if (NumBytesRead) { - pRing->RdOff = RdOff; - } - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_ReadNoLock() -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the host. -* Do not lock against interrupts and multiple access. -* -* Parameters -* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -*/ -unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { - unsigned NumBytesRem; - unsigned NumBytesRead; - unsigned RdOff; - unsigned WrOff; - unsigned char* pBuffer; - SEGGER_RTT_BUFFER_DOWN* pRing; - volatile char* pSrc; - // - INIT(); - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - pBuffer = (unsigned char*)pData; - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - NumBytesRead = 0u; - // - // Read from current read position to wrap-around of buffer, first - // - if (RdOff > WrOff) { - NumBytesRem = pRing->SizeOfBuffer - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - // - // Handle wrap-around of buffer - // - if (RdOff == pRing->SizeOfBuffer) { - RdOff = 0u; - } - } - // - // Read remaining items of buffer - // - NumBytesRem = WrOff - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - if (NumBytesRem > 0u) { - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - } - if (NumBytesRead) { - pRing->RdOff = RdOff; - } - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_ReadUpBuffer -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the application. -* Used to do the same operation that J-Link does, to transfer -* RTT data via other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of Up-buffer to be used. -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -* This function locks against all other RTT operations. I.e. during -* the read operation, writing is also locked. -* If only one consumer reads from the up buffer, -* call sEGGER_RTT_ReadUpBufferNoLock() instead. -*/ -unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { - unsigned NumBytesRead; - - SEGGER_RTT_LOCK(); - // - // Call the non-locking read function - // - NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize); - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_Read -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the host. -* -* Parameters -* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -*/ -unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { - unsigned NumBytesRead; - - SEGGER_RTT_LOCK(); - // - // Call the non-locking read function - // - NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteWithOverwriteNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block. -* SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application -* and overwrites data if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, data is overwritten. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -* (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link -* connection reads RTT data. -*/ -void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - volatile char* pDst; - // - // Get "to-host" ring buffer and copy some elements into local variables. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Check if we will overwrite data and need to adjust the RdOff. - // - if (pRing->WrOff == pRing->RdOff) { - Avail = pRing->SizeOfBuffer - 1u; - } else if ( pRing->WrOff < pRing->RdOff) { - Avail = pRing->RdOff - pRing->WrOff - 1u; - } else { - Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; - } - if (NumBytes > Avail) { - pRing->RdOff += (NumBytes - Avail); - while (pRing->RdOff >= pRing->SizeOfBuffer) { - pRing->RdOff -= pRing->SizeOfBuffer; - } - } - // - // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds - // - Avail = pRing->SizeOfBuffer - pRing->WrOff; - do { - if (Avail > NumBytes) { - // - // Last round - // - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - Avail = NumBytes; - while (NumBytes--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff += Avail; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff += NumBytes; -#endif - break; - } else { - // - // Wrap-around necessary, write until wrap-around and reset WrOff - // - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytes -= Avail; - while (Avail--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = 0; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, Avail); - pData += Avail; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = 0; - NumBytes -= Avail; -#endif - Avail = (pRing->SizeOfBuffer - 1); - } - } while (NumBytes); -} - -/********************************************************************* -* -* SEGGER_RTT_WriteSkipNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteSkipNoLock does not lock the application and -* skips all data, if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* MUST be > 0!!! -* This is done for performance reasons, so no initial check has do be done. -* -* Return value -* 1: Data has been copied -* 0: No space, data has not been copied -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, all data is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ -#if (RTT_USE_ASM == 0) -unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - unsigned RdOff; - unsigned WrOff; - unsigned Rem; - volatile char* pDst; - // - // Cases: - // 1) RdOff <= WrOff => Space until wrap-around is sufficient - // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) - // 3) RdOff < WrOff => No space in buf - // 4) RdOff > WrOff => Space is sufficient - // 5) RdOff > WrOff => No space in buf - // - // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - if (RdOff <= WrOff) { // Case 1), 2) or 3) - Avail = pRing->SizeOfBuffer - WrOff - 1u; // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) - if (Avail >= NumBytes) { // Case 1)? -CopyStraight: - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff + NumBytes; - return 1; - } - Avail += RdOff; // Space incl. wrap-around - if (Avail >= NumBytes) { // Case 2? => If not, we have case 3) (does not fit) - Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData, Rem); // Copy 1st chunk - NumBytes -= Rem; - // - // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used - // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element - // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks - // Therefore, check if 2nd memcpy is necessary at all - // - if (NumBytes) { - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData + Rem, NumBytes); - } - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytes; - return 1; - } - } else { // Potential case 4) - Avail = RdOff - WrOff - 1u; - if (Avail >= NumBytes) { // Case 4)? => If not, we have case 5) (does not fit) - goto CopyStraight; - } - } - return 0; // No space in buffer -} -#endif - -/********************************************************************* -* -* SEGGER_RTT_WriteDownBufferNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block inside a buffer. -* SEGGER_RTT_WriteDownBufferNoLock does not lock the application. -* Used to do the same operation that J-Link does, to transfer -* RTT data from other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of "Down"-buffer to be used. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Down"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -*/ -unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - unsigned Avail; - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - // - // Get "to-target" ring buffer. - // It is save to cast that to a "to-host" buffer. Up and Down buffer differ in volatility of offsets that might be modified by J-Link. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // How we output depends upon the mode... - // - switch (pRing->Flags) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother. - // - Avail = _GetAvailWriteSpace(pRing); - if (Avail < NumBytes) { - Status = 0u; - } else { - Status = NumBytes; - _WriteNoCheck(pRing, pData, NumBytes); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode, trim to what we can output without blocking. - // - Avail = _GetAvailWriteSpace(pRing); - Status = Avail < NumBytes ? Avail : NumBytes; - _WriteNoCheck(pRing, pData, Status); - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - Status = _WriteBlocking(pRing, pData, NumBytes); - break; - default: - Status = 0u; - break; - } - // - // Finish up. - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteNoLock does not lock the application. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ -unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - unsigned Avail; - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - // - // Get "to-host" ring buffer. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // How we output depends upon the mode... - // - switch (pRing->Flags) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother. - // - Avail = _GetAvailWriteSpace(pRing); - if (Avail < NumBytes) { - Status = 0u; - } else { - Status = NumBytes; - _WriteNoCheck(pRing, pData, NumBytes); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode, trim to what we can output without blocking. - // - Avail = _GetAvailWriteSpace(pRing); - Status = Avail < NumBytes ? Avail : NumBytes; - _WriteNoCheck(pRing, pData, Status); - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - Status = _WriteBlocking(pRing, pData, NumBytes); - break; - default: - Status = 0u; - break; - } - // - // Finish up. - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteDownBuffer -* -* Function description -* Stores a specified number of characters in SEGGER RTT control block in a buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Down"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -* This function locks against all other RTT operations. I.e. during -* the write operation, writing from the application is also locked. -* If only one consumer writes to the down buffer, -* call SEGGER_RTT_WriteDownBufferNoLock() instead. -*/ -unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - - INIT(); - SEGGER_RTT_LOCK(); - Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_Write -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -*/ -unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - - INIT(); - SEGGER_RTT_LOCK(); - Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteString -* -* Function description -* Stores string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* s Pointer to string. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) String passed to this function has to be \0 terminated -* (3) \0 termination character is *not* stored in RTT buffer -*/ -unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) { - unsigned Len; - - Len = STRLEN(s); - return SEGGER_RTT_Write(BufferIndex, s, Len); -} - -/********************************************************************* -* -* SEGGER_RTT_PutCharSkipNoLock -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* SEGGER_RTT_PutCharSkipNoLock does not lock the application and -* skips the byte, if it does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, the character is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ - -unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_PutCharSkip -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, the character is dropped. -*/ - -unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Prepare - // - INIT(); - SEGGER_RTT_LOCK(); - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return Status; -} - - /********************************************************************* -* -* SEGGER_RTT_PutChar -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -*/ - -unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Prepare - // - INIT(); - SEGGER_RTT_LOCK(); - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Wait for free space if mode is set to blocking - // - if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { - while (WrOff == pRing->RdOff) { - ; - } - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_GetKey -* -* Function description -* Reads one character from the SEGGER RTT buffer. -* Host has previously stored data there. -* -* Return value -* < 0 - No character available (buffer empty). -* >= 0 - Character which has been read. (Possible values: 0 - 255) -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0. -*/ -int SEGGER_RTT_GetKey(void) { - char c; - int r; - - r = (int)SEGGER_RTT_Read(0u, &c, 1u); - if (r == 1) { - r = (int)(unsigned char)c; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_WaitKey -* -* Function description -* Waits until at least one character is avaible in the SEGGER RTT buffer. -* Once a character is available, it is read and this function returns. -* -* Return value -* >=0 - Character which has been read. -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0 -* (2) This function is blocking if no character is present in RTT buffer -*/ -int SEGGER_RTT_WaitKey(void) { - int r; - - do { - r = SEGGER_RTT_GetKey(); - } while (r < 0); - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_HasKey -* -* Function description -* Checks if at least one character for reading is available in the SEGGER RTT buffer. -* -* Return value -* == 0 - No characters are available to read. -* == 1 - At least one character is available. -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0 -*/ -int SEGGER_RTT_HasKey(void) { - SEGGER_RTT_BUFFER_DOWN* pRing; - unsigned RdOff; - int r; - - INIT(); - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRing->RdOff; - if (RdOff != pRing->WrOff) { - r = 1; - } else { - r = 0; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_HasData -* -* Function description -* Check if there is data from the host in the given buffer. -* -* Return value: -* ==0: No data -* !=0: Data in buffer -* -*/ -unsigned SEGGER_RTT_HasData(unsigned BufferIndex) { - SEGGER_RTT_BUFFER_DOWN* pRing; - unsigned v; - - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - v = pRing->WrOff; - return v - pRing->RdOff; -} - -/********************************************************************* -* -* SEGGER_RTT_HasDataUp -* -* Function description -* Check if there is data remaining to be sent in the given buffer. -* -* Return value: -* ==0: No data -* !=0: Data in buffer -* -*/ -unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned v; - - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - v = pRing->RdOff; - return pRing->WrOff - v; -} - -/********************************************************************* -* -* SEGGER_RTT_AllocDownBuffer -* -* Function description -* Run-time configuration of the next down-buffer (H->T). -* The next buffer, which is not used yet is configured. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. Buffer Index -* < 0 - Error -*/ -int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int BufferIndex; - volatile SEGGER_RTT_CB* pRTTCB; - - INIT(); - SEGGER_RTT_LOCK(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - BufferIndex = 0; - do { - if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) { - break; - } - BufferIndex++; - } while (BufferIndex < pRTTCB->MaxNumDownBuffers); - if (BufferIndex < pRTTCB->MaxNumDownBuffers) { - pRTTCB->aDown[BufferIndex].sName = sName; - pRTTCB->aDown[BufferIndex].pBuffer = (char*)pBuffer; - pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; - pRTTCB->aDown[BufferIndex].RdOff = 0u; - pRTTCB->aDown[BufferIndex].WrOff = 0u; - pRTTCB->aDown[BufferIndex].Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - } else { - BufferIndex = -1; - } - SEGGER_RTT_UNLOCK(); - return BufferIndex; -} - -/********************************************************************* -* -* SEGGER_RTT_AllocUpBuffer -* -* Function description -* Run-time configuration of the next up-buffer (T->H). -* The next buffer, which is not used yet is configured. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. Buffer Index -* < 0 - Error -*/ -int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int BufferIndex; - volatile SEGGER_RTT_CB* pRTTCB; - - INIT(); - SEGGER_RTT_LOCK(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - BufferIndex = 0; - do { - if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) { - break; - } - BufferIndex++; - } while (BufferIndex < pRTTCB->MaxNumUpBuffers); - if (BufferIndex < pRTTCB->MaxNumUpBuffers) { - pRTTCB->aUp[BufferIndex].sName = sName; - pRTTCB->aUp[BufferIndex].pBuffer = (char*)pBuffer; - pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; - pRTTCB->aUp[BufferIndex].RdOff = 0u; - pRTTCB->aUp[BufferIndex].WrOff = 0u; - pRTTCB->aUp[BufferIndex].Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - } else { - BufferIndex = -1; - } - SEGGER_RTT_UNLOCK(); - return BufferIndex; -} - -/********************************************************************* -* -* SEGGER_RTT_ConfigUpBuffer -* -* Function description -* Run-time configuration of a specific up-buffer (T->H). -* Buffer to be configured is specified by index. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* BufferIndex Index of the buffer to configure. -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. -* < 0 - Error -* -* Additional information -* Buffer 0 is configured on compile-time. -* May only be called once per buffer. -* Buffer name and flags can be reconfigured using the appropriate functions. -*/ -int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - if (BufferIndex) { - pUp->sName = sName; - pUp->pBuffer = (char*)pBuffer; - pUp->SizeOfBuffer = BufferSize; - pUp->RdOff = 0u; - pUp->WrOff = 0u; - } - pUp->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_ConfigDownBuffer -* -* Function description -* Run-time configuration of a specific down-buffer (H->T). -* Buffer to be configured is specified by index. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* BufferIndex Index of the buffer to configure. -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 O.K. -* < 0 Error -* -* Additional information -* Buffer 0 is configured on compile-time. -* May only be called once per buffer. -* Buffer name and flags can be reconfigured using the appropriate functions. -*/ -int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - if (BufferIndex) { - pDown->sName = sName; - pDown->pBuffer = (char*)pBuffer; - pDown->SizeOfBuffer = BufferSize; - pDown->RdOff = 0u; - pDown->WrOff = 0u; - } - pDown->Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetNameUpBuffer -* -* Function description -* Run-time configuration of a specific up-buffer name (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* sName Pointer to a constant name string. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - pUp->sName = sName; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetNameDownBuffer -* -* Function description -* Run-time configuration of a specific Down-buffer name (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* sName Pointer to a constant name string. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - pDown->sName = sName; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetFlagsUpBuffer -* -* Function description -* Run-time configuration of specific up-buffer flags (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer. -* Flags Flags to set for the buffer. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - pUp->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetFlagsDownBuffer -* -* Function description -* Run-time configuration of specific Down-buffer flags (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* Flags Flags to set for the buffer. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - pDown->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_Init -* -* Function description -* Initializes the RTT Control Block. -* Should be used in RAM targets, at start of the application. -* -*/ -void SEGGER_RTT_Init (void) { - _DoInit(); -} - -/********************************************************************* -* -* SEGGER_RTT_SetTerminal -* -* Function description -* Sets the terminal to be used for output on channel 0. -* -* Parameters -* TerminalId Index of the terminal. -* -* Return value -* >= 0 O.K. -* < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id) -* -* Notes -* (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed -*/ -int SEGGER_RTT_SetTerminal (unsigned char TerminalId) { - unsigned char ac[2]; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - int r; - - INIT(); - r = 0; - ac[0] = 0xFFu; - if (TerminalId < sizeof(_aTerminalId)) { // We only support a certain number of channels - ac[1] = _aTerminalId[TerminalId]; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing - if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { - _ActiveTerminal = TerminalId; - _WriteBlocking(pRing, (const char*)ac, 2u); - } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes - Avail = _GetAvailWriteSpace(pRing); - if (Avail >= 2) { - _ActiveTerminal = TerminalId; // Only change active terminal in case of success - _WriteNoCheck(pRing, (const char*)ac, 2u); - } else { - r = -1; - } - } - SEGGER_RTT_UNLOCK(); - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_TerminalOut -* -* Function description -* Writes a string to the given terminal -* without changing the terminal for channel 0. -* -* Parameters -* TerminalId Index of the terminal. -* s String to be printed on the terminal. -* -* Return value -* >= 0 - Number of bytes written. -* < 0 - Error. -* -*/ -int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s) { - int Status; - unsigned FragLen; - unsigned Avail; - SEGGER_RTT_BUFFER_UP* pRing; - // - INIT(); - // - // Validate terminal ID. - // - if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Need to be able to change terminal, write data, change back. - // Compute the fixed and variable sizes. - // - FragLen = STRLEN(s); - // - // How we output depends upon the mode... - // - SEGGER_RTT_LOCK(); - Avail = _GetAvailWriteSpace(pRing); - switch (pRing->Flags & SEGGER_RTT_MODE_MASK) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother switching terminals at all. - // - if (Avail < (FragLen + 4u)) { - Status = 0; - } else { - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, FragLen); - _PostTerminalSwitch(pRing, _ActiveTerminal); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode and there is not enough space for everything, - // trim the output but always include the terminal switch. If no room - // for terminal switch, skip that totally. - // - if (Avail < 4u) { - Status = -1; - } else { - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); - _PostTerminalSwitch(pRing, _ActiveTerminal); - } - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, FragLen); - _PostTerminalSwitch(pRing, _ActiveTerminal); - break; - default: - Status = -1; - break; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - } else { - Status = -1; - } - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_GetAvailWriteSpace -* -* Function description -* Returns the number of bytes available in the ring buffer. -* -* Parameters -* BufferIndex Index of the up buffer. -* -* Return value -* Number of bytes that are free in the selected up buffer. -*/ -unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex) { - SEGGER_RTT_BUFFER_UP* pRing; - - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - return _GetAvailWriteSpace(pRing); -} - - -/********************************************************************* -* -* SEGGER_RTT_GetBytesInBuffer() -* -* Function description -* Returns the number of bytes currently used in the up buffer. -* -* Parameters -* BufferIndex Index of the up buffer. -* -* Return value -* Number of bytes that are used in the buffer. -*/ -unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) { - unsigned RdOff; - unsigned WrOff; - unsigned r; - volatile SEGGER_RTT_CB* pRTTCB; - // - // Avoid warnings regarding volatile access order. It's not a problem - // in this case, but dampen compiler enthusiasm. - // - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRTTCB->aUp[BufferIndex].RdOff; - WrOff = pRTTCB->aUp[BufferIndex].WrOff; - if (RdOff <= WrOff) { - r = WrOff - RdOff; - } else { - r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff); - } - return r; -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.h deleted file mode 100644 index 07c5ba442..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT.h +++ /dev/null @@ -1,472 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT.h -Purpose : Implementation of SEGGER real-time transfer which allows - real-time communication on targets which support debugger - memory accesses while the CPU is running. -Revision: $Rev: 23622 $ ----------------------------------------------------------------------- -*/ - -#ifndef SEGGER_RTT_H -#define SEGGER_RTT_H - -#include "SEGGER_RTT_Conf.h" - -/********************************************************************* -* -* Defines, defaults -* -********************************************************************** -*/ - -#ifndef RTT_USE_ASM - // - // Some cores support out-of-order memory accesses (reordering of memory accesses in the core) - // For such cores, we need to define a memory barrier to guarantee the order of certain accesses to the RTT ring buffers. - // Needed for: - // Cortex-M7 (ARMv7-M) - // Cortex-M23 (ARM-v8M) - // Cortex-M33 (ARM-v8M) - // Cortex-A/R (ARM-v7A/R) - // - // We do not explicitly check for "Embedded Studio" as the compiler in use determines what we support. - // You can use an external toolchain like IAR inside ES. So there is no point in checking for "Embedded Studio" - // - #if (defined __CROSSWORKS_ARM) // Rowley Crossworks - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #if (defined __ARM_ARCH_7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #else - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #endif - #elif (defined __ARMCC_VERSION) - // - // ARM compiler - // ARM compiler V6.0 and later is clang based. - // Our ASM part is compatible to clang. - // - #if (__ARMCC_VERSION >= 6000000) - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #else - #define _CC_HAS_RTT_ASM_SUPPORT 0 - #endif - #if (defined __ARM_ARCH_6M__) // Cortex-M0 / M1 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 // No ASM support for this architecture - #elif (defined __ARM_ARCH_7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #else - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #endif - #elif ((defined __GNUC__) || (defined __clang__)) - // - // GCC / Clang - // - #define _CC_HAS_RTT_ASM_SUPPORT 1 - // ARM 7/9: __ARM_ARCH_5__ / __ARM_ARCH_5E__ / __ARM_ARCH_5T__ / __ARM_ARCH_5T__ / __ARM_ARCH_5TE__ - #if (defined __ARM_ARCH_7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 // Only Cortex-M7 needs a DMB but we cannot distinguish M4 and M7 here... - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #else - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #endif - #elif ((defined __IASMARM__) || (defined __ICCARM__)) - // - // IAR assembler/compiler - // - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #if (__VER__ < 6300000) - #define VOLATILE - #else - #define VOLATILE volatile - #endif - #if (defined __ARM7M__) // Needed for old versions that do not know the define yet - #if (__CORE__ == __ARM7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #endif - #endif - #if (defined __ARM7EM__) - #if (__CORE__ == __ARM7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM8M_BASELINE__) - #if (__CORE__ == __ARM8M_BASELINE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM8M_MAINLINE__) - #if (__CORE__ == __ARM8M_MAINLINE__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM8EM_MAINLINE__) - #if (__CORE__ == __ARM8EM_MAINLINE__) // Cortex-??? - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM7A__) - #if (__CORE__ == __ARM7A__) // Cortex-A 32-bit ARMv7-A - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM7R__) - #if (__CORE__ == __ARM7R__) // Cortex-R 32-bit ARMv7-R - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif -// TBD: __ARM8A__ => Cortex-A 64-bit ARMv8-A -// TBD: __ARM8R__ => Cortex-R 64-bit ARMv8-R - #else - // - // Other compilers - // - #define _CC_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #endif - // - // If IDE and core support the ASM version, enable ASM version by default - // - #ifndef _CORE_HAS_RTT_ASM_SUPPORT - #define _CORE_HAS_RTT_ASM_SUPPORT 0 // Default for unknown cores - #endif - #if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT) - #define RTT_USE_ASM (1) - #else - #define RTT_USE_ASM (0) - #endif -#endif - -#ifndef _CORE_NEEDS_DMB - #define _CORE_NEEDS_DMB 0 -#endif - -#ifndef RTT__DMB - #if _CORE_NEEDS_DMB - #error "Don't know how to place inline assembly for DMB" - #else - #define RTT__DMB() - #endif -#endif - -#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE - #define SEGGER_RTT_CPU_CACHE_LINE_SIZE (0) // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here -#endif - -#ifndef SEGGER_RTT_UNCACHED_OFF - #if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #error "SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #else - #define SEGGER_RTT_UNCACHED_OFF (0) - #endif -#endif -#if RTT_USE_ASM - #if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #error "RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif -#endif - -#ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file -#include -#include - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -// -// Determine how much we must pad the control block to make it a multiple of a cache line in size -// Assuming: U8 = 1B -// U16 = 2B -// U32 = 4B -// U8/U16/U32* = 4B -// -#if SEGGER_RTT_CPU_CACHE_LINE_SIZE // Avoid division by zero in case we do not have any cache - #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * SEGGER_RTT_CPU_CACHE_LINE_SIZE) -#else - #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes) -#endif -#define SEGGER_RTT__CB_SIZE (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24)) -#define SEGGER_RTT__CB_PADDING (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -// -// Description for a circular buffer (also called "ring buffer") -// which is used as up-buffer (T->H) -// -typedef struct { - const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" - char* pBuffer; // Pointer to start of buffer - unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. - unsigned WrOff; // Position of next item to be written by either target. - volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. - unsigned Flags; // Contains configuration flags -} SEGGER_RTT_BUFFER_UP; - -// -// Description for a circular buffer (also called "ring buffer") -// which is used as down-buffer (H->T) -// -typedef struct { - const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" - char* pBuffer; // Pointer to start of buffer - unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. - volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. - unsigned RdOff; // Position of next item to be read by target (down-buffer). - unsigned Flags; // Contains configuration flags -} SEGGER_RTT_BUFFER_DOWN; - -// -// RTT control block which describes the number of buffers available -// as well as the configuration for each buffer -// -// -typedef struct { - char acID[16]; // Initialized to "SEGGER RTT" - int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) - int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) - SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host - SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target -#if SEGGER_RTT__CB_PADDING - unsigned char aDummy[SEGGER_RTT__CB_PADDING]; -#endif -} SEGGER_RTT_CB; - -/********************************************************************* -* -* Global data -* -********************************************************************** -*/ -extern SEGGER_RTT_CB _SEGGER_RTT; - -/********************************************************************* -* -* RTT API functions -* -********************************************************************** -*/ -#ifdef __cplusplus - extern "C" { -#endif -int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_GetKey (void); -unsigned SEGGER_RTT_HasData (unsigned BufferIndex); -int SEGGER_RTT_HasKey (void); -unsigned SEGGER_RTT_HasDataUp (unsigned BufferIndex); -void SEGGER_RTT_Init (void); -unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); -unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); -int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); -int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); -int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); -int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); -int SEGGER_RTT_WaitKey (void); -unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_ASM_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); -void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex); -unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); -// -// Function macro for performance optimization -// -#define SEGGER_RTT_HASDATA(n) (((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) - -#if RTT_USE_ASM - #define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock -#endif - -/********************************************************************* -* -* RTT transfer functions to send RTT data via other channels. -* -********************************************************************** -*/ -unsigned SEGGER_RTT_ReadUpBuffer (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); -unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); -unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); - -#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - -/********************************************************************* -* -* RTT "Terminal" API functions -* -********************************************************************** -*/ -int SEGGER_RTT_SetTerminal (unsigned char TerminalId); -int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s); - -/********************************************************************* -* -* RTT printf functions (require SEGGER_RTT_printf.c) -* -********************************************************************** -*/ -int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); -int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); - -#ifdef __cplusplus - } -#endif - -#endif // ifndef(SEGGER_RTT_ASM) - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -// -// Operating modes. Define behavior if buffer is full (not enough space for entire message) -// -#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0) // Skip. Do not block, output nothing. (Default) -#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1) // Trim: Do not block, output as much as fits. -#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. -#define SEGGER_RTT_MODE_MASK (3) - -// -// Control sequences, based on ANSI. -// Can be used to control color, and clear the screen -// -#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors -#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left - -#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m" -#define RTT_CTRL_TEXT_RED "\x1B[2;31m" -#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m" -#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m" -#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m" -#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m" -#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m" -#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m" - -#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m" -#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m" -#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m" -#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m" -#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m" -#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m" -#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m" -#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m" - -#define RTT_CTRL_BG_BLACK "\x1B[24;40m" -#define RTT_CTRL_BG_RED "\x1B[24;41m" -#define RTT_CTRL_BG_GREEN "\x1B[24;42m" -#define RTT_CTRL_BG_YELLOW "\x1B[24;43m" -#define RTT_CTRL_BG_BLUE "\x1B[24;44m" -#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m" -#define RTT_CTRL_BG_CYAN "\x1B[24;46m" -#define RTT_CTRL_BG_WHITE "\x1B[24;47m" - -#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m" -#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m" -#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m" -#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m" -#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m" -#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m" -#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m" -#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m" - - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_ASM_ARMv7M.S b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_ASM_ARMv7M.S deleted file mode 100644 index b2033fd6a..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_ASM_ARMv7M.S +++ /dev/null @@ -1,263 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_RTT_ASM_ARMv7M.S -Purpose : Assembler implementation of RTT functions for ARMv7M - -Additional information: - This module is written to be assembler-independent and works with - GCC and clang (Embedded Studio) and IAR. -*/ - -#define SEGGER_RTT_ASM // Used to control processed input from header file -#include "SEGGER_RTT.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -#define _CCIAR 0 -#define _CCCLANG 1 - -#if (defined __SES_ARM) || (defined __GNUC__) || (defined __clang__) - #define _CC_TYPE _CCCLANG - #define _PUB_SYM .global - #define _EXT_SYM .extern - #define _END .end - #define _WEAK .weak - #define _THUMB_FUNC .thumb_func - #define _THUMB_CODE .code 16 - #define _WORD .word - #define _SECTION(Sect, Type, AlignExp) .section Sect ##, "ax" - #define _ALIGN(Exp) .align Exp - #define _PLACE_LITS .ltorg - #define _DATA_SECT_START - #define _C_STARTUP _start - #define _STACK_END __stack_end__ - #define _RAMFUNC - // - // .text => Link to flash - // .fast => Link to RAM - // OtherSect => Usually link to RAM - // Alignment is 2^x - // -#elif defined (__IASMARM__) - #define _CC_TYPE _CCIAR - #define _PUB_SYM PUBLIC - #define _EXT_SYM EXTERN - #define _END END - #define _WEAK _WEAK - #define _THUMB_FUNC - #define _THUMB_CODE THUMB - #define _WORD DCD - #define _SECTION(Sect, Type, AlignExp) SECTION Sect ## : ## Type ## :REORDER:NOROOT ## (AlignExp) - #define _ALIGN(Exp) alignrom Exp - #define _PLACE_LITS - #define _DATA_SECT_START DATA - #define _C_STARTUP __iar_program_start - #define _STACK_END sfe(CSTACK) - #define _RAMFUNC SECTION_TYPE SHT_PROGBITS, SHF_WRITE | SHF_EXECINSTR - // - // .text => Link to flash - // .textrw => Link to RAM - // OtherSect => Usually link to RAM - // NOROOT => Allows linker to throw away the function, if not referenced - // Alignment is 2^x - // -#endif - -#if (_CC_TYPE == _CCIAR) - NAME SEGGER_RTT_ASM_ARMv7M -#else - .syntax unified -#endif - -#if defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) - #define SHT_PROGBITS 0x1 - -/********************************************************************* -* -* Public / external symbols -* -********************************************************************** -*/ - - _EXT_SYM __aeabi_memcpy - _EXT_SYM __aeabi_memcpy4 - _EXT_SYM _SEGGER_RTT - - _PUB_SYM SEGGER_RTT_ASM_WriteSkipNoLock - -/********************************************************************* -* -* SEGGER_RTT_WriteSkipNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteSkipNoLock does not lock the application and -* skips all data, if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* MUST be > 0!!! -* This is done for performance reasons, so no initial check has do be done. -* -* Return value -* 1: Data has been copied -* 0: No space, data has not been copied -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, all data is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ - _SECTION(.text, CODE, 2) - _ALIGN(2) - _THUMB_FUNC -SEGGER_RTT_ASM_WriteSkipNoLock: // unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pData, unsigned NumBytes) { - // - // Cases: - // 1) RdOff <= WrOff => Space until wrap-around is sufficient - // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) - // 3) RdOff < WrOff => No space in buf - // 4) RdOff > WrOff => Space is sufficient - // 5) RdOff > WrOff => No space in buf - // - // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough - // - // Register usage: - // R0 Temporary needed as RdOff, register later on - // R1 pData - // R2 - // R3 register. Hold free for subroutine calls - // R4 - // R5 pRing->pBuffer - // R6 pRing (Points to active struct SEGGER_RTT_BUFFER_DOWN) - // R7 WrOff - // - PUSH {R4-R7} - ADD R3,R0,R0, LSL #+1 - LDR.W R0,=_SEGGER_RTT // pRing = &_SEGGER_RTT.aUp[BufferIndex]; - ADD R0,R0,R3, LSL #+3 - ADD R6,R0,#+24 - LDR R0,[R6, #+16] // RdOff = pRing->RdOff; - LDR R7,[R6, #+12] // WrOff = pRing->WrOff; - LDR R5,[R6, #+4] // pRing->pBuffer - CMP R7,R0 - BCC.N _CheckCase4 // if (RdOff <= WrOff) { => Case 1), 2) or 3) - // - // Handling for case 1, later on identical to case 4 - // - LDR R3,[R6, #+8] // Avail = pRing->SizeOfBuffer - WrOff - 1u; => Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) - SUBS R4,R3,R7 // (Used in case we jump into case 2 afterwards) - SUBS R3,R4,#+1 // - CMP R3,R2 - BCC.N _CheckCase2 // if (Avail >= NumBytes) { => Case 1)? -_Case4: - ADDS R5,R7,R5 // pBuffer += WrOff - ADDS R0,R2,R7 // v = WrOff + NumBytes - // - // 2x unrolling for the copy loop that is used most of the time - // This is a special optimization for small SystemView packets and makes them even faster - // - _ALIGN(2) -_LoopCopyStraight: // memcpy(pRing->pBuffer + WrOff, pData, NumBytes); - LDRB R3,[R1], #+1 - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BEQ _CSDone - LDRB R3,[R1], #+1 - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BNE _LoopCopyStraight -_CSDone: -#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here - DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct -#endif - STR R0,[R6, #+12] // pRing->WrOff = WrOff + NumBytes; - MOVS R0,#+1 - POP {R4-R7} - BX LR // Return 1 -_CheckCase2: - ADDS R0,R0,R3 // Avail += RdOff; => Space incl. wrap-around - CMP R0,R2 - BCC.N _Case3 // if (Avail >= NumBytes) { => Case 2? => If not, we have case 3) (does not fit) - // - // Handling for case 2 - // - ADDS R0,R7,R5 // v = pRing->pBuffer + WrOff => Do not change pRing->pBuffer here because 2nd chunk needs org. value - SUBS R2,R2,R4 // NumBytes -= Rem; (Rem = pRing->SizeOfBuffer - WrOff; => Space until end of buffer) -_LoopCopyBeforeWrapAround: // memcpy(pRing->pBuffer + WrOff, pData, Rem); => Copy 1st chunk - LDRB R3,[R1], #+1 - STRB R3,[R0], #+1 // *pDest++ = *pSrc++ - SUBS R4,R4,#+1 - BNE _LoopCopyBeforeWrapAround - // - // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used - // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element - // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks - // Therefore, check if 2nd memcpy is necessary at all - // - ADDS R4,R2,#+0 // Save (needed as counter in loop but must be written to after the loop). Also use this inst to update the flags to skip 2nd loop if possible - BEQ.N _No2ChunkNeeded // if (NumBytes) { -_LoopCopyAfterWrapAround: // memcpy(pRing->pBuffer, pData + Rem, NumBytes); - LDRB R3,[R1], #+1 // pData already points to the next src byte due to copy loop increment before this loop - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BNE _LoopCopyAfterWrapAround -_No2ChunkNeeded: -#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here - DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct -#endif - STR R4,[R6, #+12] // pRing->WrOff = NumBytes; => Must be written after copying data because J-Link may read control block asynchronously while writing into buffer - MOVS R0,#+1 - POP {R4-R7} - BX LR // Return 1 -_CheckCase4: - SUBS R0,R0,R7 - SUBS R0,R0,#+1 // Avail = RdOff - WrOff - 1u; - CMP R0,R2 - BCS.N _Case4 // if (Avail >= NumBytes) { => Case 4) == 1) ? => If not, we have case 5) == 3) (does not fit) -_Case3: - MOVS R0,#+0 - POP {R4-R7} - BX LR // Return 0 - _PLACE_LITS - -#endif // defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) - _END - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Conf.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Conf.h deleted file mode 100644 index b01253a50..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Conf.h +++ /dev/null @@ -1,408 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_Conf.h -Purpose : Implementation of SEGGER real-time transfer (RTT) which - allows real-time communication on targets which support - debugger memory accesses while the CPU is running. -Revision: $Rev: 21386 $ - -*/ - -#ifndef SEGGER_RTT_CONF_H -#define SEGGER_RTT_CONF_H - -#ifdef __IAR_SYSTEMS_ICC__ - #include -#endif - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ - -// -// Take in and set to correct values for Cortex-A systems with CPU cache -// -//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE (32) // Largest cache line size (in bytes) in the current system -//#define SEGGER_RTT_UNCACHED_OFF (0xFB000000) // Address alias where RTT CB and buffers can be accessed uncached -// -// Most common case: -// Up-channel 0: RTT -// Up-channel 1: SystemView -// -#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS - #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) -#endif -// -// Most common case: -// Down-channel 0: RTT -// Down-channel 1: SystemView -// -#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS - #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) -#endif - -#ifndef BUFFER_SIZE_UP - #define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) -#endif - -#ifndef BUFFER_SIZE_DOWN - #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) -#endif - -#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE - #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) -#endif - -#ifndef SEGGER_RTT_MODE_DEFAULT - #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) -#endif - -/********************************************************************* -* -* RTT memcpy configuration -* -* memcpy() is good for large amounts of data, -* but the overhead is big for small amounts, which are usually stored via RTT. -* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. -* -* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. -* This is may be required with memory access restrictions, -* such as on Cortex-A devices with MMU. -*/ -#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP - #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop -#endif -// -// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets -// -//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) -// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) -//#endif - -// -// Target is not allowed to perform other RTT operations while string still has not been stored completely. -// Otherwise we would probably end up with a mixed string in the buffer. -// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. -// -// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. -// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. -// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. -// (Higher priority = lower priority number) -// Default value for embOS: 128u -// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC -// or define SEGGER_RTT_LOCK() to completely disable interrupts. -// -#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) -#endif - -/********************************************************************* -* -* RTT lock configuration for SEGGER Embedded Studio, -* Rowley CrossStudio and GCC -*/ -#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32)) - #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs %0, primask \n\t" \ - "movs r1, #1 \n\t" \ - "msr primask, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : \ - ); \ - } - #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs %0, basepri \n\t" \ - "mov r1, %1 \n\t" \ - "msr basepri, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : \ - ); \ - } - - #elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs r1, CPSR \n\t" \ - "mov %0, r1 \n\t" \ - "orr r1, r1, #0xC0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ - "mrs r1, CPSR \n\t" \ - "bic r1, r1, #0xC0 \n\t" \ - "and r0, r0, #0xC0 \n\t" \ - "orr r1, r1, r0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "r0", "r1", "cc" \ - ); \ - } - #elif defined(__riscv) || defined(__riscv_xlen) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("csrr %0, mstatus \n\t" \ - "csrci mstatus, 8 \n\t" \ - "andi %0, %0, 8 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ - "or %0, %0, a1 \n\t" \ - "csrs mstatus, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "a1" \ - ); \ - } - #else - #define SEGGER_RTT_LOCK() - #define SEGGER_RTT_UNLOCK() - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR EWARM -*/ -#ifdef __ICCARM__ - #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \ - (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_PRIMASK(); \ - __set_PRIMASK(1); - - #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ - } - #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \ - (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \ - (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \ - (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_BASEPRI(); \ - __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); - - #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \ - } - #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \ - (defined (__ARM7R__) && (__CORE__ == __ARM7R__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs r1, CPSR \n\t" \ - "mov %0, r1 \n\t" \ - "orr r1, r1, #0xC0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ - "mrs r1, CPSR \n\t" \ - "bic r1, r1, #0xC0 \n\t" \ - "and r0, r0, #0xC0 \n\t" \ - "orr r1, r1, r0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "r0", "r1", "cc" \ - ); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR RX -*/ -#ifdef __ICCRX__ - #define SEGGER_RTT_LOCK() { \ - unsigned long _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_interrupt_state(); \ - __disable_interrupt(); - - #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR RL78 -*/ -#ifdef __ICCRL78__ - #define SEGGER_RTT_LOCK() { \ - __istate_t _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_interrupt_state(); \ - __disable_interrupt(); - - #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for KEIL ARM -*/ -#ifdef __CC_ARM - #if (defined __TARGET_ARCH_6S_M) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \ - _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \ - _SEGGER_RTT__PRIMASK = 1u; \ - __schedule_barrier(); - - #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \ - __schedule_barrier(); \ - } - #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - register unsigned char BASEPRI __asm( "basepri"); \ - _SEGGER_RTT__LockState = BASEPRI; \ - BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ - __schedule_barrier(); - - #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \ - __schedule_barrier(); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for TI ARM -*/ -#ifdef __TI_ARM__ - #if defined (__TI_ARM_V6M0__) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_PRIMASK(); \ - __set_PRIMASK(1); - - #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ - } - #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); - - #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for CCRX -*/ -#ifdef __RX - #include - #define SEGGER_RTT_LOCK() { \ - unsigned long _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = get_psw() & 0x010000; \ - clrpsw_i(); - - #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for embOS Simulation on Windows -* (Can also be used for generic RTT locking with embOS) -*/ -#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS) - -void OS_SIM_EnterCriticalSection(void); -void OS_SIM_LeaveCriticalSection(void); - -#define SEGGER_RTT_LOCK() { \ - OS_SIM_EnterCriticalSection(); - -#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration fallback -*/ -#ifndef SEGGER_RTT_LOCK - #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) -#endif - -#ifndef SEGGER_RTT_UNLOCK - #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) -#endif - -#endif -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Syscalls_GCC.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Syscalls_GCC.c deleted file mode 100644 index 15e528b7a..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_Syscalls_GCC.c +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_Syscalls_GCC.c -Purpose : Low-level functions for using printf() via RTT in GCC. - To use RTT for printf output, include this file in your - application. -Revision: $Rev: 20755 $ ----------------------------------------------------------------------- -*/ -#if (defined __GNUC__) && !(defined __SES_ARM) && !(defined __CROSSWORKS_ARM) && !(defined __ARMCC_VERSION) && !(defined __CC_ARM) - -#include // required for _write_r -#include "SEGGER_RTT.h" - - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ -// -// If necessary define the _reent struct -// to match the one passed by the used standard library. -// -struct _reent; - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ -_ssize_t _write (int file, const void *ptr, size_t len); -_ssize_t _write_r(struct _reent *r, int file, const void *ptr, size_t len); - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _write() -* -* Function description -* Low-level write function. -* libc subroutines will use this system routine for output to all files, -* including stdout. -* Write data via RTT. -*/ -_ssize_t _write(int file, const void *ptr, size_t len) { - (void) file; /* Not used, avoid warning */ - SEGGER_RTT_Write(0, ptr, len); - return len; -} - -/********************************************************************* -* -* _write_r() -* -* Function description -* Low-level reentrant write function. -* libc subroutines will use this system routine for output to all files, -* including stdout. -* Write data via RTT. -*/ -_ssize_t _write_r(struct _reent *r, int file, const void *ptr, size_t len) { - (void) file; /* Not used, avoid warning */ - (void) r; /* Not used, avoid warning */ - SEGGER_RTT_Write(0, ptr, len); - return len; -} - -#endif -/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_printf.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_printf.c deleted file mode 100644 index 60f2fe3a4..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_RTT_printf.c +++ /dev/null @@ -1,484 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_printf.c -Purpose : Replacement for printf to write formatted data via RTT -Revision: $Rev: 17697 $ ----------------------------------------------------------------------- -*/ -#include "SEGGER_RTT.h" -#include "SEGGER_RTT_Conf.h" - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ - -#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE - #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) -#endif - -#include -#include - - -#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) -#define FORMAT_FLAG_PAD_ZERO (1u << 1) -#define FORMAT_FLAG_PRINT_SIGN (1u << 2) -#define FORMAT_FLAG_ALTERNATE (1u << 3) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -typedef struct { - char* pBuffer; - unsigned BufferSize; - unsigned Cnt; - - int ReturnValue; - - unsigned RTTBufferIndex; -} SEGGER_RTT_PRINTF_DESC; - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ - -/********************************************************************* -* -* Static code -* -********************************************************************** -*/ -/********************************************************************* -* -* _StoreChar -*/ -static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { - unsigned Cnt; - - Cnt = p->Cnt; - if ((Cnt + 1u) <= p->BufferSize) { - *(p->pBuffer + Cnt) = c; - p->Cnt = Cnt + 1u; - p->ReturnValue++; - } - // - // Write part of string, when the buffer is full - // - if (p->Cnt == p->BufferSize) { - if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { - p->ReturnValue = -1; - } else { - p->Cnt = 0u; - } - } -} - -/********************************************************************* -* -* _PrintUnsigned -*/ -static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { - static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - unsigned Div; - unsigned Digit; - unsigned Number; - unsigned Width; - char c; - - Number = v; - Digit = 1u; - // - // Get actual field width - // - Width = 1u; - while (Number >= Base) { - Number = (Number / Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - // - // Print leading chars if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { - if (FieldWidth != 0u) { - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { - c = '0'; - } else { - c = ' '; - } - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, c); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Compute Digit. - // Loop until Digit has the value of the highest digit required. - // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. - // - while (1) { - if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) - NumDigits--; - } else { - Div = v / Digit; - if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done - break; - } - } - Digit *= Base; - } - // - // Output digits - // - do { - Div = v / Digit; - v -= Div * Digit; - _StoreChar(pBufferDesc, _aV2C[Div]); - if (pBufferDesc->ReturnValue < 0) { - break; - } - Digit /= Base; - } while (Digit); - // - // Print trailing spaces if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - } -} - -/********************************************************************* -* -* _PrintInt -*/ -static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { - unsigned Width; - int Number; - - Number = (v < 0) ? -v : v; - - // - // Get actual field width - // - Width = 1u; - while (Number >= (int)Base) { - Number = (Number / (int)Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { - FieldWidth--; - } - - // - // Print leading spaces if necessary - // - if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - // - // Print sign if necessary - // - if (pBufferDesc->ReturnValue >= 0) { - if (v < 0) { - v = -v; - _StoreChar(pBufferDesc, '-'); - } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { - _StoreChar(pBufferDesc, '+'); - } else { - - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Print leading zeros if necessary - // - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, '0'); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Print number without sign - // - _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); - } - } - } -} - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* SEGGER_RTT_vprintf -* -* Function description -* Stores a formatted string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") -* sFormat Pointer to format string -* pParamList Pointer to the list of arguments for the format string -* -* Return values -* >= 0: Number of bytes which have been stored in the "Up"-buffer. -* < 0: Error -*/ -int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { - char c; - SEGGER_RTT_PRINTF_DESC BufferDesc; - int v; - unsigned NumDigits; - unsigned FormatFlags; - unsigned FieldWidth; - char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; - - BufferDesc.pBuffer = acBuffer; - BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; - BufferDesc.Cnt = 0u; - BufferDesc.RTTBufferIndex = BufferIndex; - BufferDesc.ReturnValue = 0; - - do { - c = *sFormat; - sFormat++; - if (c == 0u) { - break; - } - if (c == '%') { - // - // Filter out flags - // - FormatFlags = 0u; - v = 1; - do { - c = *sFormat; - switch (c) { - case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; - case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; - case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; - case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; - default: v = 0; break; - } - } while (v); - // - // filter out field with - // - FieldWidth = 0u; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); - } while (1); - - // - // Filter out precision (number of digits to display) - // - NumDigits = 0u; - c = *sFormat; - if (c == '.') { - sFormat++; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - NumDigits = NumDigits * 10u + ((unsigned)c - '0'); - } while (1); - } - // - // Filter out length modifier - // - c = *sFormat; - do { - if ((c == 'l') || (c == 'h')) { - sFormat++; - c = *sFormat; - } else { - break; - } - } while (1); - // - // Handle specifiers - // - switch (c) { - case 'c': { - char c0; - v = va_arg(*pParamList, int); - c0 = (char)v; - _StoreChar(&BufferDesc, c0); - break; - } - case 'd': - v = va_arg(*pParamList, int); - _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'u': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'x': - case 'X': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); - break; - case 's': - { - const char * s = va_arg(*pParamList, const char *); - do { - c = *s; - s++; - if (c == '\0') { - break; - } - _StoreChar(&BufferDesc, c); - } while (BufferDesc.ReturnValue >= 0); - } - break; - case 'p': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); - break; - case '%': - _StoreChar(&BufferDesc, '%'); - break; - default: - break; - } - sFormat++; - } else { - _StoreChar(&BufferDesc, c); - } - } while (BufferDesc.ReturnValue >= 0); - - if (BufferDesc.ReturnValue > 0) { - // - // Write remaining data, if any - // - if (BufferDesc.Cnt != 0u) { - SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); - } - BufferDesc.ReturnValue += (int)BufferDesc.Cnt; - } - return BufferDesc.ReturnValue; -} - -/********************************************************************* -* -* SEGGER_RTT_printf -* -* Function description -* Stores a formatted string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") -* sFormat Pointer to format string, followed by the arguments for conversion -* -* Return values -* >= 0: Number of bytes which have been stored in the "Up"-buffer. -* < 0: Error -* -* Notes -* (1) Conversion specifications have following syntax: -* %[flags][FieldWidth][.Precision]ConversionSpecifier -* (2) Supported flags: -* -: Left justify within the field width -* +: Always print sign extension for signed conversions -* 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision -* Supported conversion specifiers: -* c: Print the argument as one char -* d: Print the argument as a signed integer -* u: Print the argument as an unsigned integer -* x: Print the argument as an hexadecimal integer -* s: Print the string pointed to by the argument -* p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) -*/ -int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { - int r; - va_list ParamList; - - va_start(ParamList, sFormat); - r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); - va_end(ParamList); - return r; -} -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.c deleted file mode 100644 index 337112ff0..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.c +++ /dev/null @@ -1,3043 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW.c -Purpose : System visualization API implementation. -Revision: $Rev: 22278 $ - -Additional information: - Packet format: - Packets with IDs 0..23 are standard packets with known structure. - For efficiency, they do *NOT* contain a length field. - - - Packets with IDs 24..31 are standard packets with extendible - structure and contain a length field. - - - Packet ID 31 is used for SystemView extended events. - - - Packets with IDs >= 32 always contain a length field. - - - Packet IDs: - 0.. 31 : Standard packets, known by SystemView. - 32..1023 : OS-definable packets, described in a SystemView description file. - 1024..2047 : User-definable packets, described in a SystemView description file. - 2048..32767: Undefined. - - Data encoding: - Basic types (int, short, char, ...): - Basic types are encoded little endian with most-significant bit variant - encoding. - Each encoded byte contains 7 data bits [6:0] and the MSB continuation bit. - The continuation bit indicates whether the next byte belongs to the data - (bit set) or this is the last byte (bit clear). - The most significant bits of data are encoded first, proceeding to the - least significant bits in the final byte (little endian). - - Example encoding: - Data: 0x1F4 (500) - Encoded: 0xF4 (First 7 data bits 74 | Continuation bit) - 0x03 (Second 7 data bits 03, no continuation) - - Data: 0xFFFFFFFF - Encoded: 0xFF 0xFF 0xFF 0xFF 0x0F - - Data: 0xA2 (162), 0x03 (3), 0x7000 - Encoded: 0xA2 0x01 0x03 0x80 0xE0 0x01 - - Byte arrays and strings: - Byte arrays and strings are encoded as followed by the raw data. - NumBytes is encoded as a basic type with a theoretical maximum of 4G. - - Example encoding: - Data: "Hello World\0" (0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x00) - Encoded: 0x0B 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 - - Examples packets: - 01 F4 03 80 80 10 // Overflow packet. Data is a single U32. - This packet means: 500 packets lost, Timestamp is 0x40000 - - 02 0F 50 // ISR(15) Enter. Timestamp 80 (0x50) - - 03 20 // ISR Exit. Timestamp 32 (0x20) (Shortest possible packet.) - - Sample code for user defined Packets: - #define MY_ID 0x400 // Any value between 0x400 and 0x7FF - void SendMyPacket(unsigned Para0, unsigned Para1, const char* s) { - U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + MAX_STR_LEN + 1]; - U8* pPayload; - // - pPayload = SEGGER_SYSVIEW_PPREPARE_PACKET(aPacket); // Prepare the packet for SystemView - pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet - pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet - pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, s, MAX_STR_LEN); // Add the string to the packet - // - SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, MY_ID); // Send the packet with EventId = MY_ID - } - - #define MY_ID_1 0x401 - void SendOnePara(unsigned Para0) { - SEGGER_SYSVIEW_RecordU32(MY_ID_1, Para0); - } - -*/ - -/********************************************************************* -* -* #include section -* -********************************************************************** -*/ - -#define SEGGER_SYSVIEW_C // For EXTERN statements in SEGGER_SYSVIEW.h - -#include -#include -#include -#include "SEGGER_SYSVIEW_Int.h" -#include "SEGGER_RTT.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#if SEGGER_SYSVIEW_ID_SHIFT - #define SHRINK_ID(Id) (((Id) - _SYSVIEW_Globals.RAMBaseAddress) >> SEGGER_SYSVIEW_ID_SHIFT) -#else - #define SHRINK_ID(Id) ((Id) - _SYSVIEW_Globals.RAMBaseAddress) -#endif - -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - #define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL - #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL -#else - #define CHANNEL_ID_UP _SYSVIEW_Globals.UpChannel - #define CHANNEL_ID_DOWN _SYSVIEW_Globals.DownChannel -#endif - -#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #if (SEGGER_SYSVIEW_RTT_BUFFER_SIZE % SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE) - #error "SEGGER_SYSVIEW_RTT_BUFFER_SIZE must be a multiple of SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE" - #endif -#endif - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ -// Timestamps may be less than full 32-bits, in which case we need to zero -// the unused bits to properly handle overflows. -// Note that this is a quite common scenario, as a 32-bit time such as -// SysTick might be scaled down to reduce bandwith -// or a 16-bit hardware time might be used. -#if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits - #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ - Delta >>= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; -#else - #define MAKE_DELTA_32BIT(Delta) -#endif - - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#define ENABLE_STATE_OFF 0 -#define ENABLE_STATE_ON 1 -#define ENABLE_STATE_DROPPING 2 - -#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) -#define FORMAT_FLAG_PAD_ZERO (1u << 1) -#define FORMAT_FLAG_PRINT_SIGN (1u << 2) -#define FORMAT_FLAG_ALTERNATE (1u << 3) - -#define MODULE_EVENT_OFFSET (512) - -/********************************************************************* -* -* Types, local -* -********************************************************************** -*/ -typedef struct { - U8* pBuffer; - U8* pPayload; - U8* pPayloadStart; - U32 Options; - unsigned Cnt; -} SEGGER_SYSVIEW_PRINTF_DESC; - -typedef struct { - U8 EnableState; // 0: Disabled, 1: Enabled, (2: Dropping) - U8 UpChannel; - U8 RecursionCnt; - U32 SysFreq; - U32 CPUFreq; - U32 LastTxTimeStamp; - U32 RAMBaseAddress; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - U32 PacketCount; -#else - U32 DropCount; - U8 DownChannel; -#endif - U32 DisabledEvents; - const SEGGER_SYSVIEW_OS_API* pOSAPI; - SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC* pfSendSysDesc; -} SEGGER_SYSVIEW_GLOBALS; - -/********************************************************************* -* -* Function prototypes, required -* -********************************************************************** -*/ -static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId); - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -static const U8 _abSync[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #ifdef SEGGER_SYSVIEW_SECTION - // - // Alignment + special section required - // - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma location=SEGGER_SYSVIEW_SECTION - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to place SystemView buffers in specific section" - #endif - #else - // - // Only alignment required - // - #if (defined __GNUC__) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to align SystemView buffers to cache line size" - #endif - #endif -#else - #ifdef SEGGER_SYSVIEW_SECTION - // - // Only special section required - // - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to place SystemView buffers in specific section" - #endif - #else - // - // Neither special section nor alignment required - // - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#endif - -#ifdef SEGGER_SYSVIEW_SECTION - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #pragma location=SEGGER_SYSVIEW_SECTION - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#else - #if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #if (defined __GNUC__) - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined(__ICCARM__)) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned" - #endif - #else - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#endif - -static SEGGER_SYSVIEW_GLOBALS _SYSVIEW_Globals; - -static SEGGER_SYSVIEW_MODULE* _pFirstModule; -static U8 _NumModules; - -/********************************************************************* -* -* Static code -* -********************************************************************** -*/ - -#define ENCODE_U32(pDest, Value) { \ - U8* pSysviewPointer; \ - U32 SysViewData; \ - pSysviewPointer = pDest; \ - SysViewData = Value; \ - while(SysViewData > 0x7F) { \ - *pSysviewPointer++ = (U8)(SysViewData | 0x80); \ - SysViewData >>= 7; \ - }; \ - *pSysviewPointer++ = (U8)SysViewData; \ - pDest = pSysviewPointer; \ - }; - - - -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) -static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; - -#define RECORD_START(PacketSize) SEGGER_SYSVIEW_LOCK(); \ - pPayloadStart = _PreparePacket(_aPacket); - -#define RECORD_END() SEGGER_SYSVIEW_UNLOCK() - -#else - -#define RECORD_START(PacketSize) U8 aPacket[(PacketSize)]; \ - pPayloadStart = _PreparePacket(aPacket); \ - -#define RECORD_END() - -#endif - -/********************************************************************* -* -* _EncodeData() -* -* Function description -* Encode a byte buffer in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pSrc - Pointer to data buffer to be encoded. -* NumBytes - Number of bytes in the buffer to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The data is encoded as a count byte followed by the contents -* of the data buffer. -* Make sure NumBytes + 1 bytes are free for the payload. -*/ -static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { - unsigned int n; - // - n = 0; - *pPayload++ = NumBytes; - while (n < NumBytes) { - *pPayload++ = *pSrc++; - n++; - } - return pPayload; -} - -/********************************************************************* -* -* _EncodeStr() -* -* Function description -* Encode a string in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pText - String to encode. -* Limit - Maximum number of characters to encode from string. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than 1 + Limit bytes will be encoded to the payload. -*/ -static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { - unsigned int n; - unsigned int Len; - // - // Compute string len - // - Len = 0; - if (pText != NULL) { - while(*(pText + Len) != 0) { - Len++; - } - if (Len > Limit) { - Len = Limit; - } - } - // - // Write Len - // - if (Len < 255) { - *pPayload++ = Len; - } else { - *pPayload++ = 255; - *pPayload++ = (Len & 255); - *pPayload++ = ((Len >> 8) & 255); - } - // - // copy string - // - n = 0; - while (n < Len) { - *pPayload++ = *pText++; - n++; - } - return pPayload; -} - -/********************************************************************* -* -* _PreparePacket() -* -* Function description -* Prepare a SystemView event packet header. -* -* Parameters -* pPacket - Pointer to start of packet to initialize. -* -* Return value -* Pointer to first byte of packet payload. -* -* Additional information -* The payload length and evnetId are not initialized. -* PreparePacket only reserves space for them and they are -* computed and filled in by the sending function. -*/ -static U8* _PreparePacket(U8* pPacket) { - return pPacket + 4; -} - -/********************************************************************* -* -* _HandleIncomingPacket() -* -* Function description -* Read an incoming command from the down channel and process it. -* -* Additional information -* This function is called each time after sending a packet. -* Processing incoming packets is done asynchronous. SystemView might -* already have sent event packets after the host has sent a command. -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) -static void _HandleIncomingPacket(void) { - U8 Cmd; - int Status; - // - Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - if (Status > 0) { - switch (Cmd) { - case SEGGER_SYSVIEW_COMMAND_ID_START: - SEGGER_SYSVIEW_Start(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_STOP: - SEGGER_SYSVIEW_Stop(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME: - SEGGER_SYSVIEW_RecordSystime(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST: - SEGGER_SYSVIEW_SendTaskList(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC: - SEGGER_SYSVIEW_GetSysDesc(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES: - SEGGER_SYSVIEW_SendNumModules(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC: - SEGGER_SYSVIEW_SendModuleDescription(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE: - Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - if (Status > 0) { - SEGGER_SYSVIEW_SendModule(Cmd); - } - break; - case SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT: - break; - default: - if (Cmd >= 128) { // Unknown extended command. Dummy read its parameter. - SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - } - break; - } - } -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - -/********************************************************************* -* -* _TrySendOverflowPacket() -* -* Function description -* Try to transmit an SystemView Overflow packet containing the -* number of dropped packets. -* -* Additional information -* Format as follows: -* 01 Max. packet len is 1 + 5 + 5 = 11 -* -* Example packets sent -* 01 20 40 -* -* Return value -* !=0: Success, Message sent (stored in RTT-Buffer) -* ==0: Buffer full, Message *NOT* stored -* -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) -static int _TrySendOverflowPacket(void) { - U32 TimeStamp; - I32 Delta; - int Status; - U8 aPacket[11]; - U8* pPayload; - - aPacket[0] = SYSVIEW_EVTID_OVERFLOW; // 1 - pPayload = &aPacket[1]; - ENCODE_U32(pPayload, _SYSVIEW_Globals.DropCount); - // - // Compute time stamp delta and append it to packet. - // - TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; - MAKE_DELTA_32BIT(Delta); - ENCODE_U32(pPayload, Delta); - // - // Try to store packet in RTT buffer and update time stamp when this was successful - // - Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, aPacket, pPayload - aPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pPayload - aPacket); - if (Status) { - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; - _SYSVIEW_Globals.EnableState--; // EnableState has been 2, will be 1. Always. - } else { - _SYSVIEW_Globals.DropCount++; - } - // - return Status; -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - -/********************************************************************* -* -* _SendSyncInfo() -* -* Function description -* Send SystemView sync packet and system information in -* post mortem mode. -* -* Additional information -* Sync is 10 * 0x00 without timestamp -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -static void _SendSyncInfo(void) { - // - // Add sync packet ( 10 * 0x00) - // Send system description - // Send system time - // Send task list - // Send module description - // Send module information - // - SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, _abSync, 10); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); - SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - } - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } - SEGGER_SYSVIEW_RecordSystime(); - SEGGER_SYSVIEW_SendTaskList(); - if (_NumModules > 0) { - int n; - SEGGER_SYSVIEW_SendNumModules(); - for (n = 0; n < _NumModules; n++) { - SEGGER_SYSVIEW_SendModule(n); - } - SEGGER_SYSVIEW_SendModuleDescription(); - } -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - -/********************************************************************* -* -* _SendPacket() -* -* Function description -* Send a SystemView packet over RTT. RTT channel and mode are -* configured by macros when the SystemView component is initialized. -* This function takes care of maintaining the packet drop count -* and sending overflow packets when necessary. -* The packet must be passed without Id and Length because this -* function prepends it to the packet before transmission. -* -* Parameters -* pStartPacket - Pointer to start of packet payload. -* There must be at least 4 bytes free to prepend Id and Length. -* pEndPacket - Pointer to end of packet payload. -* EventId - Id of the event to send. -* -*/ -static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId) { - unsigned int NumBytes; - U32 TimeStamp; - U32 Delta; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - int Status; -#endif - -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) - SEGGER_SYSVIEW_LOCK(); -#endif - -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - if (_SYSVIEW_Globals.EnableState == 0) { - goto SendDone; - } -#else - if (_SYSVIEW_Globals.EnableState == 1) { // Enabled, no dropped packets remaining - goto Send; - } - if (_SYSVIEW_Globals.EnableState == 0) { - goto SendDone; - } - // - // Handle buffer full situations: - // Have packets been dropped before because buffer was full? - // In this case try to send and overflow packet. - // - if (_SYSVIEW_Globals.EnableState == 2) { - _TrySendOverflowPacket(); - if (_SYSVIEW_Globals.EnableState != 1) { - goto SendDone; - } - } -Send: -#endif - // - // Check if event is disabled from being recorded. - // - if (EventId < 32) { - if (_SYSVIEW_Globals.DisabledEvents & ((U32)1u << EventId)) { - goto SendDone; - } - } - // - // Prepare actual packet. - // If it is a known packet, prepend eventId only, - // otherwise prepend packet length and eventId. - // - if (EventId < 24) { - *--pStartPacket = EventId; - } else { - NumBytes = pEndPacket - pStartPacket; - if (NumBytes > 127) { - *--pStartPacket = (NumBytes >> 7); - *--pStartPacket = NumBytes | 0x80; - } else { - *--pStartPacket = NumBytes; - } - if (EventId > 127) { - *--pStartPacket = (EventId >> 7); - *--pStartPacket = EventId | 0x80; - } else { - *--pStartPacket = EventId; - } - } - // - // Compute time stamp delta and append it to packet. - // - TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; - MAKE_DELTA_32BIT(Delta); - ENCODE_U32(pEndPacket, Delta); -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - // - // Store packet in RTT buffer by overwriting old data and update time stamp - // - SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; -#else - // - // Try to store packet in RTT buffer and update time stamp when this was successful - // - Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); - if (Status) { - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; - } else { - _SYSVIEW_Globals.EnableState++; // EnableState has been 1, will be 2. Always. - } -#endif - -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - // - // Add sync and system information periodically if we are in post mortem mode - // - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - if (_SYSVIEW_Globals.PacketCount++ & (1 << SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT)) { - _SendSyncInfo(); - _SYSVIEW_Globals.PacketCount = 0; - } - _SYSVIEW_Globals.RecursionCnt = 0; - } -SendDone: - ; // Avoid "label at end of compound statement" error when using static buffer -#else -SendDone: - // - // Check if host is sending data which needs to be processed. - // Note that since this code is called for every packet, it is very time critical, so we do - // only what is really needed here, which is checking if there is any data - // - if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - _HandleIncomingPacket(); - _SYSVIEW_Globals.RecursionCnt = 0; - } - } -#endif - // -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) - SEGGER_SYSVIEW_UNLOCK(); // We are done. Unlock and return -#endif -} - -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list -/********************************************************************* -* -* _VPrintHost() -* -* Function description -* Send a format string and its parameters to the host. -* -* Parameters -* s Pointer to format string. -* Options Options to be sent to the host. -* pParamList Pointer to the list of arguments for the format string. -*/ -static int _VPrintHost(const char* s, U32 Options, va_list* pParamList) { - U32 aParas[SEGGER_SYSVIEW_MAX_ARGUMENTS]; - U32* pParas; - U32 NumArguments; - const char* p; - char c; - U8* pPayload; - U8* pPayloadStart; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - U8 HasNonScalar; - - HasNonScalar = 0; -#endif - // - // Count number of arguments by counting '%' characters in string. - // If enabled, check for non-scalar modifier flags to format string on the target. - // - p = s; - NumArguments = 0; - for (;;) { - c = *p++; - if (c == 0) { - break; - } - if (c == '%') { - c = *p; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT == 0 - aParas[NumArguments++] = va_arg(*pParamList, int); - if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { - break; - } -#else - if (c == 's') { - HasNonScalar = 1; - break; - } else { - aParas[NumArguments++] = va_arg(*pParamList, int); - if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { - break; - } - } -#endif - } - } - -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - if (HasNonScalar) { - return -1; - } -#endif - // - // Send string and parameters to host - // - { - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32); - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, Options); - ENCODE_U32(pPayload, NumArguments); - pParas = aParas; - while (NumArguments--) { - ENCODE_U32(pPayload, (*pParas)); - pParas++; - } - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); - } - return 0; -} - -/********************************************************************* -* -* _StoreChar() -* -* Function description -* Stores a character in the printf-buffer and sends the buffer when -* it is filled. -* -* Parameters -* p Pointer to the buffer description. -* c Character to be printed. -*/ -static void _StoreChar(SEGGER_SYSVIEW_PRINTF_DESC * p, char c) { - unsigned int Cnt; - U8* pPayload; - U32 Options; - - Cnt = p->Cnt; - if ((Cnt + 1u) <= SEGGER_SYSVIEW_MAX_STRING_LEN) { - *(p->pPayload++) = c; - p->Cnt = Cnt + 1u; - } - // - // Write part of string, when the buffer is full - // - if (p->Cnt == SEGGER_SYSVIEW_MAX_STRING_LEN) { - *(p->pPayloadStart) = p->Cnt; - pPayload = p->pPayload; - Options = p->Options; - ENCODE_U32(pPayload, Options); - ENCODE_U32(pPayload, 0); - _SendPacket(p->pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - p->pPayloadStart = _PreparePacket(p->pBuffer); - p->pPayload = p->pPayloadStart + 1u; - p->Cnt = 0u; - } -} - -/********************************************************************* -* -* _PrintUnsigned() -* -* Function description -* Print an unsigned integer with the given formatting into the -* formatted string. -* -* Parameters -* pBufferDesc Pointer to the buffer description. -* v Value to be printed. -* Base Base of the value. -* NumDigits Number of digits to be printed. -* FieldWidth Width of the printed field. -* FormatFlags Flags for formatting the value. -*/ -static void _PrintUnsigned(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, unsigned int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { - static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - unsigned int Div; - unsigned int Digit; - unsigned int Number; - unsigned int Width; - char c; - - Number = v; - Digit = 1u; - // - // Get actual field width - // - Width = 1u; - while (Number >= Base) { - Number = (Number / Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - // - // Print leading chars if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { - if (FieldWidth != 0u) { - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { - c = '0'; - } else { - c = ' '; - } - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, c); - } - } - } - // - // Compute Digit. - // Loop until Digit has the value of the highest digit required. - // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. - // - while (1) { - if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) - NumDigits--; - } else { - Div = v / Digit; - if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done - break; - } - } - Digit *= Base; - } - // - // Output digits - // - do { - Div = v / Digit; - v -= Div * Digit; - _StoreChar(pBufferDesc, _aV2C[Div]); - Digit /= Base; - } while (Digit); - // - // Print trailing spaces if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - } - } - } -} - -/********************************************************************* -* -* _PrintInt() -* -* Function description -* Print a signed integer with the given formatting into the -* formatted string. -* -* Parameters -* pBufferDesc Pointer to the buffer description. -* v Value to be printed. -* Base Base of the value. -* NumDigits Number of digits to be printed. -* FieldWidth Width of the printed field. -* FormatFlags Flags for formatting the value. -*/ -static void _PrintInt(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { - unsigned int Width; - int Number; - - Number = (v < 0) ? -v : v; - - // - // Get actual field width - // - Width = 1u; - while (Number >= (int)Base) { - Number = (Number / (int)Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { - FieldWidth--; - } - - // - // Print leading spaces if necessary - // - if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - } - } - } - // - // Print sign if necessary - // - if (v < 0) { - v = -v; - _StoreChar(pBufferDesc, '-'); - } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { - _StoreChar(pBufferDesc, '+'); - } else { - - } - // - // Print leading zeros if necessary - // - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, '0'); - } - } - } - // - // Print number without sign - // - _PrintUnsigned(pBufferDesc, (unsigned int)v, Base, NumDigits, FieldWidth, FormatFlags); -} - -/********************************************************************* -* -* _VPrintTarget() -* -* Function description -* Stores a formatted string. -* This data is read by the host. -* -* Parameters -* sFormat Pointer to format string. -* Options Options to be sent to the host. -* pParamList Pointer to the list of arguments for the format string. -*/ -static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) { - SEGGER_SYSVIEW_PRINTF_DESC BufferDesc; - char c; - int v; - unsigned int NumDigits; - unsigned int FormatFlags; - unsigned int FieldWidth; - U8* pPayloadStart; -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); - SEGGER_SYSVIEW_LOCK(); -#else - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); -#endif - -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - BufferDesc.pBuffer = aPacket; -#else - BufferDesc.pBuffer = _aPacket; -#endif - BufferDesc.Cnt = 0u; - BufferDesc.pPayloadStart = pPayloadStart; - BufferDesc.pPayload = BufferDesc.pPayloadStart + 1u; - BufferDesc.Options = Options; - - do { - c = *sFormat; - sFormat++; - if (c == 0u) { - break; - } - if (c == '%') { - // - // Filter out flags - // - FormatFlags = 0u; - v = 1; - do { - c = *sFormat; - switch (c) { - case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; - case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; - case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; - case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; - default: v = 0; break; - } - } while (v); - // - // filter out field with - // - FieldWidth = 0u; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - FieldWidth = (FieldWidth * 10u) + ((unsigned int)c - '0'); - } while (1); - - // - // Filter out precision (number of digits to display) - // - NumDigits = 0u; - c = *sFormat; - if (c == '.') { - sFormat++; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - NumDigits = NumDigits * 10u + ((unsigned int)c - '0'); - } while (1); - } - // - // Filter out length modifier - // - c = *sFormat; - do { - if ((c == 'l') || (c == 'h')) { - c = *sFormat; - sFormat++; - } else { - break; - } - } while (1); - // - // Handle specifiers - // - switch (c) { - case 'c': { - char c0; - v = va_arg(*pParamList, int); - c0 = (char)v; - _StoreChar(&BufferDesc, c0); - break; - } - case 'd': - v = va_arg(*pParamList, int); - _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'u': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'x': - case 'X': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); - break; - case 'p': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); - break; - case '%': - _StoreChar(&BufferDesc, '%'); - break; - default: - break; - } - sFormat++; - } else { - _StoreChar(&BufferDesc, c); - } - } while (*sFormat); - - // - // Write remaining data, if any - // - if (BufferDesc.Cnt != 0u) { - *(BufferDesc.pPayloadStart) = BufferDesc.Cnt; - ENCODE_U32(BufferDesc.pPayload, BufferDesc.Options); - ENCODE_U32(BufferDesc.pPayload, 0); - _SendPacket(BufferDesc.pPayloadStart, BufferDesc.pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - } -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - SEGGER_SYSVIEW_UNLOCK(); - RECORD_END(); -#else - RECORD_END(); -#endif -} -#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ - -/********************************************************************* -* -* SEGGER_SYSVIEW_Init() -* -* Function description -* Initializes the SYSVIEW module. -* Must be called before the Systemview Application connects to -* the system. -* -* Parameters -* SysFreq - Frequency of timestamp, usually CPU core clock frequency. -* CPUFreq - CPU core clock frequency. -* pOSAPI - Pointer to the API structure for OS-specific functions. -* pfSendSysDesc - Pointer to record system description callback function. -* -* Additional information -* This function initializes the RTT channel used to transport -* SEGGER SystemView packets. -* The channel is assigned the label "SysView" for client software -* to identify the SystemView channel. -* -* The channel is configured with the macro SEGGER_SYSVIEW_RTT_CHANNEL. -*/ -void SEGGER_SYSVIEW_Init(U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc) { -#ifdef SEGGER_RTT_SECTION - // - // Explicitly initialize the RTT Control Block if it is in its dedicated section. - // - SEGGER_RTT_Init(); -#endif -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - SEGGER_RTT_ConfigUpBuffer(SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#else - _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#endif - _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; - _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - _SYSVIEW_Globals.pOSAPI = pOSAPI; - _SYSVIEW_Globals.SysFreq = SysFreq; - _SYSVIEW_Globals.CPUFreq = CPUFreq; - _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; - _SYSVIEW_Globals.EnableState = 0; - _SYSVIEW_Globals.PacketCount = 0; -#else // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - SEGGER_RTT_ConfigUpBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); - SEGGER_RTT_ConfigDownBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#else - _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); - _SYSVIEW_Globals.DownChannel = _SYSVIEW_Globals.UpChannel; - SEGGER_RTT_ConfigDownBuffer (_SYSVIEW_Globals.DownChannel, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#endif - _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; - _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - _SYSVIEW_Globals.pOSAPI = pOSAPI; - _SYSVIEW_Globals.SysFreq = SysFreq; - _SYSVIEW_Globals.CPUFreq = CPUFreq; - _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; - _SYSVIEW_Globals.EnableState = 0; -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SetRAMBase() -* -* Function description -* Sets the RAM base address, which is subtracted from IDs in order -* to save bandwidth. -* -* Parameters -* RAMBaseAddress - Lowest RAM Address. (i.e. 0x20000000 on most Cortex-M) -*/ -void SEGGER_SYSVIEW_SetRAMBase(U32 RAMBaseAddress) { - _SYSVIEW_Globals.RAMBaseAddress = RAMBaseAddress; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordVoid() -* -* Function description -* Formats and sends a SystemView packet with an empty payload. -* -* Parameters -* EventID - SystemView event ID. -*/ -void SEGGER_SYSVIEW_RecordVoid(unsigned int EventID) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32() -* -* Function description -* Formats and sends a SystemView packet containing a single U32 -* parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Value - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32(unsigned int EventID, U32 Value) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Value); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x2() -* -* Function description -* Formats and sends a SystemView packet containing 2 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x2(unsigned int EventID, U32 Para0, U32 Para1) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x3() -* -* Function description -* Formats and sends a SystemView packet containing 3 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x3(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 3 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x4() -* -* Function description -* Formats and sends a SystemView packet containing 4 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x4(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x5() -* -* Function description -* Formats and sends a SystemView packet containing 5 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x5(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x6() -* -* Function description -* Formats and sends a SystemView packet containing 6 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x6(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 6 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x7() -* -* Function description -* Formats and sends a SystemView packet containing 7 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x7(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 7 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x8() -* -* Function description -* Formats and sends a SystemView packet containing 8 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x8(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x9() -* -* Function description -* Formats and sends a SystemView packet containing 9 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -* Para8 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x9(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 9 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - ENCODE_U32(pPayload, Para8); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x10() -* -* Function description -* Formats and sends a SystemView packet containing 10 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -* Para8 - The 32-bit parameter encoded to SystemView packet payload. -* Para9 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x10(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 10 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - ENCODE_U32(pPayload, Para8); - ENCODE_U32(pPayload, Para9); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordString() -* -* Function description -* Formats and sends a SystemView packet containing a string. -* -* Parameters -* EventID - SystemView event ID. -* pString - The string to be sent in the SystemView packet payload. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than SEGGER_SYSVIEW_MAX_STRING_LEN bytes will be encoded to the payload. -*/ -void SEGGER_SYSVIEW_RecordString(unsigned int EventID, const char* pString) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, pString, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Start() -* -* Function description -* Start recording SystemView events. -* -* This function is triggered by the SystemView Application on connect. -* For single-shot or post-mortem mode recording, it needs to be called -* by the application. -* -* Additional information -* This function enables transmission of SystemView packets recorded -* by subsequent trace calls and records a SystemView Start event. -* -* As part of start, a SystemView Init packet is sent, containing the system -* frequency. The list of current tasks, the current system time and the -* system description string is sent, too. -* -* Notes -* SEGGER_SYSVIEW_Start and SEGGER_SYSVIEW_Stop do not nest. -* When SEGGER_SYSVIEW_CAN_RESTART is 1, each received start command -* records the system information. This is required to enable restart -* of recordings when SystemView unexpectedly disconnects without sending -* a stop command before. -*/ -void SEGGER_SYSVIEW_Start(void) { -#if (SEGGER_SYSVIEW_CAN_RESTART == 0) - if (_SYSVIEW_Globals.EnableState == 0) { -#endif - _SYSVIEW_Globals.EnableState = 1; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - _SendSyncInfo(); -#else - SEGGER_SYSVIEW_LOCK(); - SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, _abSync, 10); - SEGGER_SYSVIEW_UNLOCK(); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); - SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - } - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } - SEGGER_SYSVIEW_RecordSystime(); - SEGGER_SYSVIEW_SendTaskList(); - SEGGER_SYSVIEW_SendNumModules(); -#endif -#if (SEGGER_SYSVIEW_CAN_RESTART == 0) - } -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Stop() -* -* Function description -* Stop recording SystemView events. -* -* This function is triggered by the SystemView Application on disconnect. -* For single-shot or post-mortem mode recording, it can be called -* by the application. -* -* Additional information -* This function disables transmission of SystemView packets recorded -* by subsequent trace calls. If transmission is enabled when -* this function is called, a single SystemView Stop event is recorded -* to the trace, send, and then trace transmission is halted. -*/ -void SEGGER_SYSVIEW_Stop(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - if (_SYSVIEW_Globals.EnableState) { - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TRACE_STOP); - _SYSVIEW_Globals.EnableState = 0; - } - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_GetChannelID() -* -* Function description -* Returns the RTT / channel ID used by SystemView. -*/ -int SEGGER_SYSVIEW_GetChannelID(void) { - return CHANNEL_ID_UP; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_GetSysDesc() -* -* Function description -* Triggers a send of the system information and description. -* -*/ -void SEGGER_SYSVIEW_GetSysDesc(void) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendTaskInfo() -* -* Function description -* Send a Task Info Packet, containing TaskId for identification, -* task priority and task name. -* -* Parameters -* pInfo - Pointer to task information to send. -*/ -void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + 32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); - ENCODE_U32(pPayload, pInfo->Prio); - pPayload = _EncodeStr(pPayload, pInfo->sName, 32); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_INFO); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); - ENCODE_U32(pPayload, pInfo->StackBase); - ENCODE_U32(pPayload, pInfo->StackSize); - ENCODE_U32(pPayload, 0); // Stack End, future use - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendTaskList() -* -* Function description -* Send all tasks descriptors to the host. -*/ -void SEGGER_SYSVIEW_SendTaskList(void) { - if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfSendTaskList) { - _SYSVIEW_Globals.pOSAPI->pfSendTaskList(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendSysDesc() -* -* Function description -* Send the system description string to the host. -* The system description is used by the Systemview Application -* to identify the current application and handle events accordingly. -* -* The system description is usually called by the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* sSysDesc - Pointer to the 0-terminated system description string. -* -* Additional information -* One system description string may not exceed SEGGER_SYSVIEW_MAX_STRING_LEN characters. -* Multiple description strings can be recorded. -* -* The Following items can be described in a system description string. -* Each item is identified by its identifier, followed by '=' and the value. -* Items are separated by ','. -*/ -void SEGGER_SYSVIEW_SendSysDesc(const char *sSysDesc) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, sSysDesc, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_SYSDESC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordSystime() -* -* Function description -* Formats and sends a SystemView Systime containing a single U64 or U32 -* parameter payload. -*/ -void SEGGER_SYSVIEW_RecordSystime(void) { - U64 Systime; - - if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfGetTime) { - Systime = _SYSVIEW_Globals.pOSAPI->pfGetTime(); - SEGGER_SYSVIEW_RecordU32x2(SYSVIEW_EVTID_SYSTIME_US, - (U32)(Systime), - (U32)(Systime >> 32)); - } else { - SEGGER_SYSVIEW_RecordU32(SYSVIEW_EVTID_SYSTIME_CYCLES, SEGGER_SYSVIEW_GET_TIMESTAMP()); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEnterISR() -* -* Function description -* Format and send an ISR entry event. -* -* Additional information -* Example packets sent -* 02 0F 50 // ISR(15) Enter. Timestamp is 80 (0x50) -*/ -void SEGGER_SYSVIEW_RecordEnterISR(void) { - unsigned v; - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - v = SEGGER_SYSVIEW_GET_INTERRUPT_ID(); - ENCODE_U32(pPayload, v); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_ISR_ENTER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitISR() -* -* Function description -* Format and send an ISR exit event. -* -* Additional information -* Format as follows: -* 03 // Max. packet len is 6 -* -* Example packets sent -* 03 20 // ISR Exit. Timestamp is 32 (0x20) -*/ -void SEGGER_SYSVIEW_RecordExitISR(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_EXIT); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitISRToScheduler() -* -* Function description -* Format and send an ISR exit into scheduler event. -* -* Additional information -* Format as follows: -* 18 // Max. packet len is 6 -* -* Example packets sent -* 18 20 // ISR Exit to Scheduler. Timestamp is 32 (0x20) -*/ -void SEGGER_SYSVIEW_RecordExitISRToScheduler(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_TO_SCHEDULER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEnterTimer() -* -* Function description -* Format and send a Timer entry event. -* -* Parameters -* TimerId - Id of the timer which starts. -*/ -void SEGGER_SYSVIEW_RecordEnterTimer(U32 TimerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(TimerId)); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TIMER_ENTER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitTimer() -* -* Function description -* Format and send a Timer exit event. -*/ -void SEGGER_SYSVIEW_RecordExitTimer(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TIMER_EXIT); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEndCall() -* -* Function description -* Format and send an End API Call event without return value. -* -* Parameters -* EventID - Id of API function which ends. -*/ -void SEGGER_SYSVIEW_RecordEndCall(unsigned int EventID) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, EventID); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEndCallU32() -* -* Function description -* Format and send an End API Call event with return value. -* -* Parameters -* EventID - Id of API function which ends. -* Para0 - Return value which will be returned by the API function. -*/ -void SEGGER_SYSVIEW_RecordEndCallU32(unsigned int EventID, U32 Para0) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, EventID); - ENCODE_U32(pPayload, Para0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnIdle() -* -* Function description -* Record an Idle event. -*/ -void SEGGER_SYSVIEW_OnIdle(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_IDLE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskCreate() -* -* Function description -* Record a Task Create event. The Task Create event corresponds -* to creating a task in the OS. -* -* Parameters -* TaskId - Task ID of created task. -*/ -void SEGGER_SYSVIEW_OnTaskCreate(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_CREATE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskTerminate() -* -* Function description -* Record a Task termination event. -* The Task termination event corresponds to terminating a task in -* the OS. If the TaskId is the currently active task, -* SEGGER_SYSVIEW_OnTaskStopExec may be used, either. -* -* Parameters -* TaskId - Task ID of terminated task. -*/ -void SEGGER_SYSVIEW_OnTaskTerminate(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_TERMINATE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStartExec() -* -* Function description -* Record a Task Start Execution event. The Task Start event -* corresponds to when a task has started to execute rather than -* when it is ready to execute. -* -* Parameters -* TaskId - Task ID of task that started to execute. -*/ -void SEGGER_SYSVIEW_OnTaskStartExec(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_EXEC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStopExec() -* -* Function description -* Record a Task Stop Execution event. The Task Stop event -* corresponds to when a task stops executing and terminates. -*/ -void SEGGER_SYSVIEW_OnTaskStopExec(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TASK_STOP_EXEC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStartReady() -* -* Function description -* Record a Task Start Ready event. -* -* Parameters -* TaskId - Task ID of task that started to execute. -*/ -void SEGGER_SYSVIEW_OnTaskStartReady(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_READY); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStopReady() -* -* Function description -* Record a Task Stop Ready event. -* -* Parameters -* TaskId - Task ID of task that completed execution. -* Cause - Reason for task to stop (i.e. Idle/Sleep) -*/ -void SEGGER_SYSVIEW_OnTaskStopReady(U32 TaskId, unsigned int Cause) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - ENCODE_U32(pPayload, Cause); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_STOP_READY); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_MarkStart() -* -* Function description -* Record a Performance Marker Start event to start measuring runtime. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_MarkStart(unsigned MarkerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_START); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_MarkStop() -* -* Function description -* Record a Performance Marker Stop event to stop measuring runtime. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_MarkStop(unsigned MarkerId) { - U8 * pPayload; - U8 * pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_STOP); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Mark() -* -* Function description -* Record a Performance Marker intermediate event. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_Mark(unsigned int MarkerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_MARK); - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_NameMarker() -* -* Function description -* Send the name of a Performance Marker to be displayed in SystemView. -* -* Marker names are usually set in the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* MarkerId - User defined ID for the marker. -* sName - Pointer to the marker name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) -*/ -void SEGGER_SYSVIEW_NameMarker(unsigned int MarkerId, const char* sName) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_NAME_MARKER); - ENCODE_U32(pPayload, MarkerId); - pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_NameResource() -* -* Function description -* Send the name of a resource to be displayed in SystemView. -* -* Marker names are usually set in the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* ResourceId - Id of the resource to be named. i.e. its address. -* sName - Pointer to the resource name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) -*/ -void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(ResourceId)); - pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NAME_RESOURCE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendPacket() -* -* Function description -* Send an event packet. -* -* Parameters -* pPacket - Pointer to the start of the packet. -* pPayloadEnd - Pointer to the end of the payload. -* Make sure there are at least 5 bytes free after the payload. -* EventId - Id of the event packet. -* -* Return value -* !=0: Success, Message sent. -* ==0: Buffer full, Message *NOT* sent. -*/ -int SEGGER_SYSVIEW_SendPacket(U8* pPacket, U8* pPayloadEnd, unsigned int EventId) { -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) - SEGGER_SYSVIEW_LOCK(); -#endif - _SendPacket(pPacket + 4, pPayloadEnd, EventId); -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) - SEGGER_SYSVIEW_UNLOCK(); -#endif - return 0; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeU32() -* -* Function description -* Encode a U32 in variable-length format. -* -* Parameters -* pPayload - Pointer to where U32 will be encoded. -* Value - The 32-bit value to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -*/ -U8* SEGGER_SYSVIEW_EncodeU32(U8* pPayload, U32 Value) { - ENCODE_U32(pPayload, Value); - return pPayload; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeString() -* -* Function description -* Encode a string in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* s - String to encode. -* MaxLen - Maximum number of characters to encode from string. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than 1 + MaxLen bytes will be encoded to the payload. -*/ -U8* SEGGER_SYSVIEW_EncodeString(U8* pPayload, const char* s, unsigned int MaxLen) { - return _EncodeStr(pPayload, s, MaxLen); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeData() -* -* Function description -* Encode a byte buffer in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pSrc - Pointer to data buffer to be encoded. -* NumBytes - Number of bytes in the buffer to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The data is encoded as a count byte followed by the contents -* of the data buffer. -* Make sure NumBytes + 1 bytes are free for the payload. -*/ -U8* SEGGER_SYSVIEW_EncodeData(U8 *pPayload, const char* pSrc, unsigned int NumBytes) { - return _EncodeData(pPayload, pSrc, NumBytes); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeId() -* -* Function description -* Encode a 32-bit Id in shrunken variable-length format. -* -* Parameters -* pPayload - Pointer to where the Id will be encoded. -* Id - The 32-bit value to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The parameters to shrink an Id can be configured in -* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). -* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. -* (i.e. 0x20000000 when all Ids are an address in this RAM) -* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to -* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) -*/ -U8* SEGGER_SYSVIEW_EncodeId(U8* pPayload, U32 Id) { - Id = SHRINK_ID(Id); - ENCODE_U32(pPayload, Id); - return pPayload; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ShrinkId() -* -* Function description -* Get the shrunken value of an Id for further processing like in -* SEGGER_SYSVIEW_NameResource(). -* -* Parameters -* Id - The 32-bit value to be shrunken. -* -* Return value -* Shrunken Id. -* -* Additional information -* The parameters to shrink an Id can be configured in -* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). -* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. -* (i.e. 0x20000000 when all Ids are an address in this RAM) -* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to -* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) -*/ -U32 SEGGER_SYSVIEW_ShrinkId(U32 Id) { - return SHRINK_ID(Id); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RegisterModule() -* -* Function description -* Register a middleware module for recording its events. -* -* Parameters -* pModule - The middleware module information. -* -* Additional information -* SEGGER_SYSVIEW_MODULE elements: -* sDescription - Pointer to a string containing the module name and optionally the module event description. -* NumEvents - Number of events the module wants to register. -* EventOffset - Offset to be added to the event Ids. Out parameter, set by this function. Do not modify after calling this function. -* pfSendModuleDesc - Callback function pointer to send more detailed module description to SystemView Application. -* pNext - Pointer to next registered module. Out parameter, set by this function. Do not modify after calling this function. -*/ -void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { - SEGGER_SYSVIEW_LOCK(); - if (_pFirstModule == 0) { - // - // No module registered, yet. - // Start list with new module. - // EventOffset is the base offset for modules - // - pModule->EventOffset = MODULE_EVENT_OFFSET; - pModule->pNext = 0; - _pFirstModule = pModule; - _NumModules = 1; - } else { - // - // Registreded module(s) present. - // Prepend new module in list. - // EventOffset set from number of events and offset of previous module. - // - pModule->EventOffset = _pFirstModule->EventOffset + _pFirstModule->NumEvents; - pModule->pNext = _pFirstModule; - _pFirstModule = pModule; - _NumModules++; - } - SEGGER_SYSVIEW_SendModule(0); - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } - SEGGER_SYSVIEW_UNLOCK(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordModuleDescription() -* -* Function description -* Sends detailed information of a registered module to the host. -* -* Parameters -* pModule - Pointer to the described module. -* sDescription - Pointer to a description string. -*/ -void SEGGER_SYSVIEW_RecordModuleDescription(const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription) { - U8 ModuleId; - SEGGER_SYSVIEW_MODULE* p; - - p = _pFirstModule; - ModuleId = 0; - do { - if (p == pModule) { - break; - } - ModuleId++; - p = p->pNext; - } while (p); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - // - // Send module description - // Send event offset and number of events - // - ENCODE_U32(pPayload, ModuleId); - ENCODE_U32(pPayload, (pModule->EventOffset)); - pPayload = _EncodeStr(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); - RECORD_END(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendModule() -* -* Function description -* Sends the information of a registered module to the host. -* -* Parameters -* ModuleId - Id of the requested module. -*/ -void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { - SEGGER_SYSVIEW_MODULE* pModule; - U32 n; - - if (_pFirstModule != 0) { - pModule = _pFirstModule; - for (n = 0; n < ModuleId; n++) { - pModule = pModule->pNext; - if (pModule == 0) { - break; - } - } - if (pModule != 0) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - // - // Send module description - // Send event offset and number of events - // - ENCODE_U32(pPayload, ModuleId); - ENCODE_U32(pPayload, (pModule->EventOffset)); - pPayload = _EncodeStr(pPayload, pModule->sModule, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); - RECORD_END(); - } - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendModuleDescription() -* -* Function description -* Triggers a send of the registered module descriptions. -* -*/ -void SEGGER_SYSVIEW_SendModuleDescription(void) { - SEGGER_SYSVIEW_MODULE* pModule; - - if (_pFirstModule != 0) { - pModule = _pFirstModule; - do { - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } - pModule = pModule->pNext; - } while (pModule); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendNumModules() -* -* Function description -* Send the number of registered modules to the host. -*/ -void SEGGER_SYSVIEW_SendNumModules(void) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2*SEGGER_SYSVIEW_QUANTA_U32); - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _NumModules); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NUMMODULES); - RECORD_END(); -} - -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfHostEx() -* -* Function description -* Print a string which is formatted on the host by the SystemView Application -* with Additional information. -* -* Parameters -* s - String to be formatted. -* Options - Options for the string. i.e. Log level. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, Options); - r = _VPrintHost(s, Options, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, Options); - _VPrintTarget(s, Options, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, Options); - _VPrintHost(s, Options, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfHost() -* -* Function description -* Print a string which is formatted on the host by the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_WarnfHost() -* -* Function description -* Print a warnin string which is formatted on the host by -* the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ErrorfHost() -* -* Function description -* Print an error string which is formatted on the host by -* the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfTargetEx() -* -* Function description -* Print a string which is formatted on the target before sent to -* the host with Additional information. -* -* Parameters -* s - String to be formatted. -* Options - Options for the string. i.e. Log level. -*/ -void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { - va_list ParamList; - - va_start(ParamList, Options); - _VPrintTarget(s, Options, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfTarget() -* -* Function description -* Print a string which is formatted on the target before sent to -* the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_WarnfTarget() -* -* Function description -* Print a warning string which is formatted on the target before -* sent to the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ErrorfTarget() -* -* Function description -* Print an error string which is formatted on the target before -* sent to the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); -} -#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF - -/********************************************************************* -* -* SEGGER_SYSVIEW_Print() -* -* Function description -* Print a string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Print(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_LOG); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Warn() -* -* Function description -* Print a warning string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Warn(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_WARNING); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Error() -* -* Function description -* Print an error string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Error(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ERROR); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EnableEvents() -* -* Function description -* Enable standard SystemView events to be generated. -* -* Parameters -* EnableMask - Events to be enabled. -*/ -void SEGGER_SYSVIEW_EnableEvents(U32 EnableMask) { - _SYSVIEW_Globals.DisabledEvents &= ~EnableMask; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_DisableEvents() -* -* Function description -* Disable standard SystemView events to not be generated. -* -* Parameters -* DisableMask - Events to be disabled. -*/ -void SEGGER_SYSVIEW_DisableEvents(U32 DisableMask) { - _SYSVIEW_Globals.DisabledEvents |= DisableMask; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_IsStarted() -* -* Function description -* Handle incoming packets if any and check if recording is started. -* -* Return value -* 0: Recording not started. -* > 0: Recording started. -*/ -int SEGGER_SYSVIEW_IsStarted(void) { -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - // - // Check if host is sending data which needs to be processed. - // - if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - _HandleIncomingPacket(); - _SYSVIEW_Globals.RecursionCnt = 0; - } - } -#endif - return _SYSVIEW_Globals.EnableState; -} - - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.h deleted file mode 100644 index a42802498..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW.h +++ /dev/null @@ -1,350 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW.h -Purpose : System visualization API. -Revision: $Rev: 21292 $ -*/ - -#ifndef SEGGER_SYSVIEW_H -#define SEGGER_SYSVIEW_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER.h" -#include "SEGGER_SYSVIEW_ConfDefaults.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -#define SEGGER_SYSVIEW_MAJOR 3 -#define SEGGER_SYSVIEW_MINOR 10 -#define SEGGER_SYSVIEW_REV 0 -#define SEGGER_SYSVIEW_VERSION ((SEGGER_SYSVIEW_MAJOR * 10000) + (SEGGER_SYSVIEW_MINOR * 100) + SEGGER_SYSVIEW_REV) - -#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp. -#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet. - -#define SEGGER_SYSVIEW_LOG (0u) -#define SEGGER_SYSVIEW_WARNING (1u) -#define SEGGER_SYSVIEW_ERROR (2u) -#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6) - -#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4 -// -// SystemView events. First 32 IDs from 0 .. 31 are reserved for these -// -#define SYSVIEW_EVTID_NOP 0 // Dummy packet. -#define SYSVIEW_EVTID_OVERFLOW 1 -#define SYSVIEW_EVTID_ISR_ENTER 2 -#define SYSVIEW_EVTID_ISR_EXIT 3 -#define SYSVIEW_EVTID_TASK_START_EXEC 4 -#define SYSVIEW_EVTID_TASK_STOP_EXEC 5 -#define SYSVIEW_EVTID_TASK_START_READY 6 -#define SYSVIEW_EVTID_TASK_STOP_READY 7 -#define SYSVIEW_EVTID_TASK_CREATE 8 -#define SYSVIEW_EVTID_TASK_INFO 9 -#define SYSVIEW_EVTID_TRACE_START 10 -#define SYSVIEW_EVTID_TRACE_STOP 11 -#define SYSVIEW_EVTID_SYSTIME_CYCLES 12 -#define SYSVIEW_EVTID_SYSTIME_US 13 -#define SYSVIEW_EVTID_SYSDESC 14 -#define SYSVIEW_EVTID_MARK_START 15 -#define SYSVIEW_EVTID_MARK_STOP 16 -#define SYSVIEW_EVTID_IDLE 17 -#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18 -#define SYSVIEW_EVTID_TIMER_ENTER 19 -#define SYSVIEW_EVTID_TIMER_EXIT 20 -#define SYSVIEW_EVTID_STACK_INFO 21 -#define SYSVIEW_EVTID_MODULEDESC 22 - -#define SYSVIEW_EVTID_INIT 24 -#define SYSVIEW_EVTID_NAME_RESOURCE 25 -#define SYSVIEW_EVTID_PRINT_FORMATTED 26 -#define SYSVIEW_EVTID_NUMMODULES 27 -#define SYSVIEW_EVTID_END_CALL 28 -#define SYSVIEW_EVTID_TASK_TERMINATE 29 - -#define SYSVIEW_EVTID_EX 31 -// -// SystemView extended events. Sent with ID 31. -// -#define SYSVIEW_EVTID_EX_MARK 0 -#define SYSVIEW_EVTID_EX_NAME_MARKER 1 -// -// Event masks to disable/enable events -// -#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP) -#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW) -#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER) -#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT) -#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC) -#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC) -#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY) -#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY) -#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE) -#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO) -#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START) -#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP) -#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES) -#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US) -#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC) -#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START) -#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP) -#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE) -#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER) -#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER) -#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) -#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) -#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) - -#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) -#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) -#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) -#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES) -#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL) -#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE) - -#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX) - -#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \ - | SYSVIEW_EVTMASK_ISR_EXIT \ - | SYSVIEW_EVTMASK_ISR_TO_SCHEDULER) -#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \ - | SYSVIEW_EVTMASK_TASK_STOP_EXEC \ - | SYSVIEW_EVTMASK_TASK_START_READY \ - | SYSVIEW_EVTMASK_TASK_STOP_READY \ - | SYSVIEW_EVTMASK_TASK_CREATE \ - | SYSVIEW_EVTMASK_TASK_INFO \ - | SYSVIEW_EVTMASK_STACK_INFO \ - | SYSVIEW_EVTMASK_TASK_TERMINATE) - -/********************************************************************* -* -* Structures -* -********************************************************************** -*/ - -typedef struct { - U32 TaskID; - const char* sName; - U32 Prio; - U32 StackBase; - U32 StackSize; -} SEGGER_SYSVIEW_TASKINFO; - -typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; - -struct SEGGER_SYSVIEW_MODULE_STRUCT { - const char* sModule; - U32 NumEvents; - U32 EventOffset; - void (*pfSendModuleDesc)(void); - SEGGER_SYSVIEW_MODULE* pNext; -}; - -typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void); - - -/********************************************************************* -* -* Global data -* -********************************************************************** -*/ - -#ifdef EXTERN - #undef EXTERN -#endif - -#ifndef SEGGER_SYSVIEW_C // Defined in SEGGER_SYSVIEW.c which includes this header beside other C-files - #define EXTERN extern -#else - #define EXTERN -#endif - -EXTERN unsigned int SEGGER_SYSVIEW_TickCnt; -EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; - -#undef EXTERN - -/********************************************************************* -* -* API functions -* -********************************************************************** -*/ - -typedef struct { - U64 (*pfGetTime) (void); - void (*pfSendTaskList) (void); -} SEGGER_SYSVIEW_OS_API; - -/********************************************************************* -* -* Control and initialization functions -*/ -void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc); -void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress); -void SEGGER_SYSVIEW_Start (void); -void SEGGER_SYSVIEW_Stop (void); -void SEGGER_SYSVIEW_GetSysDesc (void); -void SEGGER_SYSVIEW_SendTaskList (void); -void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); -void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); -int SEGGER_SYSVIEW_IsStarted (void); -int SEGGER_SYSVIEW_GetChannelID (void); - -/********************************************************************* -* -* Event recording functions -*/ -void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId); -void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0); -void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1); -void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2); -void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3); -void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4); -void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5); -void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6); -void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7); -void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8); -void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9); -void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString); -void SEGGER_SYSVIEW_RecordSystime (void); -void SEGGER_SYSVIEW_RecordEnterISR (void); -void SEGGER_SYSVIEW_RecordExitISR (void); -void SEGGER_SYSVIEW_RecordExitISRToScheduler (void); -void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId); -void SEGGER_SYSVIEW_RecordExitTimer (void); -void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID); -void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0); - -void SEGGER_SYSVIEW_OnIdle (void); -void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStopExec (void); -void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause); -void SEGGER_SYSVIEW_MarkStart (unsigned int MarkerId); -void SEGGER_SYSVIEW_MarkStop (unsigned int MarkerId); -void SEGGER_SYSVIEW_Mark (unsigned int MarkerId); -void SEGGER_SYSVIEW_NameMarker (unsigned int MarkerId, const char* sName); - -void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); - -int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); - -/********************************************************************* -* -* Event parameter encoding functions -*/ -U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value); -U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len); -U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen); -U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id); -U32 SEGGER_SYSVIEW_ShrinkId (U32 Id); - - -/********************************************************************* -* -* Middleware module registration -*/ -void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule); -void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription); -void SEGGER_SYSVIEW_SendModule (U8 ModuleId); -void SEGGER_SYSVIEW_SendModuleDescription (void); -void SEGGER_SYSVIEW_SendNumModules (void); - -/********************************************************************* -* -* printf-Style functions -*/ -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list -void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); -void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); -void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); -void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); -void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); -void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); -void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); -void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); -#endif - -void SEGGER_SYSVIEW_Print (const char* s); -void SEGGER_SYSVIEW_Warn (const char* s); -void SEGGER_SYSVIEW_Error (const char* s); - -/********************************************************************* -* -* Run-time configuration functions -*/ -void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask); -void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask); - -/********************************************************************* -* -* Application-provided functions -*/ -void SEGGER_SYSVIEW_Conf (void); -U32 SEGGER_SYSVIEW_X_GetTimestamp (void); -U32 SEGGER_SYSVIEW_X_GetInterruptId (void); - -void SEGGER_SYSVIEW_X_StartComm (void); -void SEGGER_SYSVIEW_X_OnEventRecorded (unsigned NumBytes); - -#ifdef __cplusplus -} -#endif - -/********************************************************************* -* -* Compatibility API defines -*/ -#define SEGGER_SYSVIEW_OnUserStart SEGGER_SYSVIEW_MarkStart -#define SEGGER_SYSVIEW_OnUserStop SEGGER_SYSVIEW_MarkStop - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Conf.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Conf.h deleted file mode 100644 index 689df7039..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Conf.h +++ /dev/null @@ -1,69 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_Conf.h -Purpose : SEGGER SystemView configuration file. - Set defines which deviate from the defaults (see SEGGER_SYSVIEW_ConfDefaults.h) here. -Revision: $Rev: 21292 $ - -Additional information: - Required defines which must be set are: - SEGGER_SYSVIEW_GET_TIMESTAMP - SEGGER_SYSVIEW_GET_INTERRUPT_ID - For known compilers and cores, these might be set to good defaults - in SEGGER_SYSVIEW_ConfDefaults.h. - - SystemView needs a (nestable) locking mechanism. - If not defined, the RTT locking mechanism is used, - which then needs to be properly configured. -*/ - -#ifndef SEGGER_SYSVIEW_CONF_H -#define SEGGER_SYSVIEW_CONF_H - -#include - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ -extern uint32_t SystemCoreClock; - -#define SEGGER_SYSVIEW_APP_NAME "embOS start project" -#define SEGGER_SYSVIEW_DEVICE_NAME "STM32H743XI" -#define SEGGER_SYSVIEW_ID_BASE 0x20000000 -#define SEGGER_SYSVIEW_TIMESTAMP_FREQ SystemCoreClock -#define SEGGER_SYSVIEW_CPU_FREQ SystemCoreClock -#define SEGGER_SYSVIEW_SYSDESC0 "I#15=SysTick" - -#endif // SEGGER_SYSVIEW_CONF_H - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h deleted file mode 100644 index 0c650e8d9..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h +++ /dev/null @@ -1,533 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW_ConfDefaults.h -Purpose : Defines defaults for configurable defines used in - SEGGER SystemView. -Revision: $Rev: 21319 $ -*/ - -#ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H -#define SEGGER_SYSVIEW_CONFDEFAULTS_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER_SYSVIEW_Conf.h" -#include "SEGGER_RTT_Conf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -// -// Use auto-detection for SEGGER_SYSVIEW_CORE define -// based on compiler-/toolchain-specific defines -// to define SEGGER_SYSVIEW_GET_INTERRUPT_ID and SEGGER_SYSVIEW_GET_TIMESTAMP -// -#define SEGGER_SYSVIEW_CORE_OTHER 0 -#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 -#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 -#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX -#ifndef SEGGER_SYSVIEW_CORE - #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __SEGGER_CC__) || (defined __GNUC__) || (defined __clang__) - #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__ICCARM__) - #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) \ - || (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) \ - || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) \ - || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) \ - || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__CC_ARM) - #if (defined(__TARGET_ARCH_6S_M)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__TI_ARM__) - #ifdef __TI_ARM_V6M0__ - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__ICCRX__) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX - #elif defined(__RX) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX - #endif - - #ifndef SEGGER_SYSVIEW_CORE - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER - #endif -#endif - - -/********************************************************************* -* -* Defines, defaults -* -********************************************************************** -*/ -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_APP_NAME -* -* Description -* The application name to be displayed in SystemView. -* Default -* "SystemView-enabled Application" -* Notes -* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). -*/ -#ifndef SEGGER_SYSVIEW_APP_NAME - #define SEGGER_SYSVIEW_APP_NAME "SystemView-enabled Application" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_DEVICE_NAME -* -* Description -* The target device name to be displayed in SystemView. -* Default -* "undefined device" -* Notes -* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). -*/ -#ifndef SEGGER_SYSVIEW_DEVICE_NAME - #define SEGGER_SYSVIEW_DEVICE_NAME "undefined device" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_GET_INTERRUPT_ID() -* -* Description -* Function macro to retrieve the Id of the currently active -* interrupt. -* Default -* Call user-supplied function SEGGER_SYSVIEW_X_GetInterruptId(). -* Notes -* For some known compilers and cores, a ready-to-use, core-specific -* default is set. -* ARMv7M: Read ICSR[8:0] (active vector) -* ARMv6M: Read ICSR[5:0] (active vector) -*/ -#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID - #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) - #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 - #if defined(__ICCARM__) - #if (__VER__ > 6010000) - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. - #endif - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) - #endif - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. - #endif -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_GET_TIMESTAMP() -* -* Description -* Function macro to retrieve a system timestamp for SYSVIEW events. -* Default -* Call user-supplied function SEGGER_SYSVIEW_X_GetTimestamp(). -* Notes -* For some known compilers and cores, a ready-to-use, core-specific -* default is set. -* ARMv7M: Read Cortex-M Cycle Count register. -* -* The system timestamp clock frequency has to be passed in -* SEGGER_SYSVIEW_Init(). -*/ -#ifndef SEGGER_SYSVIEW_GET_TIMESTAMP - #if defined (SEGGER_SYSVIEW_CORE) && (SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3) - #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. - #else - #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function - #endif -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_TIMESTAMP_BITS -* -* Description -* Number of valid (low-order) bits delivered in system timestamp. -* Default -* 32 -* Notes -* Value has to match system timestamp clock source. -*/ -// Define number of valid bits low-order delivered by clock source. -#ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS - #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_RTT_CHANNEL -* -* Description -* The RTT channel that SystemView will use. -* Default -* 0: Auto selection. -* Notes -* Value has to be lower than SEGGER_RTT_MAX_NUM_UP_BUFFERS. -*/ -#ifndef SEGGER_SYSVIEW_RTT_CHANNEL - #define SEGGER_SYSVIEW_RTT_CHANNEL 0 -#endif -// Sanity check of RTT channel -#if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2) - #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!" -#elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) - #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_RTT_BUFFER_SIZE -* -* Description -* Number of bytes that SystemView uses for the RTT buffer. -* Default -* 1024 -*/ -#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE - #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_SECTION -* -* Description -* Section to place the SystemView RTT Buffer into. -* Default -* undefined: Do not place into a specific section. -* Notes -* If SEGGER_RTT_SECTION is defined, the default changes to use -* this section for the SystemView RTT Buffer, too. -*/ -#if !(defined SEGGER_SYSVIEW_SECTION) && (defined SEGGER_RTT_SECTION) - #define SEGGER_SYSVIEW_SECTION SEGGER_RTT_SECTION -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE -* -* Description -* Largest cache line size (in bytes) in the target system. -* Default -* 0 -* Notes -* Required in systems with caches to make sure that the SystemView -* RTT buffer can be aligned accordingly. -*/ -#ifndef SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #define SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ID_BASE -* -* Description -* Lowest Id reported by the application. -* Default -* 0 -* Notes -* Value is usually subtracted from mailboxes, semaphores, tasks, -* .... addresses, to compress event parameters. -* Should be the lowest RAM address of the system. -*/ -#ifndef SEGGER_SYSVIEW_ID_BASE - #define SEGGER_SYSVIEW_ID_BASE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ID_SHIFT -* -* Description -* Number of bits to shift Ids. -* Default -* 0 -* Notes -* Ids are shifted to compress event parameters. -* Should match the alignment of Ids (addresses), -* e.g. 2 when Ids are 4 byte aligned. -*/ -#ifndef SEGGER_SYSVIEW_ID_SHIFT - #define SEGGER_SYSVIEW_ID_SHIFT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_ARGUMENTS -* -* Description -* Maximum number of arguments which are handled with SystemView -* print routines or may be encoded in one recording function. -* routines. -* Default -* 16 -*/ -#ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS - #define SEGGER_SYSVIEW_MAX_ARGUMENTS 16 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_STRING_LEN -* -* Description -* Maximum string length which can be used in SystemView print and -* system description routines. -* Default -* 128 -*/ -#ifndef SEGGER_SYSVIEW_MAX_STRING_LEN - #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT -* -* Description -* If enabled, on SEGGER_SYSVIEW_PrintHost, check the format string -* and if it includes unsupported formatters, use formatting on the -* target instead. -* Default -* 0: Disabled. -*/ -#ifndef SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - #define SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_USE_INTERNAL_RECORDER -* -* Description -* If set, an internal recorder, such as UART or IP is used. -* Default -* 0: Disabled. -* Notes -* Convenience define to be used by SEGGER_SYSVIEW_Conf(), -* such as in embOS configuration to enable Cortex-M cycle counter. -*/ -#ifndef SEGGER_SYSVIEW_USE_INTERNAL_RECORDER - #define SEGGER_SYSVIEW_USE_INTERNAL_RECORDER 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_CAN_RESTART -* -* Description -* If enabled, send the SystemView start sequence on every start -* command, not just on the first one. -* Enables restart when SystemView disconnected unexpectedly. -* Default -* 1: Enabled -*/ -#ifndef SEGGER_SYSVIEW_CAN_RESTART - #define SEGGER_SYSVIEW_CAN_RESTART 1 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_START_ON_INIT -* -* Description -* Enable calling SEGGER_SYSVIEW_Start() after initialization. -* Default -* 0: Disabled. -* Notes -* Convenience define to be used by SEGGER_SYSVIEW_Conf(), -* such as in embOS configuration. -*/ -#ifndef SEGGER_SYSVIEW_START_ON_INIT - #define SEGGER_SYSVIEW_START_ON_INIT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_USE_STATIC_BUFFER -* -* Description -* If enabled, use a static buffer instead of a buffer on the stack -* for SystemView event packets. -* Default -* 1: Enabled. -* Notes -* If enabled, the static memory use by SystemView is increased by -* the maximum packet size. SystemView is locked on entry of a -* recording function. -* If disabled, the stack usage by SystemView recording functions -* might be increased by up to the maximum packet size. SystemView -* is locked when writing the packet to the RTT buffer. -*/ -#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER - #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_PACKET_SIZE -* -* Description -* Maximum packet size for a SystemView event. -* Default -* Automatically calculated. -* Notes -* The maximum packet size is mainly defined by the maximum string -* length and the maximum number of arguments. -*/ -#ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE - #define SEGGER_SYSVIEW_MAX_PACKET_SIZE (SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32) -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_POST_MORTEM_MODE -* -* Description -* If enabled, SystemView records for post-mortem analysis instead -* of real-time analysis. -* Default -* 0: Disabled. -* Notes -* For more information refer to -* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode -*/ -#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE - #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT -* -* Description -* Configure how frequently syncronization is sent in post-mortem -* mode. -* Default -* 8: (1 << 8) = Every 256 Events. -* Notes -* In post-mortem mode, at least one sync has to be in the RTT buffer. -* Recommended sync frequency: Buffer Size / 16 -* For more information refer to -* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode -*/ -#ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT - #define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ON_EVENT_RECORDED() -* -* Description -* Function macro to notify recorder about a new event in buffer. -* Default -* undefined: Do not notify recorder. -* Notes -* Used for non-J-Link recorder, -* such as to enable transmission via UART or notify IP task. -*/ -#ifndef SEGGER_SYSVIEW_ON_EVENT_RECORDED - #define SEGGER_SYSVIEW_ON_EVENT_RECORDED(NumBytes) -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_LOCK() -* -* Description -* Function macro to (nestable) lock SystemView recording. -* Default -* Use RTT Locking mechanism (defined by SEGGER_RTT_LOCK()). -* Notes -* If SystemView recording is not locked, recording events from -* interrupts and tasks may lead to unpredictable, undefined, event -* data. -*/ -#ifndef SEGGER_SYSVIEW_LOCK - #define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK() -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_UNLOCK -* -* Description -* Function macro to unlock SystemView recording. -* Default -* Use RTT Unlocking mechanism (defined by SEGGER_RTT_UNLOCK()). -*/ -#ifndef SEGGER_SYSVIEW_UNLOCK - #define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK() -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Config_embOS.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Config_embOS.c deleted file mode 100644 index ce395be0f..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Config_embOS.c +++ /dev/null @@ -1,124 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_Config_embOS.c -Purpose : Sample setup configuration of SystemView with embOS. -Revision: $Rev: 21319 $ -*/ -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "SEGGER_SYSVIEW_embOS.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#define DEMCR (*(volatile U32*) (0xE000EDFCuL)) // Debug Exception and Monitor Control Register -#define TRACEENA_BIT (1uL << 24) // Trace enable bit -#define DWT_CTRL (*(volatile U32*) (0xE0001000uL)) // DWT Control Register -#define NOCYCCNT_BIT (1uL << 25) // Cycle counter support bit -#define CYCCNTENA_BIT (1uL << 0) // Cycle counter enable bit -// -// If events will be recorded without a debug probe (J-Link) attached, -// enable the cycle counter -// -#define ENABLE_DWT_CYCCNT (SEGGER_SYSVIEW_POST_MORTEM_MODE || SEGGER_SYSVIEW_USE_INTERNAL_RECORDER) - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ -/********************************************************************* -* -* _cbSendSystemDesc() -* -* Function description -* Sends SystemView description strings. -*/ -static void _cbSendSystemDesc(void) { - SEGGER_SYSVIEW_SendSysDesc("N=" SEGGER_SYSVIEW_APP_NAME ",O=embOS,D=" SEGGER_SYSVIEW_DEVICE_NAME ); -#ifdef SEGGER_SYSVIEW_SYSDESC0 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC0); -#endif -#ifdef SEGGER_SYSVIEW_SYSDESC1 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC1); -#endif -#ifdef SEGGER_SYSVIEW_SYSDESC2 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC2); -#endif -} - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ -/********************************************************************* -* -* SEGGER_SYSVIEW_Conf() -* -* Function description -* Configure and initialize SystemView and register it with embOS. -* -* Additional information -* If enabled, SEGGER_SYSVIEW_Conf() will also immediately start -* recording events with SystemView. -*/ -void SEGGER_SYSVIEW_Conf(void) { -#if ENABLE_DWT_CYCCNT - // - // If no debugger is connected, the DWT must be enabled by the application - // - if ((DEMCR & TRACEENA_BIT) == 0) { - DEMCR |= TRACEENA_BIT; - } -#endif - // - // The cycle counter must be activated in order - // to use time related functions. - // - if ((DWT_CTRL & NOCYCCNT_BIT) == 0) { // Cycle counter supported? - if ((DWT_CTRL & CYCCNTENA_BIT) == 0) { // Cycle counter not enabled? - DWT_CTRL |= CYCCNTENA_BIT; // Enable Cycle counter - } - } - SEGGER_SYSVIEW_Init(SEGGER_SYSVIEW_TIMESTAMP_FREQ, SEGGER_SYSVIEW_CPU_FREQ, - &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc); - OS_TRACE_SetAPI(&embOS_TraceAPI_SYSVIEW); // Configure embOS to use SYSVIEW. -#if SEGGER_SYSVIEW_START_ON_INIT - SEGGER_SYSVIEW_Start(); // Start recording to catch system initialization. -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Int.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Int.h deleted file mode 100644 index 5c6f14c13..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_Int.h +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW_Int.h -Purpose : SEGGER SystemView internal header. -Revision: $Rev: 21281 $ -*/ - -#ifndef SEGGER_SYSVIEW_INT_H -#define SEGGER_SYSVIEW_INT_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER_SYSVIEW.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/********************************************************************* -* -* Private data types -* -********************************************************************** -*/ -// -// Commands that Host can send to target -// -typedef enum { - SEGGER_SYSVIEW_COMMAND_ID_START = 1, - SEGGER_SYSVIEW_COMMAND_ID_STOP, - SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME, - SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST, - SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC, - SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES, - SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC, - SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT = 127, - // Extended commands: Commands >= 128 have a second parameter - SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128 -} SEGGER_SYSVIEW_COMMAND_ID; - -#ifdef __cplusplus -} -#endif - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.c deleted file mode 100644 index 393a53e29..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.c +++ /dev/null @@ -1,227 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_embOS.c -Purpose : Interface between embOS and System View. -Revision: $Rev: 22295 $ -*/ - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "SEGGER_RTT.h" -#include "SEGGER_SYSVIEW_embOS.h" - -#if (OS_VERSION < 41201) - #error "SystemView is only supported in embOS V4.12a and later." -#endif - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _cbSendTaskInfo() -* -* Function description -* Sends task information to SystemView -*/ -static void _cbSendTaskInfo(const OS_TASK* pTask) { - SEGGER_SYSVIEW_TASKINFO Info; - - OS_EnterRegion(); // No scheduling to make sure the task list does not change while we are transmitting it - memset(&Info, 0, sizeof(Info)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code - Info.TaskID = (U32)pTask; -#if OS_TRACKNAME - Info.sName = pTask->Name; -#endif - Info.Prio = pTask->Priority; -#if OS_CHECKSTACK - Info.StackBase = (U32)pTask->pStackBot; - Info.StackSize = pTask->StackSize; -#endif - SEGGER_SYSVIEW_SendTaskInfo(&Info); - OS_LeaveRegion(); // No scheduling to make sure the task list does not change while we are transmitting it -} - -/********************************************************************* -* -* _cbSendTaskList() -* -* Function description -* This function is part of the link between embOS and SYSVIEW. -* Called from SystemView when asked by the host, it uses SYSVIEW -* functions to send the entire task list to the host. -*/ -static void _cbSendTaskList(void) { - OS_TASK* pTask; - - OS_EnterRegion(); // No scheduling to make sure the task list does not change while we are transmitting it - for (pTask = OS_Global.pTask; pTask; pTask = pTask->pNext) { - _cbSendTaskInfo(pTask); - } -#if ((OS_VERSION >= 43800) && (OS_TRACKNAME != 0)) // Human readable object identifiers supported since embOS V4.38 - { - OS_OBJNAME* p; - for (p = OS_pObjNameRoot; p != NULL; p = p->pNext) { - SEGGER_SYSVIEW_NameResource((OS_U32)p->pOSObjID, p->sName); - } - } -#endif - OS_LeaveRegion(); // No scheduling to make sure the task list does not change while we are transmitting it -} - -/********************************************************************* -* -* _cbOnTaskCreate() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskCreate(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskCreate((OS_U32)TaskId); -} -#else -#define _cbOnTaskCreate SEGGER_SYSVIEW_OnTaskCreate -#endif - -/********************************************************************* -* -* _cbOnTaskStartExec() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStartExec(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskStartExec((OS_U32)TaskId); -} -#else -#define _cbOnTaskStartExec SEGGER_SYSVIEW_OnTaskStartExec -#endif - -/********************************************************************* -* -* _cbOnTaskStartReady() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStartReady(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskStartReady((OS_U32)TaskId); -} -#else -#define _cbOnTaskStartReady SEGGER_SYSVIEW_OnTaskStartReady -#endif - -/********************************************************************* -* -* _cbOnTaskStopReady() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStopReady(unsigned int TaskId, unsigned int Reason) { - SEGGER_SYSVIEW_OnTaskStopReady((OS_U32)TaskId, Reason); -} -#else -#define _cbOnTaskStopReady SEGGER_SYSVIEW_OnTaskStopReady -#endif - -/********************************************************************* -* -* _cbOnTaskTerminate() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskTerminate(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskTerminate((OS_U32)TaskId); -} -#else -#define _cbOnTaskTerminate SEGGER_SYSVIEW_OnTaskTerminate -#endif - -// -// embOS trace API that targets SYSVIEW -// -const OS_TRACE_API embOS_TraceAPI_SYSVIEW = { - // - // Specific Trace Events - // - SEGGER_SYSVIEW_RecordEnterISR, // void (*pfRecordEnterISR) (void); - SEGGER_SYSVIEW_RecordExitISR, // void (*pfRecordExitISR) (void); - SEGGER_SYSVIEW_RecordExitISRToScheduler, // void (*pfRecordExitISRToScheduler) (void); - _cbSendTaskInfo, // void (*pfRecordTaskInfo) (const OS_TASK* pTask); - _cbOnTaskCreate, // void (*pfRecordTaskCreate) (OS_U32 TaskId); - _cbOnTaskStartExec, // void (*pfRecordTaskStartExec) (OS_U32 TaskId); - SEGGER_SYSVIEW_OnTaskStopExec, // void (*pfRecordTaskStopExec) (void); - _cbOnTaskStartReady, // void (*pfRecordTaskStartReady) (OS_U32 TaskId); - _cbOnTaskStopReady, // void (*pfRecordTaskStopReady) (OS_U32 TaskId, unsigned Reason); - SEGGER_SYSVIEW_OnIdle, // void (*pfRecordIdle) (void); - // - // Generic Trace Event logging - // - SEGGER_SYSVIEW_RecordVoid, // void (*pfRecordVoid) (unsigned Id); - SEGGER_SYSVIEW_RecordU32, // void (*pfRecordU32) (unsigned Id, OS_U32 Para0); - SEGGER_SYSVIEW_RecordU32x2, // void (*pfRecordU32x2) (unsigned Id, OS_U32 Para0, OS_U32 Para1); - SEGGER_SYSVIEW_RecordU32x3, // void (*pfRecordU32x3) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2); - SEGGER_SYSVIEW_RecordU32x4, // void (*pfRecordU32x4) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2, OS_U32 Para3); - SEGGER_SYSVIEW_ShrinkId, // OS_U32 (*pfPtrToId) (OS_U32 Ptr); -#if (OS_VERSION >= 41400) // Tracing timer is supported since embOS V4.14 - SEGGER_SYSVIEW_RecordEnterTimer, // void (*pfRecordEnterTimer) (OS_U32 TimerID); - SEGGER_SYSVIEW_RecordExitTimer, // void (*pfRecordExitTimer) (void); -#endif -#if (OS_VERSION >= 42400) // Tracing end of call supported since embOS V4.24 - SEGGER_SYSVIEW_RecordEndCall, // void (*pfRecordEndCall) (unsigned int Id); - SEGGER_SYSVIEW_RecordEndCallU32, // void (*pfRecordEndCallReturnValue) (unsigned int Id, OS_U32 ReturnValue); - _cbOnTaskTerminate, // void (*pfRecordTaskTerminate) (OS_U32 TaskId); - SEGGER_SYSVIEW_RecordU32x5, // void (*pfRecordU32x5) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2, OS_U32 Para3, OS_U32 Para4); -#endif -#if (OS_VERSION >= 43800) // Human readable object identifiers supported since embOS V4.38 - SEGGER_SYSVIEW_NameResource, // void (*pfRecordObjName) (OS_U32 Id, OS_CONST_PTR char* Para0); -#endif -}; - -// -// Services provided to SYSVIEW by embOS -// -const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = { - OS_GetTime_us64, - _cbSendTaskList, -}; - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.h deleted file mode 100644 index d59c303b5..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/SEGGER/SEGGER_SYSVIEW_embOS.h +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_embOS.h -Purpose : Interface between embOS and System View. -Revision: $Rev: 9599 $ -*/ - -#ifndef SYSVIEW_EMBOS_H -#define SYSVIEW_EMBOS_H - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" - -// embOS trace API that targets SYSVIEW -extern const OS_TRACE_API embOS_TraceAPI_SYSVIEW; - -// Services provided to SYSVIEW by embOS -extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/BSP.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/BSP.c deleted file mode 100644 index 3b2d018b7..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/BSP.c +++ /dev/null @@ -1,140 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------------------------------------------------- -File : BSP.c -Purpose : BSP for STM32H7x3I-Eval board --------- END-OF-HEADER --------------------------------------------- -*/ - -#include "BSP.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -#define LED1_PIN (10) -#define LED3_PIN ( 4) - -#define GPIOA_BASE_ADDR (0x58020000u) -#define GPIOA_MODER (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x00u)) -#define GPIOA_OTYPER (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x04u)) -#define GPIOA_OSPEEDR (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x08u)) -#define GPIOA_PUPDR (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x0Cu)) -#define GPIOA_ODR (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x14u)) -#define GPIOA_BSRR (*(volatile unsigned int*)(GPIOA_BASE_ADDR + 0x18u)) - -#define GPIOF_BASE_ADDR (0x58021400u) -#define GPIOF_MODER (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x00u)) -#define GPIOF_OTYPER (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x04u)) -#define GPIOF_OSPEEDR (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x08u)) -#define GPIOF_PUPDR (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x0Cu)) -#define GPIOF_ODR (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x14u)) -#define GPIOF_BSRR (*(volatile unsigned int*)(GPIOF_BASE_ADDR + 0x18u)) - -#define RCC_BASE_ADDR (0x58024400u) -#define RCC_AHB4ENR (*(volatile unsigned int*)(RCC_BASE_ADDR + 0xE0u)) - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* BSP_Init() -*/ -void BSP_Init(void) { - // - // Enable GPIO clocks - // - RCC_AHB4ENR |= (0x1u << 5) // Enable the GPIOF clock - | (0x1u << 0); // Enable the GPIOA clock - // - // Initialize LED1 - // - GPIOF_MODER &= ~(0x3u << (LED1_PIN * 2)); // Clear mode register - GPIOF_MODER |= (0x1u << (LED1_PIN * 2)); // Set IO direction to output mode - GPIOF_OSPEEDR |= (0x3u << (LED1_PIN * 2)); // Set speed to high frequency - GPIOF_OTYPER &= ~(0x1u << (LED1_PIN * 1)); // Set output to push-pull - GPIOF_PUPDR &= ~(0x3u << (LED1_PIN * 2)); // Clear the pull-up/pull-down register - GPIOF_PUPDR |= (0x1u << (LED1_PIN * 2)); // Set push-pull to pull-up - GPIOF_BSRR = (0x1u << LED1_PIN); // Turn LED off - // - // Initialize LED3 - // - GPIOA_MODER &= ~(0x3u << (LED3_PIN * 2)); // Clear mode register - GPIOA_MODER |= (0x1u << (LED3_PIN * 2)); // Set IO direction to output mode - GPIOA_OSPEEDR |= (0x3u << (LED3_PIN * 2)); // Set speed to high frequency - GPIOA_OTYPER &= ~(0x1u << (LED3_PIN * 1)); // Set output to push-pull - GPIOA_PUPDR &= ~(0x3u << (LED3_PIN * 2)); // Clear the pull-up/pull-down register - GPIOA_PUPDR |= (0x1u << (LED3_PIN * 2)); // Set push-pull to pull-up - GPIOA_BSRR = (0x1u << LED3_PIN); // Turn LED off -} - -/********************************************************************* -* -* BSP_SetLED() -*/ -void BSP_SetLED(int Index) { - if (Index == 0) { - GPIOF_BSRR |= ((0x1u << 16) << LED1_PIN); // Turn LED on - } else if (Index == 1) { - GPIOA_BSRR |= ((0x1u << 16) << LED3_PIN); // Turn LED on - } -} - -/********************************************************************* -* -* BSP_ClrLED() -*/ -void BSP_ClrLED(int Index) { - if (Index == 0) { - GPIOF_BSRR |= (0x1u << LED1_PIN); // Turn LED off - } else if (Index == 1) { - GPIOA_BSRR |= (0x1u << LED3_PIN); // Turn LED off - } -} - -/********************************************************************* -* -* BSP_ToggleLED() -*/ -void BSP_ToggleLED(int Index) { - if (Index == 0) { - GPIOF_ODR ^= (0x1u << LED1_PIN); // Toggle LED - } else if (Index == 1) { - GPIOA_ODR ^= (0x1u << LED3_PIN); // Toggle LED - } -} - -/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/HardFaultHandler.S b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/HardFaultHandler.S deleted file mode 100644 index 43e8ec2f2..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/HardFaultHandler.S +++ /dev/null @@ -1,172 +0,0 @@ -;/********************************************************************* -;* (c) SEGGER Microcontroller GmbH * -;* The Embedded Experts * -;* www.segger.com * -;********************************************************************** -; -;-------------------------- END-OF-HEADER ----------------------------- -; -;File : HardFaultHandler.S -;Purpose : HardFault exception handler for IAR, Keil and GNU assembler. -; Evaluates used stack (MSP, PSP) and passes appropriate stack -; pointer to the HardFaultHandler "C"-routine. -;*/ - -#ifndef __IAR_SYSTEMS_ASM__ - #ifndef __CC_ARM - #ifndef __clang__ - #ifndef __GNUC__ - #error "Unsupported assembler!" - #endif - #endif - #endif -#endif - -;/********************************************************************* -;* -;* Forward declarations of segments used -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - SECTION CODE:CODE:NOROOT(2) - SECTION CSTACK:DATA:NOROOT(3) - -#elif (defined(__CC_ARM)) - - AREA OSKERNEL, CODE, READONLY, ALIGN=2 - PRESERVE8 - -#endif - -;/********************************************************************* -;* -;* Publics -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - SECTION .text:CODE:NOROOT(2) - PUBLIC HardFault_Handler - -#elif (defined(__CC_ARM)) - - EXPORT HardFault_Handler - -#elif (defined(__clang__) || defined(__GNUC__)) - - .global HardFault_Handler - .type HardFault_Handler, function - -#endif - -;/********************************************************************* -;* -;* Externals, code -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - EXTERN HardFaultHandler - -#elif (defined(__CC_ARM)) - - IMPORT HardFaultHandler - -#elif (defined(__clang__) || defined(__GNUC__)) - - .extern HardFaultHandler - -#endif - -;/********************************************************************* -;* -;* CODE segment -;* -;********************************************************************** -;*/ - -#if (defined(__clang__) || defined(__GNUC__)) - - .syntax unified - .thumb - .balign 4 - .text - -#else - - THUMB - -#endif - -;/********************************************************************* -;* -;* Global functions -;* -;********************************************************************** -;*/ - -;/********************************************************************* -;* -;* HardFault_Handler() -;* -;* Function description -;* Evaluates the used stack (MSP, PSP) and passes the appropriate -;* stack pointer to the HardFaultHandler "C"-routine. -;* -;* Notes -;* (1) Ensure that HardFault_Handler is part of the exception table -;*/ -#if (defined(__clang__) || defined(__GNUC__)) -HardFault_Handler: -#else -HardFault_Handler -#endif -#if ((defined(__IAR_SYSTEMS_ASM__) && ((defined(__ARM6M__) && (__CORE__ == __ARM6M__)) || (defined(__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)))) \ - || (defined(__CC_ARM) && ( defined(__TARGET_ARCH_6S_M) || defined(__ARM_ARCH_8M_BASE__))) \ - || (defined(__clang__) && ( defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__))) \ - || (defined(__GNUC__) && ( defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)))) - ;// This version is for Cortex-M0/M0+/M1/M23 - movs R0, #4 - mov R1, LR - tst R0, R1 ;// Check EXC_RETURN in Link register bit 2. - bne Uses_PSP - mrs R0, MSP ;// Stacking was using MSP. - b Pass_StackPtr -#if (defined(__clang__) || defined(__GNUC__)) -Uses_PSP: -#else -Uses_PSP -#endif - mrs R0, PSP ;// Stacking was using PSP. -#if (defined(__GNUC__) || defined(__clang__)) -Pass_StackPtr: -#else -Pass_StackPtr -#endif -#else - ;// This version is for Cortex-M3/M4/M4F/M7/M7F/M33 - tst LR, #4 ;// Check EXC_RETURN in Link register bit 2. - ite EQ - mrseq R0, MSP ;// Stacking was using MSP. - mrsne R0, PSP ;// Stacking was using PSP. -#endif -#if (defined(__CC_ARM)) - ALIGN -#endif - ldr R1,=HardFaultHandler - bx R1 ;// Stack pointer passed through R0. - -#if (defined(__clang__) || defined(__GNUC__)) - .end -#else - END -#endif - -;/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Error.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Error.c deleted file mode 100644 index 40c6b7385..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Error.c +++ /dev/null @@ -1,274 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : OS_Error.c -Purpose : embOS error handler. - Feel free to modify this file according to your needs. -*/ - -#include "RTOS.h" - -/********************************************************************* -* -* Error Codes -* -********************************************************************** - - OS_OK = (0u), // No error, everything ok. -// User 1..99 *********************************** - -// Port 100..109 ********************************* - OS_ERR_ISR_INDEX = (100u), // Index value out of bounds during interrupt controller initialization or interrupt installation. - OS_ERR_ISR_VECTOR = (101u), // Default interrupt handler called, but interrupt vector not initialized. - OS_ERR_ISR_PRIO = (102u), // Wrong interrupt priority. - OS_ERR_WRONG_STACK = (103u), // Wrong stack used before main(). - OS_ERR_ISR_NO_HANDLER = (104u), // No interrupt handler was defined for this interrupt. - OS_ERR_TLS_INIT = (105u), // OS_TLS_Init() called multiple times from one task. - OS_ERR_MB_BUFFER_SIZE = (106u), // For 16-bit CPUs, the maximum buffer size for a mailbox (64KB) exceeded. - -// OS generic ************************************ - OS_ERR_EXTEND_CONTEXT = (116u), // OS_TASK_SetContextExtension() called multiple times from one task. - OS_ERR_INTERNAL = (118u), // OS_ChangeTask() called without Region Counter set (or other internal error). - OS_ERR_IDLE_RETURNS = (119u), // OS_Idle() must not return. - OS_ERR_TASK_STACK = (120u), // Task stack overflow or invalid task stack. - -// Semaphore value overflow - OS_ERR_SEMAPHORE_OVERFLOW = (121u), // Semaphore value overflow. - -// Peripheral Power management module - OS_ERR_POWER_OVER = (122u), // Counter overflows when calling OS_POWER_UsageInc(). - OS_ERR_POWER_UNDER = (123u), // Counter underflows when calling OS_POWER_UsageDec(). - OS_ERR_POWER_INDEX = (124u), // Index to high, exceeds (OS_POWER_NUM_COUNTERS - 1). - -// System/interrupt stack - OS_ERR_SYS_STACK = (125u), // System stack overflow. - OS_ERR_INT_STACK = (126u), // Interrupt stack overflow. - -// invalid or non-initialized data structures - OS_ERR_INV_TASK = (128u), // Task control block invalid, not initialized or overwritten. - OS_ERR_INV_TIMER = (129u), // Timer control block invalid, not initialized or overwritten. - OS_ERR_INV_MAILBOX = (130u), // Mailbox control block invalid, not initialized or overwritten. - OS_ERR_INV_SEMAPHORE = (132u), // Control block for semaphore invalid, not initialized or overwritten. - OS_ERR_INV_MUTEX = (133u), // Control block for mutex invalid, not initialized or overwritten. - -// Using GetMail1 or PutMail1 or GetMailCond1 or PutMailCond1 on -// a non-1 byte mailbox - OS_ERR_MAILBOX_NOT1 = (135u), // One of the following 1-byte mailbox functions has been used on a multibyte mailbox: OS_MAILBOX_Get1(), OS_MAILBOX_GetBlocked1(), OS_MAILBOX_GetTimed1(), OS_MAILBOX_Put1(), OS_MAILBOX_PutBlocked1(), OS_MAILBOX_PutFront1(), OS_MAILBOX_PutFrontBlocked1() or OS_MAILBOX_PutTimed1(). - -// Waitable objects deleted with waiting tasks or occupied by task - OS_ERR_MAILBOX_DELETE = (136u), // OS_MAILBOX_Delete() was called on a mailbox with waiting tasks. - OS_ERR_SEMAPHORE_DELETE = (137u), // OS_SEMAPHORE_Delete() was called on a semaphore with waiting tasks. - OS_ERR_MUTEX_DELETE = (138u), // OS_MUTEX_Delete() was called on a mutex which is claimed by a task. - -// internal errors, please contact SEGGER Microcontroller - OS_ERR_MAILBOX_NOT_IN_LIST = (140u), // The mailbox is not in the list of mailboxes as expected. Possible reasons may be that one mailbox data structure was overwritten. - OS_ERR_TASKLIST_CORRUPT = (142u), // The OS internal task list is destroyed. - -// Queue errors - OS_ERR_QUEUE_INUSE = (143u), // Queue in use. - OS_ERR_QUEUE_NOT_INUSE = (144u), // Queue not in use. - OS_ERR_QUEUE_INVALID = (145u), // Queue invalid. - OS_ERR_QUEUE_DELETE = (146u), // A queue was deleted by a call of OS_QUEUE_Delete() while tasks are waiting at the queue. - -// Mailbox errors - OS_ERR_MB_INUSE = (147u), // Mailbox in use. - OS_ERR_MB_NOT_INUSE = (148u), // Mailbox not in use. - -// Message size - OS_ERR_MESSAGE_SIZE_ZERO = (149u), // Attempt to store a message with size of zero. - -// Not matching routine calls or macro usage - OS_ERR_UNUSE_BEFORE_USE = (150u), // OS_MUTEX_Unlock() has been called on a mutex that hasn't been locked before. - OS_ERR_LEAVEREGION_BEFORE_ENTERREGION = (151u), // OS_TASK_LeaveRegion() has been called before OS_TASK_EnterRegion(). - OS_ERR_LEAVEINT = (152u), // Error in OS_INT_Leave(). - OS_ERR_DICNT_OVERFLOW = (153u), // The interrupt disable counter ( OS_Global.Counters.Cnt.DI ) is out of range (0-15). The counter is affected by the API calls OS_INT_IncDI(), OS_INT_DecRI(), OS_INT_Enter() and OS_INT_Leave(). - OS_ERR_INTERRUPT_DISABLED = (154u), // OS_TASK_Delay() or OS_TASK_DelayUntil() called from inside a critical region with interrupts disabled. - OS_ERR_TASK_ENDS_WITHOUT_TERMINATE = (155u), // Task routine returns without 0S_TASK_Terminate(). - OS_ERR_MUTEX_OWNER = (156u), // OS_MUTEX_Unlock() has been called from a task which does not own the mutex. - OS_ERR_REGIONCNT = (157u), // The Region counter overflows (>255). - OS_ERR_DELAYUS_INTERRUPT_DISABLED = (158u), // OS_TASK_Delayus() called with interrupts disabled. - OS_ERR_MUTEX_OVERFLOW = (159u), // OS_MUTEX_Lock(), OS_MUTEX_LockBlocked() or OS_MUTEX_LockTimed() has been called too often from the same task. - - OS_ERR_ILLEGAL_IN_ISR = (160u), // Illegal function call in an interrupt service routine: A routine that must not be called from within an ISR has been called from within an ISR. - OS_ERR_ILLEGAL_IN_TIMER = (161u), // Illegal function call in a software timer: A routine that must not be called from within a software timer has been called from within a timer. - OS_ERR_ILLEGAL_OUT_ISR = (162u), // Not a legal API outside interrupt. - OS_ERR_NOT_IN_ISR = (163u), // OS_INT_Enter() has been called, but CPU is not in ISR state. - OS_ERR_IN_ISR = (164u), // OS_INT_Enter() has not been called, but CPU is in ISR state. - - OS_ERR_INIT_NOT_CALLED = (165u), // OS_Init() was not called. - - OS_ERR_ISR_PRIORITY_INVALID = (166u), // embOS API called from ISR with an invalid priority. - OS_ERR_CPU_STATE_ILLEGAL = (167u), // CPU runs in illegal mode. - OS_ERR_CPU_STATE_UNKNOWN = (168u), // CPU runs in unknown mode or mode could not be read. - - OS_ERR_TICKLESS_WITH_FRACTIONAL_TICK = (169u), // OS_TICKLESS_AdjustTime() was called despite OS_TICK_Config() has been called before. - -// Double used data structures - OS_ERR_2USE_TASK = (170u), // Task control block has been initialized by calling a create function twice. - OS_ERR_2USE_TIMER = (171u), // Timer control block has been initialized by calling a create function twice. - OS_ERR_2USE_MAILBOX = (172u), // Mailbox control block has been initialized by calling a create function twice. - OS_ERR_2USE_SEMAPHORE = (174u), // Semaphore has been initialized by calling a create function twice. - OS_ERR_2USE_MUTEX = (175u), // Mutex has been initialized by calling a create function twice. - OS_ERR_2USE_MEMF = (176u), // Fixed size memory pool has been initialized by calling a create function twice. - OS_ERR_2USE_QUEUE = (177u), // Queue has been initialized by calling a create function twice. - OS_ERR_2USE_EVENT = (178u), // Event object has been initialized by calling a create function twice. - OS_ERR_2USE_WATCHDOG = (179u), // Watchdog has been initialized by calling a create function twice. - -// Communication errors - OS_ERR_NESTED_RX_INT = (180u), // OS_Rx interrupt handler for embOSView is nested. Disable nestable interrupts. - -// Spinlock - OS_ERR_SPINLOCK_INV_CORE = (185u), // Invalid core ID specified for accessing a OS_SPINLOCK_SW struct. - -// Fixed block memory pool - OS_ERR_MEMF_INV = (190u), // Fixed size memory block control structure not created before use. - OS_ERR_MEMF_INV_PTR = (191u), // Pointer to memory block does not belong to memory pool on Release. - OS_ERR_MEMF_PTR_FREE = (192u), // Pointer to memory block is already free when calling OS_MEMPOOL_Release(). Possibly, same pointer was released twice. - OS_ERR_MEMF_RELEASE = (193u), // OS_MEMPOOL_Release() was called for a memory pool, that had no memory block allocated (all available blocks were already free before). - OS_ERR_MEMF_POOLADDR = (194u), // OS_MEMPOOL_Create() was called with a memory pool base address which is not located at a word aligned base address. - OS_ERR_MEMF_BLOCKSIZE = (195u), // OS_MEMPOOL_Create() was called with a data block size which is not a multiple of processors word size. - -// Task suspend / resume errors - OS_ERR_SUSPEND_TOO_OFTEN = (200u), // Number of nested calls to OS_TASK_Suspend() exceeded 3. - OS_ERR_RESUME_BEFORE_SUSPEND = (201u), // OS_TASK_Resume() called on a task that was not suspended. - -// Other task related errors - OS_ERR_TASK_PRIORITY = (202u), // OS_TASK_Create() was called with a task priority which is already assigned to another task. This error can only occur when embOS was compiled without round-robin support. - OS_ERR_TASK_PRIORITY_INVALID = (203u), // The value 0 was used as task priority. - -// Timer related errors - OS_ERR_TIMER_PERIOD_INVALID = (205u), // The value 0 was used as timer period. - -// Event object - OS_ERR_EVENT_INVALID = (210u), // An OS_EVENT object was used before it was created. - OS_ERR_EVENT_DELETE = (212u), // An OS_EVENT object was deleted with waiting tasks. - -// Waitlist (checked build) - OS_ERR_WAITLIST_RING = (220u), // This error should not occur. Please contact the support. - OS_ERR_WAITLIST_PREV = (221u), // This error should not occur. Please contact the support. - OS_ERR_WAITLIST_NEXT = (222u), // This error should not occur. Please contact the support. - -// Tick Hook - OS_ERR_TICKHOOK_INVALID = (223u), // Invalid tick hook. - OS_ERR_TICKHOOK_FUNC_INVALID = (224u), // Invalid tick hook function. - -// Other potential problems discovered in checked build - OS_ERR_NOT_IN_REGION = (225u), // A function was called without declaring the necessary critical region. - -// API context check - OS_ERR_ILLEGAL_IN_MAIN = (226u), // Not a legal API call from main(). - OS_ERR_ILLEGAL_IN_TASK = (227u), // Not a legal API after OS_Start(). - OS_ERR_ILLEGAL_AFTER_OSSTART = (228u), // Not a legal API after OS_Start(). - -// Cache related - OS_ERR_NON_ALIGNED_INVALIDATE = (230u), // Cache invalidation needs to be cache line aligned. - -// Available hardware - OS_ERR_HW_NOT_AVAILABLE = (234u), // Hardware unit is not implemented or enabled. - -// System timer config related - OS_ERR_NON_TIMERCYCLES_FUNC = (235u), // OS_TIME_ConfigSysTimer() has not been called. Callback function for timer counter value has not been set. - OS_ERR_NON_TIMERINTPENDING_FUNC = (236u), // OS_TIME_ConfigSysTimer() has not been called. Callback function for timer interrupt pending flag has not been set. - OS_ERR_FRACTIONAL_TICK = (237u), // embOS API function called with fractional tick to interrupt ratio. - OS_ERR_ZERO_TIMER_INT_FREQ = (238u), // OS_TIME_ConfigSysTimer() not called or called with zero interrupt frequency. - -// embOS MPU related - OS_ERR_MPU_NOT_PRESENT = (240u), // MPU unit not present in the device. - OS_ERR_MPU_INVALID_REGION = (241u), // Invalid MPU region index number. - OS_ERR_MPU_INVALID_SIZE = (242u), // Invalid MPU region size. - OS_ERR_MPU_INVALID_PERMISSION = (243u), // Invalid MPU region permission. - OS_ERR_MPU_INVALID_ALIGNMENT = (244u), // Invalid MPU region alignment. - OS_ERR_MPU_INVALID_OBJECT = (245u), // OS object is directly accessible from the task which is not allowed. - OS_ERR_MPU_PRIVSTATE_INVALID = (246u), // Invalid call from a privileged task. - -// Buffer to small to keep a backup copy of the CSTACK - OS_ERR_CONFIG_OSSTOP = (250u), // OS_Stop() is called without using OS_ConfigStop() before. - OS_ERR_OSSTOP_BUFFER = (251u), // Buffer is too small to hold a copy of the main() stack. - -// 252 is used as special value to send the status to embOSView as a 16-Bit value. - OS_EMBOSVIEW_SEND_STATUS_16BIT = (252u), - -// OS version mismatch between library and RTOS.h - OS_ERR_VERSION_MISMATCH = (253u), // OS library and RTOS.h have different version numbers. Please ensure both are from the same embOS shipment. - -// Incompatible embOS library - OS_ERR_LIB_INCOMPATIBLE = (254u), // Incompatible OS library is used. -// Invalid parameter value - OS_ERR_INV_PARAMETER_VALUE = (255u), // An invalid value was passed to the called function (see callstack). Check the API description for valid values. - -// Wrong Tick handler function - OS_ERR_TICKHANDLE_WITH_FRACTIONAL_TICK = (256u), // OS_TICK_Handle() or OS_TICK_HandleNoHook() was called after OS_TICK_Config() was used for an interrupt to tick ratio other than 1:1. - -// RW Lock error - OS_ERR_RWLOCK_INVALID = (257u), // RWLock control block invalid, not initialized or overwritten. - OS_ERR_2USE_RWLOCK = (258u), // RWLock has been initialized by calling a create function twice. - -// Unaligned stacks - OS_ERR_UNALIGNED_IRQ_STACK = (260u), // Unaligned IRQ stack. - OS_ERR_UNALIGNED_MAIN_STACK = (261u) // Unaligned main stack. - -*/ - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* OS_Error() -* -* Function description -* Run-time error reaction -* -* When this happens, an application error occurred and was detected by -* embOS. -* -* This routine can be modified to suit your needs, e.g. a red LED could -* light up. When using an emulator, you may set a breakpoint here. -* In the release builds of the library (R, XR), this routine is not -* required (as no checks are performed). -* In the stack check builds (S/SP), only error 120 may occur. -* In the debug builds(D/DP,DT), all of the listed errors may occur. -* -* Parameters -* ErrCode: embOS error code -*/ -void OS_Error(OS_STATUS ErrCode) { - OS_TASK_EnterRegion(); // Avoid further task switches - OS_Global.Counters.Cnt.DI = 0u; // Allow interrupts so we can communicate with embOSView - OS_INT_Enable(); - OS_Status = ErrCode; - while (OS_Status) { - // Endless loop may be left by setting OS_Status to 0 - } -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_MallocLock.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_MallocLock.c deleted file mode 100644 index 97b99ddd4..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_MallocLock.c +++ /dev/null @@ -1,86 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------------------------------------------------- -File : OS_MallocLock.c -Purpose : embOS implementation of thread safe malloc function locking - Has to be included in the project if thread safe heap - management is required --------- END-OF-HEADER --------------------------------------------- -*/ - -#include -#include "RTOS.h" - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ - -#ifdef __cplusplus - extern "C" { -#endif - -/********************************************************************* -* -* Declare functions to avoid "no prototype" warning -*/ -void __malloc_lock ( struct _reent *_r ); -void __malloc_unlock ( struct _reent *_r ); - -#ifdef __cplusplus - } -#endif - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* __malloc_lock() replaces the dummy from the library -*/ -void __malloc_lock ( struct _reent *_r ) { - OS_USEPARA(_r); - OS_MallocLock(); -} - -/********************************************************************* -* -* __malloc_unlock() replaces the dummy from the library -*/ -void __malloc_unlock ( struct _reent *_r ) { - OS_USEPARA(_r); - OS_MallocUnlock(); -} - -/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Syscalls.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Syscalls.c deleted file mode 100644 index 24d94935c..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/OS_Syscalls.c +++ /dev/null @@ -1,393 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : OS_Syscalls.c -Purpose : Newlib Syscalls callback functions. - Only _sbrk() implemented for embOS. - All others unchanged (default empty functions). --------- END-OF-HEADER --------------------------------------------- -*/ - -#include -#undef errno -#include -#include -#include - -/********************************************************************* -* -* External data -* -********************************************************************** -*/ -extern int errno; - -extern char __heap_start__; // Has to be defined in the linker file. -extern char __heap_end__; - -/********************************************************************* -* -* environ -* -* A pointer to a list of environment variables and their values. -* Not needed (supported) by embOS, this empty list is adequate -*/ -char* __env[1] = { 0 }; -char** environ = __env; - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ -int _close (int file) __attribute__((weak)); -int _execve (char* pName, char** pArgv, char** pEnv) __attribute__((weak)); -void _exit (int __status) __attribute__((weak)); -int _fork (void) __attribute__((weak)); -int _fstat (int file, struct stat* pSt) __attribute__((weak)); -int _getpid (void) __attribute__((weak)); -int _gettimeofday (struct timeval* pTp, struct timezone* pTzp) __attribute__((weak)); -int _isatty (int file) __attribute__((weak)); -int _kill (int pid, int sig) __attribute__((weak)); -int _link (char* pOld, char* pNew) __attribute__((weak)); -int _lseek (int file, int ptr, int dir) __attribute__((weak)); -int _open (const char* pName, int flags, int mode) __attribute__((weak)); -int _read (int file, char* p, int len) __attribute__((weak)); -caddr_t _sbrk (int incr); -int _stat (const char* pFile, struct stat* pSt) __attribute__((weak)); -clock_t _times (struct tms* pBuf) __attribute__((weak)); -int _unlink (char* pName) __attribute__((weak)); -int _wait (int* pStatus) __attribute__((weak)); -int _write (int file, char* p, int len) __attribute__((weak)); - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _close() -* -* Function description -* Close a file. -* Not needed (supported) by embOS, minimal implementation -*/ -int _close(int file) { - (void) file; /* Not used, avoid warning */ - return -1; -} - -/********************************************************************* -* -* _execve() -* -* Function description -* Transfer control to a new process. -* Not needed (supported) by embOS, minimal implementation -*/ -int _execve(char* pName, char** pArgv, char** pEnv) { - (void) pName; /* Not used, avoid warning */ - (void) pArgv; /* Not used, avoid warning */ - (void) pEnv; /* Not used, avoid warning */ - errno = ENOMEM; - return -1; -} - -/********************************************************************* -* -* _exit() -* -* Function description -* Exit a program without cleaning up files. -*/ -void _exit(int __status) { - (void) __status; /* Not used, avoid warning */ - while(1); -} - -/********************************************************************* -* -* _fork() -* -* Function description -* Create a new process. -* Not needed (supported) by embOS, minimal implementation -*/ -int _fork(void) { - errno = EAGAIN; - return -1; -} - -/********************************************************************* -* -* _fstat() -* -* Function description -* Status of an open file. -* Not needed (supported) by embOS, minimal implementation -* For consistency with other minimal implementations in these examples, -* all files are regarded as character special devices. The sys/stat.h header file -* required is distributed in the include subdirectory for this C library. -*/ -int _fstat(int file, struct stat* pSt) { - (void) file; /* Not used, avoid warning */ - pSt->st_mode = S_IFCHR; - return 0; -} - -/********************************************************************* -* -* _getpid() -* -* Function description -* Process-ID; this is sometimes used to generate strings unlikely to conflict with other processes. -* Not needed (supported) by embOS, minimal implementation -*/ -int _getpid(void) { - return 1; -} - -/********************************************************************* -* -* _gettimeofday() -* -* Function description -* Not supported by embOS, minimal implementation -*/ -int _gettimeofday(struct timeval* pTp, struct timezone* pTzp) { - (void) pTp; /* Not used, avoid warning */ - (void) pTzp; /* Not used, avoid warning */ - errno = ENOSYS; - return -1; -} - -/********************************************************************* -* -* _isatty() -* -* Function description -* Query whether output stream is a terminal. -* Not needed (supported) by embOS, minimal implementation -* For consistency with the other minimal implementations, which only support output to stdout, -* this minimal implementation is suggested -*/ -int _isatty(int file) { - (void) file; /* Not used, avoid warning */ - - return 1; -} - -/********************************************************************* -* -* _kill() -* -* Function description -* Send a signal. -* Not needed (supported) by embOS, minimal implementation -*/ -int _kill(int pid, int sig) { - (void) pid; /* Not used, avoid warning */ - (void) sig; /* Not used, avoid warning */ - errno = EINVAL; - return -1; -} - -/********************************************************************* -* -* _link() -* -* Function description -* Establish a new name for an existing file. -* Not needed (supported) by embOS, minimal implementation -*/ -int _link(char* pOld, char* pNew) { - (void) pOld; /* Not used, avoid warning */ - (void) pNew; /* Not used, avoid warning */ - errno = EMLINK; - return -1; -} - -/********************************************************************* -* -* _lseek() -* -* Function description -* Set position in a file. -* Not needed (supported) by embOS, minimal implementation -*/ -int _lseek(int file, int ptr, int dir) { - (void) file; /* Not used, avoid warning */ - (void) ptr; /* Not used, avoid warning */ - (void) dir; /* Not used, avoid warning */ - return 0; -} - -/********************************************************************* -* -* _open() -* -* Function description -* Open a file. -* Not needed (supported) by embOS, minimal implementation -*/ -int _open(const char* pName, int flags, int mode) { - (void) pName; /* Not used, avoid warning */ - (void) flags; /* Not used, avoid warning */ - (void) mode; /* Not used, avoid warning */ - return -1; -} - -/********************************************************************* -* -* _read() -* -* Function description -* Read from a file. -* Not needed (supported) by embOS, minimal implementation -*/ -int _read(int file, char* p, int len) { - (void) file; /* Not used, avoid warning */ - (void) p; /* Not used, avoid warning */ - (void) len; /* Not used, avoid warning */ - return 0; -} - -/********************************************************************* -* -* _sbrk() -* -* Function description -* Increase program data space. As malloc and related functions depend on this, -* it is required to have a working implementation. -* __heap_start__ and __heap_end__ have to be defined in the linker file -*/ -caddr_t _sbrk(int incr) { - static char* heap_end; - char* prev_heap_end; - - if (heap_end == NULL) { - heap_end = & __heap_start__; - } - prev_heap_end = heap_end; - if (heap_end + incr > &__heap_end__) { - /* Some of the libstdc++-v3 tests rely upon detecting - out of memory errors, so do not abort here. */ - errno = ENOMEM; - return (caddr_t) -1; - } - heap_end += incr; - return (caddr_t) prev_heap_end; -} - -/********************************************************************* -* -* _stat() -* -* Function description -* Status of a file (by name). -* Not needed (supported) by embOS, minimal implementation -*/ -int _stat(const char* pFile, struct stat* pSt) { - (void) pFile; /* Not used, avoid warning */ - pSt->st_mode = S_IFCHR; - return 0; -} - - -/********************************************************************* -* -* _times() -* -* Function description -* Timing information for current process. -* Not needed (supported) by embOS, minimal implementation -*/ -clock_t _times(struct tms* pBuf) { - (void) pBuf; /* Not used, avoid warning */ - return -1; -} - -/********************************************************************* -* -* _unlink() -* -* Function description -* Remove a file's directory entry. -* Not needed (supported) by embOS, minimal implementation -*/ -int _unlink(char* pName) { - (void) pName; /* Not used, avoid warning */ - errno = ENOENT; - return -1; -} - -/********************************************************************* -* -* _wait() -* -* Function description -* Wait for a child process. -* Not needed (supported) by embOS, minimal implementation -*/ -int _wait(int* pStatus) { - (void) pStatus; /* Not used, avoid warning */ - errno = ECHILD; - return -1; -} - -/********************************************************************* -* -* _write() -* -* Function description -* Write to a file. -* libc subroutines will use this system routine for output to all files, -* including stdouts if you need to generate any output, -* for example to a serial port for debugging, you should make your minimal write capable of doing this. -* The following minimal implementation is an incomplete example; it relies on a outbyte subroutine -* (not shown; typically, you must write this in assembler from examples provided by your hardware manufacturer) -* to actually perform the output. -* Not needed (supported) by embOS, minimal implementation -*/ -int _write(int file, char* p, int len) { - int todo; - - (void) file; /* Not used, avoid warning */ - (void) p; /* Not used, avoid warning */ - (void) len; /* Not used, avoid warning */ - for (todo = 0; todo < len; todo++) { - /* outbyte (*p++); */ /* Not supported, has to be implemented if needed */ - } - return len; -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/RTOSInit_STM32H7xx.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/RTOSInit_STM32H7xx.c deleted file mode 100644 index 961451f54..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/RTOSInit_STM32H7xx.c +++ /dev/null @@ -1,292 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : Initializes and handles the hardware for embOS -*/ -/* modified by Quantum Leaps: -* commented out OS_Idle() to allow for costomization in the BSP -*/ - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "stm32h7xx.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -/********************************************************************* -* -* System tick settings -*/ -#ifdef CORE_CM4 - #define OS_TIMER_FREQ (SystemD2Clock) -#else - #define OS_TIMER_FREQ (SystemCoreClock) -#endif -#define OS_TICK_FREQ (1000u) -#define OS_INT_FREQ (OS_TICK_FREQ) - -/********************************************************************* -* -* embOSView settings -*/ -#ifndef OS_VIEW_IFSELECT - #define OS_VIEW_IFSELECT OS_VIEW_IF_JLINK -#endif - -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - #include "JLINKMEM.h" -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - #include "BSP_UART.h" - #define OS_UART (0u) - #define OS_BAUDRATE (38400u) -#endif - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - const OS_U32 OS_JLINKMEM_BufferSize = 32u; // Size of the communication buffer for JLINKMEM -#else - const OS_U32 OS_JLINKMEM_BufferSize = 0u; // Buffer not used -#endif - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ - -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) -/********************************************************************* -* -* _OS_OnRX() -* -* Function description -* Callback wrapper function for BSP UART module. -*/ -static void _OS_OnRX(unsigned int Unit, unsigned char c) { - OS_USE_PARA(Unit); - OS_COM_OnRx(c); -} - -/********************************************************************* -* -* _OS_OnTX() -* -* Function description -* Callback wrapper function for BSP UART module. -*/ -static int _OS_OnTX(unsigned int Unit) { - OS_USE_PARA(Unit); - return (int)OS_COM_OnTx(); -} -#endif - -/********************************************************************* -* -* _OS_GetHWTimerCycles() -* -* Function description -* Returns the current hardware timer count value. -* -* Return value -* Current timer count value. -*/ -static unsigned int _OS_GetHWTimerCycles(void) { - return SysTick->VAL; -} - -/********************************************************************* -* -* _OS_GetHWTimer_IntPending() -* -* Function description -* Returns if the hardware timer interrupt pending flag is set. -* -* Return value -* == 0: Interrupt pending flag not set. -* != 0: Interrupt pending flag set. -*/ -static unsigned int _OS_GetHWTimer_IntPending(void) { - return SCB->ICSR & SCB_ICSR_PENDSTSET_Msk; -} - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* SysTick_Handler() -* -* Function description -* This is the hardware timer exception handler. -*/ -void SysTick_Handler(void) { -#if (OS_SUPPORT_PROFILE != 0) - if (SEGGER_SYSVIEW_DWT_IS_ENABLED() == 0u) { - SEGGER_SYSVIEW_TickCnt++; - } -#endif - OS_INT_EnterNestable(); - OS_TICK_Handle(); -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_Process(); -#endif - OS_INT_LeaveNestable(); -} - -/********************************************************************* -* -* OS_InitHW() -* -* Function description -* Initialize the hardware required for embOS to run. -*/ -void OS_InitHW(void) { - OS_INT_IncDI(); - // - // Initialize NVIC vector table offset register if applicable for this device. - // Might be necessary for RAM targets or application not running from 0x00. - // -#if (defined(__VTOR_PRESENT) && __VTOR_PRESENT == 1) - SCB->VTOR = (OS_U32)&__Vectors; -#endif - // - // Enable instruction and data cache if applicable for this device - // -#if (defined(__ICACHE_PRESENT) && __ICACHE_PRESENT == 1) - SCB_EnableICache(); -#endif -#if (defined(__DCACHE_PRESENT) && __DCACHE_PRESENT == 1) - SCB_EnableDCache(); -#endif - // - // We assume PLL and core clock were already set by the SystemInit() function, - // which was called from the startup code. Therefore, we just ensure the system - // clock variable is updated and then set the periodic system timer tick for embOS. - // - SystemCoreClockUpdate(); // Update the system clock variable (might not have been set before) - SysTick_Config(OS_TIMER_FREQ / OS_INT_FREQ); // Setup SysTick Timer - NVIC_SetPriority(SysTick_IRQn, (1u << __NVIC_PRIO_BITS) - 2u); // Set the priority higher than the PendSV priority - // - // Inform embOS about the timer settings - // - { - OS_SYSTIMER_CONFIG SysTimerConfig = {OS_TIMER_FREQ, OS_INT_FREQ, OS_TIMER_DOWNCOUNTING, _OS_GetHWTimerCycles, _OS_GetHWTimer_IntPending}; - OS_TIME_ConfigSysTimer(&SysTimerConfig); - } - // - // Configure and initialize SEGGER SystemView - // -#if (OS_SUPPORT_PROFILE != 0) - SEGGER_SYSVIEW_Conf(); -#endif - // - // Initialize communication for embOSView - // -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_SetpfOnRx(OS_COM_OnRx); - JLINKMEM_SetpfOnTx(OS_COM_OnTx); - JLINKMEM_SetpfGetNextChar(OS_COM_GetNextChar); -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - BSP_UART_Init(OS_UART, OS_BAUDRATE, BSP_UART_DATA_BITS_8, BSP_UART_PARITY_NONE, BSP_UART_STOP_BITS_1); - BSP_UART_SetReadCallback(OS_UART, _OS_OnRX); - BSP_UART_SetWriteCallback(OS_UART, _OS_OnTX); -#endif - OS_INT_DecRI(); -} - -/********************************************************************* -* -* OS_Idle() -* -* Function description -* This code is executed whenever no task, software timer, or -* interrupt is ready for execution. -* -* Additional information -* The idle loop does not have a stack of its own, therefore no -* functionality should be implemented that relies on the stack -* to be preserved. -*/ -/* Quantum Leaps: - commented out OS_Idle() to allow for costomization in the BSP - -void OS_Idle(void) { // Idle loop: No task is ready to execute - while (1) { // Nothing to do ... wait for interrupt - #if ((OS_VIEW_IFSELECT != OS_VIEW_IF_JLINK) && (OS_DEBUG == 0)) - // - // When uncommenting this line, please be aware device - // specific issues could occur. - // Therefore, we do not call __WFI() by default. - // - //__WFI(); // Switch CPU into sleep mode - #endif - } -} -*/ - -/********************************************************************* -* -* Optional communication with embOSView -* -********************************************************************** -*/ - -/********************************************************************* -* -* OS_COM_Send1() -* -* Function description -* Sends one character. -*/ -void OS_COM_Send1(OS_U8 c) { -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_SendChar(c); -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - BSP_UART_Write1(OS_UART, c); -#elif (OS_VIEW_IFSELECT == OS_VIEW_DISABLED) - OS_USE_PARA(c); // Avoid compiler warning - OS_COM_ClearTxActive(); // Let embOS know that Tx is not busy -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/SEGGER_HardFaultHandler.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/SEGGER_HardFaultHandler.c deleted file mode 100644 index b8e4a6ea7..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/SEGGER_HardFaultHandler.c +++ /dev/null @@ -1,267 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_HardFaultHandler.c -Purpose : Generic SEGGER HardFault handler for Cortex-M -Literature: - [1] Analyzing HardFaults on Cortex-M CPUs (https://www.segger.com/downloads/appnotes/AN00016_AnalyzingHardFaultsOnCortexM.pdf) - -Additional information: - This HardFault handler enables user-friendly analysis of hard faults - in debug configurations. - If a release configuration requires a HardFault handler, - a specific HardFault handler should be included instead, - which for example issues a reset or turns on an error LED. -*/ - -#include "RTOS.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ -#define SYSHND_CTRL (*(volatile unsigned int*) (0xE000ED24u)) // System Handler Control and State Register -#define NVIC_MFSR (*(volatile unsigned char*) (0xE000ED28u)) // Memory Management Fault Status Register -#define NVIC_BFSR (*(volatile unsigned char*) (0xE000ED29u)) // Bus Fault Status Register -#define NVIC_UFSR (*(volatile unsigned short*)(0xE000ED2Au)) // Usage Fault Status Register -#define NVIC_HFSR (*(volatile unsigned int*) (0xE000ED2Cu)) // Hard Fault Status Register -#define NVIC_DFSR (*(volatile unsigned int*) (0xE000ED30u)) // Debug Fault Status Register -#define NVIC_BFAR (*(volatile unsigned int*) (0xE000ED38u)) // Bus Fault Manage Address Register -#define NVIC_AFSR (*(volatile unsigned int*) (0xE000ED3Cu)) // Auxiliary Fault Status Register - -#ifndef OS_DEBUG // Should be overwritten by project settings - #define OS_DEBUG (0) // in debug builds -#endif - -/********************************************************************* -* -* Prototypes -* -********************************************************************** -*/ -#ifdef __cplusplus - extern "C" { -#endif -void HardFaultHandler(unsigned int* pStack); -#ifdef __cplusplus - } -#endif - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -#if OS_DEBUG -static volatile unsigned int _Continue; // Set this variable to 1 to run further - -static struct { - struct { - volatile unsigned int r0; // Register R0 - volatile unsigned int r1; // Register R1 - volatile unsigned int r2; // Register R2 - volatile unsigned int r3; // Register R3 - volatile unsigned int r12; // Register R12 - volatile unsigned int lr; // Link register - volatile unsigned int pc; // Program counter - union { - volatile unsigned int byte; - struct { - unsigned int IPSR : 8; // Interrupt Program Status register (IPSR) - unsigned int EPSR : 19; // Execution Program Status register (EPSR) - unsigned int APSR : 5; // Application Program Status register (APSR) - } bits; - } psr; // Program status register. - } SavedRegs; - - union { - volatile unsigned int byte; - struct { - unsigned int MEMFAULTACT : 1; // Read as 1 if memory management fault is active - unsigned int BUSFAULTACT : 1; // Read as 1 if bus fault exception is active - unsigned int UnusedBits1 : 1; - unsigned int USGFAULTACT : 1; // Read as 1 if usage fault exception is active - unsigned int UnusedBits2 : 3; - unsigned int SVCALLACT : 1; // Read as 1 if SVC exception is active - unsigned int MONITORACT : 1; // Read as 1 if debug monitor exception is active - unsigned int UnusedBits3 : 1; - unsigned int PENDSVACT : 1; // Read as 1 if PendSV exception is active - unsigned int SYSTICKACT : 1; // Read as 1 if SYSTICK exception is active - unsigned int USGFAULTPENDED : 1; // Usage fault pended; usage fault started but was replaced by a higher-priority exception - unsigned int MEMFAULTPENDED : 1; // Memory management fault pended; memory management fault started but was replaced by a higher-priority exception - unsigned int BUSFAULTPENDED : 1; // Bus fault pended; bus fault handler was started but was replaced by a higher-priority exception - unsigned int SVCALLPENDED : 1; // SVC pended; SVC was started but was replaced by a higher-priority exception - unsigned int MEMFAULTENA : 1; // Memory management fault handler enable - unsigned int BUSFAULTENA : 1; // Bus fault handler enable - unsigned int USGFAULTENA : 1; // Usage fault handler enable - } bits; - } syshndctrl; // System Handler Control and State Register (0xE000ED24) - - union { - volatile unsigned char byte; - struct { - unsigned char IACCVIOL : 1; // Instruction access violation - unsigned char DACCVIOL : 1; // Data access violation - unsigned char UnusedBits : 1; - unsigned char MUNSTKERR : 1; // Unstacking error - unsigned char MSTKERR : 1; // Stacking error - unsigned char UnusedBits2 : 2; - unsigned char MMARVALID : 1; // Indicates the MMAR is valid - } bits; - } mfsr; // Memory Management Fault Status Register (0xE000ED28) - - union { - volatile unsigned int byte; - struct { - unsigned int IBUSERR : 1; // Instruction access violation - unsigned int PRECISERR : 1; // Precise data access violation - unsigned int IMPREISERR : 1; // Imprecise data access violation - unsigned int UNSTKERR : 1; // Unstacking error - unsigned int STKERR : 1; // Stacking error - unsigned int UnusedBits : 2; - unsigned int BFARVALID : 1; // Indicates BFAR is valid - } bits; - } bfsr; // Bus Fault Status Register (0xE000ED29) - volatile unsigned int bfar; // Bus Fault Manage Address Register (0xE000ED38) - - union { - volatile unsigned short byte; - struct { - unsigned short UNDEFINSTR : 1; // Attempts to execute an undefined instruction - unsigned short INVSTATE : 1; // Attempts to switch to an invalid state (e.g., ARM) - unsigned short INVPC : 1; // Attempts to do an exception with a bad value in the EXC_RETURN number - unsigned short NOCP : 1; // Attempts to execute a coprocessor instruction - unsigned short UnusedBits : 4; - unsigned short UNALIGNED : 1; // Indicates that an unaligned access fault has taken place - unsigned short DIVBYZERO : 1; // Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set) - } bits; - } ufsr; // Usage Fault Status Register (0xE000ED2A) - - union { - volatile unsigned int byte; - struct { - unsigned int UnusedBits : 1; - unsigned int VECTBL : 1; // Indicates hard fault is caused by failed vector fetch - unsigned int UnusedBits2 : 28; - unsigned int FORCED : 1; // Indicates hard fault is taken because of bus fault/memory management fault/usage fault - unsigned int DEBUGEVT : 1; // Indicates hard fault is triggered by debug event - } bits; - } hfsr; // Hard Fault Status Register (0xE000ED2C) - - union { - volatile unsigned int byte; - struct { - unsigned int HALTED : 1; // Halt requested in NVIC - unsigned int BKPT : 1; // BKPT instruction executed - unsigned int DWTTRAP : 1; // DWT match occurred - unsigned int VCATCH : 1; // Vector fetch occurred - unsigned int EXTERNAL : 1; // EDBGRQ signal asserted - } bits; - } dfsr; // Debug Fault Status Register (0xE000ED30) - - volatile unsigned int afsr; // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional) -} HardFaultRegs; -#endif - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* HardFaultHandler() -* -* Function description -* C part of the hard fault handler which is called by the assembler -* function HardFault_Handler -*/ -void HardFaultHandler(unsigned int* pStack) { - // - // In case we received a hard fault because of a breakpoint instruction, we return. - // This may happen when using semihosting for printf outputs and no debugger is connected, - // i.e. when running a "Debug" configuration in release mode. - // - if (NVIC_HFSR & (1u << 31)) { - NVIC_HFSR |= (1u << 31); // Reset Hard Fault status - *(pStack + 6u) += 2u; // PC is located on stack at SP + 24 bytes. Increment PC by 2 to skip break instruction. - return; // Return to interrupted application - } -#if OS_DEBUG - // - // Read NVIC registers - // - HardFaultRegs.syshndctrl.byte = SYSHND_CTRL; // System Handler Control and State Register - HardFaultRegs.mfsr.byte = NVIC_MFSR; // Memory Fault Status Register - HardFaultRegs.bfsr.byte = NVIC_BFSR; // Bus Fault Status Register - HardFaultRegs.bfar = NVIC_BFAR; // Bus Fault Manage Address Register - HardFaultRegs.ufsr.byte = NVIC_UFSR; // Usage Fault Status Register - HardFaultRegs.hfsr.byte = NVIC_HFSR; // Hard Fault Status Register - HardFaultRegs.dfsr.byte = NVIC_DFSR; // Debug Fault Status Register - HardFaultRegs.afsr = NVIC_AFSR; // Auxiliary Fault Status Register - // - // Halt execution - // If NVIC registers indicate readable memory, change the variable value to != 0 to continue execution. - // - _Continue = 0u; - while (_Continue == 0u) { - } - // - // Read saved registers from the stack. - // - HardFaultRegs.SavedRegs.r0 = pStack[0]; // Register R0 - HardFaultRegs.SavedRegs.r1 = pStack[1]; // Register R1 - HardFaultRegs.SavedRegs.r2 = pStack[2]; // Register R2 - HardFaultRegs.SavedRegs.r3 = pStack[3]; // Register R3 - HardFaultRegs.SavedRegs.r12 = pStack[4]; // Register R12 - HardFaultRegs.SavedRegs.lr = pStack[5]; // Link register LR - HardFaultRegs.SavedRegs.pc = pStack[6]; // Program counter PC - HardFaultRegs.SavedRegs.psr.byte = pStack[7]; // Program status word PSR - // - // Halt execution - // To step out of the HardFaultHandler, change the variable value to != 0. - // - _Continue = 0u; - while (_Continue == 0u) { - } -#else - // - // If this module is included in a release configuration, simply stay in the HardFault handler - // - (void)pStack; - do { - } while (1); -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/STM32H743XIHx_FLASH.ld b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/STM32H743XIHx_FLASH.ld deleted file mode 100644 index 194e42a3a..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/Setup/STM32H743XIHx_FLASH.ld +++ /dev/null @@ -1,196 +0,0 @@ -/* -***************************************************************************** -** - -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32H743XIHx Device with -** 2048KByte FLASH, 1056KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x400; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K -RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K -ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >DTCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >DTCMRAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - __heap_start__ = .; - . = . + _Min_Heap_Size; - __heap_end__ = .; - __stack_start__ = .; - . = . + _Min_Stack_Size; - __stack_end__ = .; - . = ALIGN(8); - } >DTCMRAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld b/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld deleted file mode 100644 index 6814e7510..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32H743xx, GNU-ARM linker -* Last Updated for Version: 6.1.0 -* Date of the Last Update: 2018-01-30 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32F746NG */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER.h deleted file mode 100644 index 1be626042..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER.h +++ /dev/null @@ -1,231 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER.h -Purpose : Global types etc & general purpose utility functions. -Revision: $Rev: 22733 $ -*/ - -#ifndef SEGGER_H // Guard against multiple inclusion -#define SEGGER_H - -#include // For va_list. -#include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32 - -#if defined(__cplusplus) -extern "C" { /* Make sure we have C-declarations in C++ programs */ -#endif - -/********************************************************************* -* -* Keywords/specifiers -* -********************************************************************** -*/ - -#ifndef INLINE - #if (defined(__ICCARM__) || defined(__RX) || defined(__ICCRX__) || defined(__ICC430__)) - // - // Various known compilers. - // - #define INLINE inline - #else - #if defined(_MSC_VER) - #if (_MSC_VER >= 1200) - // - // Microsoft VC6 and newer. - // Force inlining without cost checking. - // - #define INLINE __forceinline - #endif - #elif defined(__GNUC__) || defined(__clang__) || defined(__SEGGER_CC__) - // - // Force inlining with GCC & clang. - // - #define INLINE inline __attribute__((always_inline)) - #elif defined(__CC_ARM) - // - // Force inlining with ARMCC (Keil). - // - #define INLINE __inline - #endif - #endif -#endif -#ifndef INLINE - // - // Unknown compiler. - // - #define INLINE -#endif - -/********************************************************************* -* -* Function-like macros -* -********************************************************************** -*/ - -#define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0])) -#define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b)) -#define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b)) - -#ifndef SEGGER_USE_PARA // Some compiler complain about unused parameters. - #define SEGGER_USE_PARA(Para) (void)Para // This works for most compilers. -#endif - -#define SEGGER_ADDR2PTR(Type, Addr) (/*lint -e(923) -e(9078)*/((Type*)((PTR_ADDR)(Addr)))) // Allow cast from address to pointer. -#define SEGGER_PTR2ADDR(p) (/*lint -e(923) -e(9078)*/((PTR_ADDR)(p))) // Allow cast from pointer to address. -#define SEGGER_PTR2PTR(Type, p) (/*lint -e(740) -e(826) -e(9079) -e(9087)*/((Type*)(p))) // Allow cast from one pointer type to another (ignore different size). -#define SEGGER_PTR_DISTANCE(p0, p1) (SEGGER_PTR2ADDR(p0) - SEGGER_PTR2ADDR(p1)) - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -#define SEGGER_PRINTF_FLAG_ADJLEFT (1 << 0) -#define SEGGER_PRINTF_FLAG_SIGNFORCE (1 << 1) -#define SEGGER_PRINTF_FLAG_SIGNSPACE (1 << 2) -#define SEGGER_PRINTF_FLAG_PRECEED (1 << 3) -#define SEGGER_PRINTF_FLAG_ZEROPAD (1 << 4) -#define SEGGER_PRINTF_FLAG_NEGATIVE (1 << 5) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -typedef struct { - char* pBuffer; - int BufferSize; - int Cnt; -} SEGGER_BUFFER_DESC; - -typedef struct { - unsigned int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size. - void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed. - void (*pfClean) (void *p, unsigned long NumBytes); // Optional clean function for cached memory. - void (*pfInvalidate)(void *p, unsigned long NumBytes); // Optional invalidate function for cached memory. -} SEGGER_CACHE_CONFIG; - -typedef struct SEGGER_SNPRINTF_CONTEXT_struct SEGGER_SNPRINTF_CONTEXT; - -struct SEGGER_SNPRINTF_CONTEXT_struct { - void* pContext; // Application specific context. - SEGGER_BUFFER_DESC* pBufferDesc; // Buffer descriptor to use for output. - void (*pfFlush)(SEGGER_SNPRINTF_CONTEXT* pContext); // Callback executed once the buffer is full. Callback decides if the buffer gets cleared to store more or not. -}; - -typedef struct { - void (*pfStoreChar) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, char c); - int (*pfPrintUnsigned) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, U32 v, unsigned Base, char Flags, int Width, int Precision); - int (*pfPrintInt) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, I32 v, unsigned Base, char Flags, int Width, int Precision); -} SEGGER_PRINTF_API; - -typedef void (*SEGGER_pFormatter)(SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, const SEGGER_PRINTF_API* pApi, va_list* pParamList, char Lead, int Width, int Precision); - -typedef struct SEGGER_PRINTF_FORMATTER { - struct SEGGER_PRINTF_FORMATTER* pNext; // Pointer to next formatter. - SEGGER_pFormatter pfFormatter; // Formatter function. - char Specifier; // Format specifier. -} SEGGER_PRINTF_FORMATTER; - -typedef struct { - U32 (*pfGetHPTimestamp)(void); // Mandatory, pfGetHPTimestamp - int (*pfGetUID) (U8 abUID[16]); // Optional, pfGetUID -} SEGGER_BSP_API; - -/********************************************************************* -* -* Utility functions -* -********************************************************************** -*/ - -// -// Memory operations. -// -void SEGGER_ARM_memcpy(void* pDest, const void* pSrc, int NumBytes); -void SEGGER_memcpy (void* pDest, const void* pSrc, unsigned NumBytes); -void SEGGER_memxor (void* pDest, const void* pSrc, unsigned NumBytes); - -// -// String functions. -// -int SEGGER_atoi (const char* s); -int SEGGER_isalnum (int c); -int SEGGER_isalpha (int c); -unsigned SEGGER_strlen (const char* s); -int SEGGER_tolower (int c); -int SEGGER_strcasecmp (const char* sText1, const char* sText2); -int SEGGER_strncasecmp(const char *sText1, const char *sText2, unsigned Count); - -// -// Buffer/printf related. -// -void SEGGER_StoreChar (SEGGER_BUFFER_DESC* pBufferDesc, char c); -void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC* pBufferDesc, U32 v, unsigned Base, int Precision); -void SEGGER_PrintInt (SEGGER_BUFFER_DESC* pBufferDesc, I32 v, unsigned Base, int Precision); -int SEGGER_snprintf (char* pBuffer, int BufferSize, const char* sFormat, ...); -int SEGGER_vsnprintf (char* pBuffer, int BufferSize, const char* sFormat, va_list ParamList); -int SEGGER_vsnprintfEx (SEGGER_SNPRINTF_CONTEXT* pContext, const char* sFormat, va_list ParamList); - -int SEGGER_PRINTF_AddFormatter (SEGGER_PRINTF_FORMATTER* pFormatter, SEGGER_pFormatter pfFormatter, char c); -void SEGGER_PRINTF_AddDoubleFormatter (void); -void SEGGER_PRINTF_AddIPFormatter (void); -void SEGGER_PRINTF_AddBLUEFormatter (void); -void SEGGER_PRINTF_AddCONNECTFormatter(void); -void SEGGER_PRINTF_AddSSLFormatter (void); -void SEGGER_PRINTF_AddSSHFormatter (void); -void SEGGER_PRINTF_AddHTMLFormatter (void); - -// -// BSP abstraction API. -// -int SEGGER_BSP_GetUID (U8 abUID[16]); -int SEGGER_BSP_GetUID32(U32* pUID); -void SEGGER_BSP_SetAPI (const SEGGER_BSP_API* pAPI); -void SEGGER_BSP_SeedUID (void); - -// -// Other API. -// -void SEGGER_VERSION_GetString(char acText[8], unsigned Version); - -#if defined(__cplusplus) -} /* Make sure we have C-declarations in C++ programs */ -#endif - -#endif // Avoid multiple inclusion - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.c deleted file mode 100644 index 0a716196c..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.c +++ /dev/null @@ -1,2057 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT.c -Purpose : Implementation of SEGGER real-time transfer (RTT) which - allows real-time communication on targets which support - debugger memory accesses while the CPU is running. -Revision: $Rev: 22333 $ - -Additional information: - Type "int" is assumed to be 32-bits in size - H->T Host to target communication - T->H Target to host communication - - RTT channel 0 is always present and reserved for Terminal usage. - Name is fixed to "Terminal" - - Effective buffer size: SizeOfBuffer - 1 - - WrOff == RdOff: Buffer is empty - WrOff == (RdOff - 1): Buffer is full - WrOff > RdOff: Free space includes wrap-around - WrOff < RdOff: Used space includes wrap-around - (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): - Buffer full and wrap-around after next byte - - ----------------------------------------------------------------------- -*/ - -#include "SEGGER_RTT.h" - -#include // for memcpy - -/********************************************************************* -* -* Configuration, default values -* -********************************************************************** -*/ - -#if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #ifdef SEGGER_RTT_CB_ALIGN - #error "Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_BUFFER_ALIGN - #error "Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_PUT_CB_SECTION - #error "Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_PUT_BUFFER_SECTION - #error "Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_BUFFER_ALIGNMENT - #error "Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif - #ifdef SEGGER_RTT_ALIGNMENT - #error "Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif -#endif - -#ifndef BUFFER_SIZE_UP - #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host -#endif - -#ifndef BUFFER_SIZE_DOWN - #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) -#endif - -#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS - #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target -#endif - -#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS - #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target -#endif - -#ifndef SEGGER_RTT_BUFFER_SECTION - #if defined(SEGGER_RTT_SECTION) - #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION - #endif -#endif - -#ifndef SEGGER_RTT_ALIGNMENT - #define SEGGER_RTT_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE -#endif - -#ifndef SEGGER_RTT_BUFFER_ALIGNMENT - #define SEGGER_RTT_BUFFER_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE -#endif - -#ifndef SEGGER_RTT_MODE_DEFAULT - #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP -#endif - -#ifndef SEGGER_RTT_LOCK - #define SEGGER_RTT_LOCK() -#endif - -#ifndef SEGGER_RTT_UNLOCK - #define SEGGER_RTT_UNLOCK() -#endif - -#ifndef STRLEN - #define STRLEN(a) strlen((a)) -#endif - -#ifndef STRCPY - #define STRCPY(pDest, pSrc) strcpy((pDest), (pSrc)) -#endif - -#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP - #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 -#endif - -#ifndef SEGGER_RTT_MEMCPY - #ifdef MEMCPY - #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) - #else - #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) - #endif -#endif - -#ifndef MIN - #define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -#ifndef MAX - #define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif -// -// For some environments, NULL may not be defined until certain headers are included -// -#ifndef NULL - #define NULL 0 -#endif - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#if (defined __ICCARM__) || (defined __ICCRX__) - #define RTT_PRAGMA(P) _Pragma(#P) -#endif - -#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT - #if (defined __GNUC__) - #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) - #elif (defined __ICCARM__) || (defined __ICCRX__) - #define PRAGMA(A) _Pragma(#A) -#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ - Var - #elif (defined __CC_ARM) - #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) - #else - #error "Alignment not supported for this compiler." - #endif -#else - #define SEGGER_RTT_ALIGN(Var, Alignment) Var -#endif - -#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) - #if (defined __GNUC__) - #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var - #elif (defined __ICCARM__) || (defined __ICCRX__) -#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ - Var - #elif (defined __CC_ARM) - #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var - #else - #error "Section placement not supported for this compiler." - #endif -#else - #define SEGGER_RTT_PUT_SECTION(Var, Section) Var -#endif - -#if SEGGER_RTT_ALIGNMENT - #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) -#else - #define SEGGER_RTT_CB_ALIGN(Var) Var -#endif - -#if SEGGER_RTT_BUFFER_ALIGNMENT - #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) -#else - #define SEGGER_RTT_BUFFER_ALIGN(Var) Var -#endif - - -#if defined(SEGGER_RTT_SECTION) - #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) -#else - #define SEGGER_RTT_PUT_CB_SECTION(Var) Var -#endif - -#if defined(SEGGER_RTT_BUFFER_SECTION) - #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) -#else - #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var -#endif - -/********************************************************************* -* -* Static const data -* -********************************************************************** -*/ - -static unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ - -// -// RTT Control Block and allocate buffers for channel 0 -// -SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); -SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)])); -SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)])); - -static unsigned char _ActiveTerminal; - -/********************************************************************* -* -* Static functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _DoInit() -* -* Function description -* Initializes the control block an buffers. -* May only be called via INIT() to avoid overriding settings. -* -*/ -#define INIT() { \ - volatile SEGGER_RTT_CB* pRTTCBInit; \ - pRTTCBInit = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \ - do { \ - if (pRTTCBInit->acID[0] == '\0') { \ - _DoInit(); \ - } \ - } while (0); \ - } - -static void _DoInit(void) { - volatile SEGGER_RTT_CB* p; // Volatile to make sure that compiler cannot change the order of accesses to the control block - // - // Initialize control block - // - p = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access control block uncached so that nothing in the cache ever becomes dirty and all changes are visible in HW directly - p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; - p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; - // - // Initialize up buffer 0 - // - p->aUp[0].sName = "Terminal"; - p->aUp[0].pBuffer = _acUpBuffer; - p->aUp[0].SizeOfBuffer = BUFFER_SIZE_UP; - p->aUp[0].RdOff = 0u; - p->aUp[0].WrOff = 0u; - p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; - // - // Initialize down buffer 0 - // - p->aDown[0].sName = "Terminal"; - p->aDown[0].pBuffer = _acDownBuffer; - p->aDown[0].SizeOfBuffer = BUFFER_SIZE_DOWN; - p->aDown[0].RdOff = 0u; - p->aDown[0].WrOff = 0u; - p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; - // - // Finish initialization of the control block. - // Copy Id string in three steps to make sure "SEGGER RTT" is not found - // in initializer memory (usually flash) by J-Link - // - STRCPY((char*)&p->acID[7], "RTT"); - RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order - STRCPY((char*)&p->acID[0], "SEGGER"); - RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order - p->acID[6] = ' '; - RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order -} - -/********************************************************************* -* -* _WriteBlocking() -* -* Function description -* Stores a specified number of characters in SEGGER RTT ring buffer -* and updates the associated write pointer which is periodically -* read by the host. -* The caller is responsible for managing the write chunk sizes as -* _WriteBlocking() will block until all data has been posted successfully. -* -* Parameters -* pRing Ring buffer to post to. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* >= 0 - Number of bytes written into buffer. -*/ -static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) { - unsigned NumBytesToWrite; - unsigned NumBytesWritten; - unsigned RdOff; - unsigned WrOff; - volatile char* pDst; - // - // Write data to buffer and handle wrap-around if necessary - // - NumBytesWritten = 0u; - WrOff = pRing->WrOff; - do { - RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime - if (RdOff > WrOff) { - NumBytesToWrite = RdOff - WrOff - 1u; - } else { - NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); - } - NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around - NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesWritten += NumBytesToWrite; - NumBytes -= NumBytesToWrite; - WrOff += NumBytesToWrite; - while (NumBytesToWrite--) { - *pDst++ = *pBuffer++; - }; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite); - NumBytesWritten += NumBytesToWrite; - pBuffer += NumBytesToWrite; - NumBytes -= NumBytesToWrite; - WrOff += NumBytesToWrite; -#endif - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0u; - } - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - } while (NumBytes); - return NumBytesWritten; -} - -/********************************************************************* -* -* _WriteNoCheck() -* -* Function description -* Stores a specified number of characters in SEGGER RTT ring buffer -* and updates the associated write pointer which is periodically -* read by the host. -* It is callers responsibility to make sure data actually fits in buffer. -* -* Parameters -* pRing Ring buffer to post to. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Notes -* (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking -*/ -static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { - unsigned NumBytesAtOnce; - unsigned WrOff; - unsigned Rem; - volatile char* pDst; - - WrOff = pRing->WrOff; - Rem = pRing->SizeOfBuffer - WrOff; - if (Rem > NumBytes) { - // - // All data fits before wrap around - // - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - WrOff += NumBytes; - while (NumBytes--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff + NumBytes; -#endif - } else { - // - // We reach the end of the buffer, so need to wrap around - // -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - NumBytesAtOnce = Rem; - while (NumBytesAtOnce--) { - *pDst++ = *pData++; - }; - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - NumBytesAtOnce = NumBytes - Rem; - while (NumBytesAtOnce--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytes - Rem; -#else - NumBytesAtOnce = Rem; - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); - NumBytesAtOnce = NumBytes - Rem; - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytesAtOnce; -#endif - } -} - -/********************************************************************* -* -* _PostTerminalSwitch() -* -* Function description -* Switch terminal to the given terminal ID. It is the caller's -* responsibility to ensure the terminal ID is correct and there is -* enough space in the buffer for this to complete successfully. -* -* Parameters -* pRing Ring buffer to post to. -* TerminalId Terminal ID to switch to. -*/ -static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) { - unsigned char ac[2]; - - ac[0] = 0xFFu; - ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit - _WriteBlocking(pRing, (const char*)ac, 2u); -} - -/********************************************************************* -* -* _GetAvailWriteSpace() -* -* Function description -* Returns the number of bytes that can be written to the ring -* buffer without blocking. -* -* Parameters -* pRing Ring buffer to check. -* -* Return value -* Number of bytes that are free in the buffer. -*/ -static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) { - unsigned RdOff; - unsigned WrOff; - unsigned r; - // - // Avoid warnings regarding volatile access order. It's not a problem - // in this case, but dampen compiler enthusiasm. - // - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - if (RdOff <= WrOff) { - r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; - } else { - r = RdOff - WrOff - 1u; - } - return r; -} - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ - -/********************************************************************* -* -* SEGGER_RTT_ReadUpBufferNoLock() -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the application. -* Do not lock against interrupts and multiple access. -* Used to do the same operation that J-Link does, to transfer -* RTT data via other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of Up-buffer to be used. -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -*/ -unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { - unsigned NumBytesRem; - unsigned NumBytesRead; - unsigned RdOff; - unsigned WrOff; - unsigned char* pBuffer; - SEGGER_RTT_BUFFER_UP* pRing; - volatile char* pSrc; - - INIT(); - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - pBuffer = (unsigned char*)pData; - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - NumBytesRead = 0u; - // - // Read from current read position to wrap-around of buffer, first - // - if (RdOff > WrOff) { - NumBytesRem = pRing->SizeOfBuffer - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - // - // Handle wrap-around of buffer - // - if (RdOff == pRing->SizeOfBuffer) { - RdOff = 0u; - } - } - // - // Read remaining items of buffer - // - NumBytesRem = WrOff - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - if (NumBytesRem > 0u) { - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - } - // - // Update read offset of buffer - // - if (NumBytesRead) { - pRing->RdOff = RdOff; - } - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_ReadNoLock() -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the host. -* Do not lock against interrupts and multiple access. -* -* Parameters -* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -*/ -unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { - unsigned NumBytesRem; - unsigned NumBytesRead; - unsigned RdOff; - unsigned WrOff; - unsigned char* pBuffer; - SEGGER_RTT_BUFFER_DOWN* pRing; - volatile char* pSrc; - // - INIT(); - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - pBuffer = (unsigned char*)pData; - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - NumBytesRead = 0u; - // - // Read from current read position to wrap-around of buffer, first - // - if (RdOff > WrOff) { - NumBytesRem = pRing->SizeOfBuffer - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - // - // Handle wrap-around of buffer - // - if (RdOff == pRing->SizeOfBuffer) { - RdOff = 0u; - } - } - // - // Read remaining items of buffer - // - NumBytesRem = WrOff - RdOff; - NumBytesRem = MIN(NumBytesRem, BufferSize); - if (NumBytesRem > 0u) { - pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytesRead += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; - while (NumBytesRem--) { - *pBuffer++ = *pSrc++; - }; -#else - SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); - NumBytesRead += NumBytesRem; - pBuffer += NumBytesRem; - BufferSize -= NumBytesRem; - RdOff += NumBytesRem; -#endif - } - if (NumBytesRead) { - pRing->RdOff = RdOff; - } - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_ReadUpBuffer -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the application. -* Used to do the same operation that J-Link does, to transfer -* RTT data via other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of Up-buffer to be used. -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -* This function locks against all other RTT operations. I.e. during -* the read operation, writing is also locked. -* If only one consumer reads from the up buffer, -* call sEGGER_RTT_ReadUpBufferNoLock() instead. -*/ -unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { - unsigned NumBytesRead; - - SEGGER_RTT_LOCK(); - // - // Call the non-locking read function - // - NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize); - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_Read -* -* Function description -* Reads characters from SEGGER real-time-terminal control block -* which have been previously stored by the host. -* -* Parameters -* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. -* BufferSize Size of the target application buffer. -* -* Return value -* Number of bytes that have been read. -*/ -unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { - unsigned NumBytesRead; - - SEGGER_RTT_LOCK(); - // - // Call the non-locking read function - // - NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return NumBytesRead; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteWithOverwriteNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block. -* SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application -* and overwrites data if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, data is overwritten. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -* (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link -* connection reads RTT data. -*/ -void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - volatile char* pDst; - // - // Get "to-host" ring buffer and copy some elements into local variables. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Check if we will overwrite data and need to adjust the RdOff. - // - if (pRing->WrOff == pRing->RdOff) { - Avail = pRing->SizeOfBuffer - 1u; - } else if ( pRing->WrOff < pRing->RdOff) { - Avail = pRing->RdOff - pRing->WrOff - 1u; - } else { - Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; - } - if (NumBytes > Avail) { - pRing->RdOff += (NumBytes - Avail); - while (pRing->RdOff >= pRing->SizeOfBuffer) { - pRing->RdOff -= pRing->SizeOfBuffer; - } - } - // - // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds - // - Avail = pRing->SizeOfBuffer - pRing->WrOff; - do { - if (Avail > NumBytes) { - // - // Last round - // - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - Avail = NumBytes; - while (NumBytes--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff += Avail; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff += NumBytes; -#endif - break; - } else { - // - // Wrap-around necessary, write until wrap-around and reset WrOff - // - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; -#if SEGGER_RTT_MEMCPY_USE_BYTELOOP - NumBytes -= Avail; - while (Avail--) { - *pDst++ = *pData++; - }; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = 0; -#else - SEGGER_RTT_MEMCPY((void*)pDst, pData, Avail); - pData += Avail; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = 0; - NumBytes -= Avail; -#endif - Avail = (pRing->SizeOfBuffer - 1); - } - } while (NumBytes); -} - -/********************************************************************* -* -* SEGGER_RTT_WriteSkipNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteSkipNoLock does not lock the application and -* skips all data, if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* MUST be > 0!!! -* This is done for performance reasons, so no initial check has do be done. -* -* Return value -* 1: Data has been copied -* 0: No space, data has not been copied -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, all data is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ -#if (RTT_USE_ASM == 0) -unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - unsigned RdOff; - unsigned WrOff; - unsigned Rem; - volatile char* pDst; - // - // Cases: - // 1) RdOff <= WrOff => Space until wrap-around is sufficient - // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) - // 3) RdOff < WrOff => No space in buf - // 4) RdOff > WrOff => Space is sufficient - // 5) RdOff > WrOff => No space in buf - // - // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRing->RdOff; - WrOff = pRing->WrOff; - if (RdOff <= WrOff) { // Case 1), 2) or 3) - Avail = pRing->SizeOfBuffer - WrOff - 1u; // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) - if (Avail >= NumBytes) { // Case 1)? -CopyStraight: - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData, NumBytes); - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff + NumBytes; - return 1; - } - Avail += RdOff; // Space incl. wrap-around - if (Avail >= NumBytes) { // Case 2? => If not, we have case 3) (does not fit) - Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer - pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData, Rem); // Copy 1st chunk - NumBytes -= Rem; - // - // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used - // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element - // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks - // Therefore, check if 2nd memcpy is necessary at all - // - if (NumBytes) { - pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; - memcpy((void*)pDst, pData + Rem, NumBytes); - } - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = NumBytes; - return 1; - } - } else { // Potential case 4) - Avail = RdOff - WrOff - 1u; - if (Avail >= NumBytes) { // Case 4)? => If not, we have case 5) (does not fit) - goto CopyStraight; - } - } - return 0; // No space in buffer -} -#endif - -/********************************************************************* -* -* SEGGER_RTT_WriteDownBufferNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block inside a buffer. -* SEGGER_RTT_WriteDownBufferNoLock does not lock the application. -* Used to do the same operation that J-Link does, to transfer -* RTT data from other channels, such as TCP/IP or UART. -* -* Parameters -* BufferIndex Index of "Down"-buffer to be used. -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Down"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -*/ -unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - unsigned Avail; - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - // - // Get "to-target" ring buffer. - // It is save to cast that to a "to-host" buffer. Up and Down buffer differ in volatility of offsets that might be modified by J-Link. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // How we output depends upon the mode... - // - switch (pRing->Flags) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother. - // - Avail = _GetAvailWriteSpace(pRing); - if (Avail < NumBytes) { - Status = 0u; - } else { - Status = NumBytes; - _WriteNoCheck(pRing, pData, NumBytes); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode, trim to what we can output without blocking. - // - Avail = _GetAvailWriteSpace(pRing); - Status = Avail < NumBytes ? Avail : NumBytes; - _WriteNoCheck(pRing, pData, Status); - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - Status = _WriteBlocking(pRing, pData, NumBytes); - break; - default: - Status = 0u; - break; - } - // - // Finish up. - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteNoLock does not lock the application. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ -unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - unsigned Avail; - const char* pData; - SEGGER_RTT_BUFFER_UP* pRing; - // - // Get "to-host" ring buffer. - // - pData = (const char *)pBuffer; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // How we output depends upon the mode... - // - switch (pRing->Flags) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother. - // - Avail = _GetAvailWriteSpace(pRing); - if (Avail < NumBytes) { - Status = 0u; - } else { - Status = NumBytes; - _WriteNoCheck(pRing, pData, NumBytes); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode, trim to what we can output without blocking. - // - Avail = _GetAvailWriteSpace(pRing); - Status = Avail < NumBytes ? Avail : NumBytes; - _WriteNoCheck(pRing, pData, Status); - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - Status = _WriteBlocking(pRing, pData, NumBytes); - break; - default: - Status = 0u; - break; - } - // - // Finish up. - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteDownBuffer -* -* Function description -* Stores a specified number of characters in SEGGER RTT control block in a buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Down"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* -* Additional information -* This function must not be called when J-Link might also do RTT. -* This function locks against all other RTT operations. I.e. during -* the write operation, writing from the application is also locked. -* If only one consumer writes to the down buffer, -* call SEGGER_RTT_WriteDownBufferNoLock() instead. -*/ -unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - - INIT(); - SEGGER_RTT_LOCK(); - Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_Write -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -*/ -unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { - unsigned Status; - - INIT(); - SEGGER_RTT_LOCK(); - Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_WriteString -* -* Function description -* Stores string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* s Pointer to string. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -* (2) String passed to this function has to be \0 terminated -* (3) \0 termination character is *not* stored in RTT buffer -*/ -unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) { - unsigned Len; - - Len = STRLEN(s); - return SEGGER_RTT_Write(BufferIndex, s, Len); -} - -/********************************************************************* -* -* SEGGER_RTT_PutCharSkipNoLock -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* SEGGER_RTT_PutCharSkipNoLock does not lock the application and -* skips the byte, if it does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, the character is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ - -unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_PutCharSkip -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, the character is dropped. -*/ - -unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Prepare - // - INIT(); - SEGGER_RTT_LOCK(); - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - // - return Status; -} - - /********************************************************************* -* -* SEGGER_RTT_PutChar -* -* Function description -* Stores a single character/byte in SEGGER RTT buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* c Byte to be stored. -* -* Return value -* Number of bytes which have been stored in the "Up"-buffer. -* -* Notes -* (1) Data is stored according to buffer flags. -*/ - -unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned WrOff; - unsigned Status; - volatile char* pDst; - // - // Prepare - // - INIT(); - SEGGER_RTT_LOCK(); - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Get write position and handle wrap-around if necessary - // - WrOff = pRing->WrOff + 1; - if (WrOff == pRing->SizeOfBuffer) { - WrOff = 0; - } - // - // Wait for free space if mode is set to blocking - // - if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { - while (WrOff == pRing->RdOff) { - ; - } - } - // - // Output byte if free space is available - // - if (WrOff != pRing->RdOff) { - pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; - *pDst = c; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - pRing->WrOff = WrOff; - Status = 1; - } else { - Status = 0; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_GetKey -* -* Function description -* Reads one character from the SEGGER RTT buffer. -* Host has previously stored data there. -* -* Return value -* < 0 - No character available (buffer empty). -* >= 0 - Character which has been read. (Possible values: 0 - 255) -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0. -*/ -int SEGGER_RTT_GetKey(void) { - char c; - int r; - - r = (int)SEGGER_RTT_Read(0u, &c, 1u); - if (r == 1) { - r = (int)(unsigned char)c; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_WaitKey -* -* Function description -* Waits until at least one character is avaible in the SEGGER RTT buffer. -* Once a character is available, it is read and this function returns. -* -* Return value -* >=0 - Character which has been read. -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0 -* (2) This function is blocking if no character is present in RTT buffer -*/ -int SEGGER_RTT_WaitKey(void) { - int r; - - do { - r = SEGGER_RTT_GetKey(); - } while (r < 0); - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_HasKey -* -* Function description -* Checks if at least one character for reading is available in the SEGGER RTT buffer. -* -* Return value -* == 0 - No characters are available to read. -* == 1 - At least one character is available. -* -* Notes -* (1) This function is only specified for accesses to RTT buffer 0 -*/ -int SEGGER_RTT_HasKey(void) { - SEGGER_RTT_BUFFER_DOWN* pRing; - unsigned RdOff; - int r; - - INIT(); - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRing->RdOff; - if (RdOff != pRing->WrOff) { - r = 1; - } else { - r = 0; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_HasData -* -* Function description -* Check if there is data from the host in the given buffer. -* -* Return value: -* ==0: No data -* !=0: Data in buffer -* -*/ -unsigned SEGGER_RTT_HasData(unsigned BufferIndex) { - SEGGER_RTT_BUFFER_DOWN* pRing; - unsigned v; - - pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - v = pRing->WrOff; - return v - pRing->RdOff; -} - -/********************************************************************* -* -* SEGGER_RTT_HasDataUp -* -* Function description -* Check if there is data remaining to be sent in the given buffer. -* -* Return value: -* ==0: No data -* !=0: Data in buffer -* -*/ -unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) { - SEGGER_RTT_BUFFER_UP* pRing; - unsigned v; - - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - v = pRing->RdOff; - return pRing->WrOff - v; -} - -/********************************************************************* -* -* SEGGER_RTT_AllocDownBuffer -* -* Function description -* Run-time configuration of the next down-buffer (H->T). -* The next buffer, which is not used yet is configured. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. Buffer Index -* < 0 - Error -*/ -int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int BufferIndex; - volatile SEGGER_RTT_CB* pRTTCB; - - INIT(); - SEGGER_RTT_LOCK(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - BufferIndex = 0; - do { - if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) { - break; - } - BufferIndex++; - } while (BufferIndex < pRTTCB->MaxNumDownBuffers); - if (BufferIndex < pRTTCB->MaxNumDownBuffers) { - pRTTCB->aDown[BufferIndex].sName = sName; - pRTTCB->aDown[BufferIndex].pBuffer = (char*)pBuffer; - pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; - pRTTCB->aDown[BufferIndex].RdOff = 0u; - pRTTCB->aDown[BufferIndex].WrOff = 0u; - pRTTCB->aDown[BufferIndex].Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - } else { - BufferIndex = -1; - } - SEGGER_RTT_UNLOCK(); - return BufferIndex; -} - -/********************************************************************* -* -* SEGGER_RTT_AllocUpBuffer -* -* Function description -* Run-time configuration of the next up-buffer (T->H). -* The next buffer, which is not used yet is configured. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. Buffer Index -* < 0 - Error -*/ -int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int BufferIndex; - volatile SEGGER_RTT_CB* pRTTCB; - - INIT(); - SEGGER_RTT_LOCK(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - BufferIndex = 0; - do { - if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) { - break; - } - BufferIndex++; - } while (BufferIndex < pRTTCB->MaxNumUpBuffers); - if (BufferIndex < pRTTCB->MaxNumUpBuffers) { - pRTTCB->aUp[BufferIndex].sName = sName; - pRTTCB->aUp[BufferIndex].pBuffer = (char*)pBuffer; - pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; - pRTTCB->aUp[BufferIndex].RdOff = 0u; - pRTTCB->aUp[BufferIndex].WrOff = 0u; - pRTTCB->aUp[BufferIndex].Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - } else { - BufferIndex = -1; - } - SEGGER_RTT_UNLOCK(); - return BufferIndex; -} - -/********************************************************************* -* -* SEGGER_RTT_ConfigUpBuffer -* -* Function description -* Run-time configuration of a specific up-buffer (T->H). -* Buffer to be configured is specified by index. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* BufferIndex Index of the buffer to configure. -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 - O.K. -* < 0 - Error -* -* Additional information -* Buffer 0 is configured on compile-time. -* May only be called once per buffer. -* Buffer name and flags can be reconfigured using the appropriate functions. -*/ -int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - if (BufferIndex) { - pUp->sName = sName; - pUp->pBuffer = (char*)pBuffer; - pUp->SizeOfBuffer = BufferSize; - pUp->RdOff = 0u; - pUp->WrOff = 0u; - } - pUp->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_ConfigDownBuffer -* -* Function description -* Run-time configuration of a specific down-buffer (H->T). -* Buffer to be configured is specified by index. -* This includes: Buffer address, size, name, flags, ... -* -* Parameters -* BufferIndex Index of the buffer to configure. -* sName Pointer to a constant name string. -* pBuffer Pointer to a buffer to be used. -* BufferSize Size of the buffer. -* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). -* -* Return value -* >= 0 O.K. -* < 0 Error -* -* Additional information -* Buffer 0 is configured on compile-time. -* May only be called once per buffer. -* Buffer name and flags can be reconfigured using the appropriate functions. -*/ -int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - if (BufferIndex) { - pDown->sName = sName; - pDown->pBuffer = (char*)pBuffer; - pDown->SizeOfBuffer = BufferSize; - pDown->RdOff = 0u; - pDown->WrOff = 0u; - } - pDown->Flags = Flags; - RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetNameUpBuffer -* -* Function description -* Run-time configuration of a specific up-buffer name (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* sName Pointer to a constant name string. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - pUp->sName = sName; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetNameDownBuffer -* -* Function description -* Run-time configuration of a specific Down-buffer name (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* sName Pointer to a constant name string. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - pDown->sName = sName; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetFlagsUpBuffer -* -* Function description -* Run-time configuration of specific up-buffer flags (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer. -* Flags Flags to set for the buffer. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_UP* pUp; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { - SEGGER_RTT_LOCK(); - pUp = &pRTTCB->aUp[BufferIndex]; - pUp->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_SetFlagsDownBuffer -* -* Function description -* Run-time configuration of specific Down-buffer flags (T->H). -* Buffer to be configured is specified by index. -* -* Parameters -* BufferIndex Index of the buffer to renamed. -* Flags Flags to set for the buffer. -* -* Return value -* >= 0 O.K. -* < 0 Error -*/ -int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) { - int r; - volatile SEGGER_RTT_CB* pRTTCB; - volatile SEGGER_RTT_BUFFER_DOWN* pDown; - - INIT(); - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { - SEGGER_RTT_LOCK(); - pDown = &pRTTCB->aDown[BufferIndex]; - pDown->Flags = Flags; - SEGGER_RTT_UNLOCK(); - r = 0; - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_Init -* -* Function description -* Initializes the RTT Control Block. -* Should be used in RAM targets, at start of the application. -* -*/ -void SEGGER_RTT_Init (void) { - _DoInit(); -} - -/********************************************************************* -* -* SEGGER_RTT_SetTerminal -* -* Function description -* Sets the terminal to be used for output on channel 0. -* -* Parameters -* TerminalId Index of the terminal. -* -* Return value -* >= 0 O.K. -* < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id) -* -* Notes -* (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed -*/ -int SEGGER_RTT_SetTerminal (unsigned char TerminalId) { - unsigned char ac[2]; - SEGGER_RTT_BUFFER_UP* pRing; - unsigned Avail; - int r; - - INIT(); - r = 0; - ac[0] = 0xFFu; - if (TerminalId < sizeof(_aTerminalId)) { // We only support a certain number of channels - ac[1] = _aTerminalId[TerminalId]; - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing - if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { - _ActiveTerminal = TerminalId; - _WriteBlocking(pRing, (const char*)ac, 2u); - } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes - Avail = _GetAvailWriteSpace(pRing); - if (Avail >= 2) { - _ActiveTerminal = TerminalId; // Only change active terminal in case of success - _WriteNoCheck(pRing, (const char*)ac, 2u); - } else { - r = -1; - } - } - SEGGER_RTT_UNLOCK(); - } else { - r = -1; - } - return r; -} - -/********************************************************************* -* -* SEGGER_RTT_TerminalOut -* -* Function description -* Writes a string to the given terminal -* without changing the terminal for channel 0. -* -* Parameters -* TerminalId Index of the terminal. -* s String to be printed on the terminal. -* -* Return value -* >= 0 - Number of bytes written. -* < 0 - Error. -* -*/ -int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s) { - int Status; - unsigned FragLen; - unsigned Avail; - SEGGER_RTT_BUFFER_UP* pRing; - // - INIT(); - // - // Validate terminal ID. - // - if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels - // - // Get "to-host" ring buffer. - // - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - // - // Need to be able to change terminal, write data, change back. - // Compute the fixed and variable sizes. - // - FragLen = STRLEN(s); - // - // How we output depends upon the mode... - // - SEGGER_RTT_LOCK(); - Avail = _GetAvailWriteSpace(pRing); - switch (pRing->Flags & SEGGER_RTT_MODE_MASK) { - case SEGGER_RTT_MODE_NO_BLOCK_SKIP: - // - // If we are in skip mode and there is no space for the whole - // of this output, don't bother switching terminals at all. - // - if (Avail < (FragLen + 4u)) { - Status = 0; - } else { - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, FragLen); - _PostTerminalSwitch(pRing, _ActiveTerminal); - } - break; - case SEGGER_RTT_MODE_NO_BLOCK_TRIM: - // - // If we are in trim mode and there is not enough space for everything, - // trim the output but always include the terminal switch. If no room - // for terminal switch, skip that totally. - // - if (Avail < 4u) { - Status = -1; - } else { - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); - _PostTerminalSwitch(pRing, _ActiveTerminal); - } - break; - case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: - // - // If we are in blocking mode, output everything. - // - _PostTerminalSwitch(pRing, TerminalId); - Status = (int)_WriteBlocking(pRing, s, FragLen); - _PostTerminalSwitch(pRing, _ActiveTerminal); - break; - default: - Status = -1; - break; - } - // - // Finish up. - // - SEGGER_RTT_UNLOCK(); - } else { - Status = -1; - } - return Status; -} - -/********************************************************************* -* -* SEGGER_RTT_GetAvailWriteSpace -* -* Function description -* Returns the number of bytes available in the ring buffer. -* -* Parameters -* BufferIndex Index of the up buffer. -* -* Return value -* Number of bytes that are free in the selected up buffer. -*/ -unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex) { - SEGGER_RTT_BUFFER_UP* pRing; - - pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - return _GetAvailWriteSpace(pRing); -} - - -/********************************************************************* -* -* SEGGER_RTT_GetBytesInBuffer() -* -* Function description -* Returns the number of bytes currently used in the up buffer. -* -* Parameters -* BufferIndex Index of the up buffer. -* -* Return value -* Number of bytes that are used in the buffer. -*/ -unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) { - unsigned RdOff; - unsigned WrOff; - unsigned r; - volatile SEGGER_RTT_CB* pRTTCB; - // - // Avoid warnings regarding volatile access order. It's not a problem - // in this case, but dampen compiler enthusiasm. - // - pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - RdOff = pRTTCB->aUp[BufferIndex].RdOff; - WrOff = pRTTCB->aUp[BufferIndex].WrOff; - if (RdOff <= WrOff) { - r = WrOff - RdOff; - } else { - r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff); - } - return r; -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.h deleted file mode 100644 index 5c9f12eec..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT.h +++ /dev/null @@ -1,398 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT.h -Purpose : Implementation of SEGGER real-time transfer which allows - real-time communication on targets which support debugger - memory accesses while the CPU is running. -Revision: $Rev: 20869 $ ----------------------------------------------------------------------- -*/ - -#ifndef SEGGER_RTT_H -#define SEGGER_RTT_H - -#include "SEGGER_RTT_Conf.h" - -/********************************************************************* -* -* Defines, defaults -* -********************************************************************** -*/ -#ifndef RTT_USE_ASM - #if (defined __SES_ARM) // SEGGER Embedded Studio - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __CROSSWORKS_ARM) // Rowley Crossworks - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __ARMCC_VERSION) // ARM compiler - #if (__ARMCC_VERSION >= 6000000) // ARM compiler V6.0 and later is clang based - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #else - #define _CC_HAS_RTT_ASM_SUPPORT 0 - #endif - #elif (defined __GNUC__) // GCC - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __clang__) // Clang compiler - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #elif ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler - #define _CC_HAS_RTT_ASM_SUPPORT 1 - #else - #define _CC_HAS_RTT_ASM_SUPPORT 0 - #endif - #if ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler - // - // IAR assembler / compiler - // - #if (__VER__ < 6300000) - #define VOLATILE - #else - #define VOLATILE volatile - #endif - #if (defined __ARM7M__) // Needed for old versions that do not know the define yet - #if (__CORE__ == __ARM7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #endif - #endif - #if (defined __ARM7EM__) // Needed for old versions that do not know the define yet - #if (__CORE__ == __ARM7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM8M_BASELINE__) // Needed for old versions that do not know the define yet - #if (__CORE__ == __ARM8M_BASELINE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #if (defined __ARM8M_MAINLINE__) // Needed for old versions that do not know the define yet - #if (__CORE__ == __ARM8M_MAINLINE__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() asm VOLATILE ("DMB"); - #endif - #endif - #else - // - // GCC / Clang - // - #if (defined __ARM_ARCH_7M__) // Cortex-M3 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 - #define _CORE_HAS_RTT_ASM_SUPPORT 1 - #define _CORE_NEEDS_DMB 1 - #define RTT__DMB() __asm volatile ("dmb\n" : : :); - #else - #define _CORE_HAS_RTT_ASM_SUPPORT 0 - #endif - #endif - // - // If IDE and core support the ASM version, enable ASM version by default - // - #ifndef _CORE_HAS_RTT_ASM_SUPPORT - #define _CORE_HAS_RTT_ASM_SUPPORT 0 // Default for unknown cores - #endif - #if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT) - #define RTT_USE_ASM (1) - #else - #define RTT_USE_ASM (0) - #endif -#endif - -// -// We need to know if a DMB is needed to make sure that on Cortex-M7 etc. -// the order of accesses to the ring buffers is guaranteed -// Needed for: Cortex-M7, Cortex-M23, Cortex-M33 -// -#ifndef _CORE_NEEDS_DMB - #define _CORE_NEEDS_DMB 0 -#endif - -#ifndef RTT__DMB - #if _CORE_NEEDS_DMB - #error "Don't know how to place inline assembly for DMB" - #else - #define RTT__DMB() - #endif -#endif - -#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE - #define SEGGER_RTT_CPU_CACHE_LINE_SIZE (0) // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here -#endif - -#ifndef SEGGER_RTT_UNCACHED_OFF - #if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #error "SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #else - #define SEGGER_RTT_UNCACHED_OFF (0) - #endif -#endif -#if RTT_USE_ASM - #if SEGGER_RTT_CPU_CACHE_LINE_SIZE - #error "RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" - #endif -#endif - -#ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file -#include -#include - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -// -// Determine how much we must pad the control block to make it a multiple of a cache line in size -// Assuming: U8 = 1B -// U16 = 2B -// U32 = 4B -// U8/U16/U32* = 4B -// -#if SEGGER_RTT_CPU_CACHE_LINE_SIZE // Avoid division by zero in case we do not have any cache - #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * SEGGER_RTT_CPU_CACHE_LINE_SIZE) -#else - #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes) -#endif -#define SEGGER_RTT__CB_SIZE (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24)) -#define SEGGER_RTT__CB_PADDING (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -// -// Description for a circular buffer (also called "ring buffer") -// which is used as up-buffer (T->H) -// -typedef struct { - const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" - char* pBuffer; // Pointer to start of buffer - unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. - unsigned WrOff; // Position of next item to be written by either target. - volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. - unsigned Flags; // Contains configuration flags -} SEGGER_RTT_BUFFER_UP; - -// -// Description for a circular buffer (also called "ring buffer") -// which is used as down-buffer (H->T) -// -typedef struct { - const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" - char* pBuffer; // Pointer to start of buffer - unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. - volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. - unsigned RdOff; // Position of next item to be read by target (down-buffer). - unsigned Flags; // Contains configuration flags -} SEGGER_RTT_BUFFER_DOWN; - -// -// RTT control block which describes the number of buffers available -// as well as the configuration for each buffer -// -// -typedef struct { - char acID[16]; // Initialized to "SEGGER RTT" - int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) - int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) - SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host - SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target -#if SEGGER_RTT__CB_PADDING - unsigned char aDummy[SEGGER_RTT__CB_PADDING]; -#endif -} SEGGER_RTT_CB; - -/********************************************************************* -* -* Global data -* -********************************************************************** -*/ -extern SEGGER_RTT_CB _SEGGER_RTT; - -/********************************************************************* -* -* RTT API functions -* -********************************************************************** -*/ -#ifdef __cplusplus - extern "C" { -#endif -int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); -int SEGGER_RTT_GetKey (void); -unsigned SEGGER_RTT_HasData (unsigned BufferIndex); -int SEGGER_RTT_HasKey (void); -unsigned SEGGER_RTT_HasDataUp (unsigned BufferIndex); -void SEGGER_RTT_Init (void); -unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); -unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); -int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); -int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); -int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); -int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); -int SEGGER_RTT_WaitKey (void); -unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_ASM_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); -void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); -unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex); -unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); -// -// Function macro for performance optimization -// -#define SEGGER_RTT_HASDATA(n) (((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) - -#if RTT_USE_ASM - #define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock -#endif - -/********************************************************************* -* -* RTT transfer functions to send RTT data via other channels. -* -********************************************************************** -*/ -unsigned SEGGER_RTT_ReadUpBuffer (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); -unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); -unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); - -#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly - -/********************************************************************* -* -* RTT "Terminal" API functions -* -********************************************************************** -*/ -int SEGGER_RTT_SetTerminal (unsigned char TerminalId); -int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s); - -/********************************************************************* -* -* RTT printf functions (require SEGGER_RTT_printf.c) -* -********************************************************************** -*/ -int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); -int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); - -#ifdef __cplusplus - } -#endif - -#endif // ifndef(SEGGER_RTT_ASM) - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -// -// Operating modes. Define behavior if buffer is full (not enough space for entire message) -// -#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0) // Skip. Do not block, output nothing. (Default) -#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1) // Trim: Do not block, output as much as fits. -#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. -#define SEGGER_RTT_MODE_MASK (3) - -// -// Control sequences, based on ANSI. -// Can be used to control color, and clear the screen -// -#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors -#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left - -#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m" -#define RTT_CTRL_TEXT_RED "\x1B[2;31m" -#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m" -#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m" -#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m" -#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m" -#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m" -#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m" - -#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m" -#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m" -#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m" -#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m" -#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m" -#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m" -#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m" -#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m" - -#define RTT_CTRL_BG_BLACK "\x1B[24;40m" -#define RTT_CTRL_BG_RED "\x1B[24;41m" -#define RTT_CTRL_BG_GREEN "\x1B[24;42m" -#define RTT_CTRL_BG_YELLOW "\x1B[24;43m" -#define RTT_CTRL_BG_BLUE "\x1B[24;44m" -#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m" -#define RTT_CTRL_BG_CYAN "\x1B[24;46m" -#define RTT_CTRL_BG_WHITE "\x1B[24;47m" - -#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m" -#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m" -#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m" -#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m" -#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m" -#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m" -#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m" -#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m" - - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_ASM_ARMv7M.S b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_ASM_ARMv7M.S deleted file mode 100644 index b2033fd6a..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_ASM_ARMv7M.S +++ /dev/null @@ -1,263 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_RTT_ASM_ARMv7M.S -Purpose : Assembler implementation of RTT functions for ARMv7M - -Additional information: - This module is written to be assembler-independent and works with - GCC and clang (Embedded Studio) and IAR. -*/ - -#define SEGGER_RTT_ASM // Used to control processed input from header file -#include "SEGGER_RTT.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -#define _CCIAR 0 -#define _CCCLANG 1 - -#if (defined __SES_ARM) || (defined __GNUC__) || (defined __clang__) - #define _CC_TYPE _CCCLANG - #define _PUB_SYM .global - #define _EXT_SYM .extern - #define _END .end - #define _WEAK .weak - #define _THUMB_FUNC .thumb_func - #define _THUMB_CODE .code 16 - #define _WORD .word - #define _SECTION(Sect, Type, AlignExp) .section Sect ##, "ax" - #define _ALIGN(Exp) .align Exp - #define _PLACE_LITS .ltorg - #define _DATA_SECT_START - #define _C_STARTUP _start - #define _STACK_END __stack_end__ - #define _RAMFUNC - // - // .text => Link to flash - // .fast => Link to RAM - // OtherSect => Usually link to RAM - // Alignment is 2^x - // -#elif defined (__IASMARM__) - #define _CC_TYPE _CCIAR - #define _PUB_SYM PUBLIC - #define _EXT_SYM EXTERN - #define _END END - #define _WEAK _WEAK - #define _THUMB_FUNC - #define _THUMB_CODE THUMB - #define _WORD DCD - #define _SECTION(Sect, Type, AlignExp) SECTION Sect ## : ## Type ## :REORDER:NOROOT ## (AlignExp) - #define _ALIGN(Exp) alignrom Exp - #define _PLACE_LITS - #define _DATA_SECT_START DATA - #define _C_STARTUP __iar_program_start - #define _STACK_END sfe(CSTACK) - #define _RAMFUNC SECTION_TYPE SHT_PROGBITS, SHF_WRITE | SHF_EXECINSTR - // - // .text => Link to flash - // .textrw => Link to RAM - // OtherSect => Usually link to RAM - // NOROOT => Allows linker to throw away the function, if not referenced - // Alignment is 2^x - // -#endif - -#if (_CC_TYPE == _CCIAR) - NAME SEGGER_RTT_ASM_ARMv7M -#else - .syntax unified -#endif - -#if defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) - #define SHT_PROGBITS 0x1 - -/********************************************************************* -* -* Public / external symbols -* -********************************************************************** -*/ - - _EXT_SYM __aeabi_memcpy - _EXT_SYM __aeabi_memcpy4 - _EXT_SYM _SEGGER_RTT - - _PUB_SYM SEGGER_RTT_ASM_WriteSkipNoLock - -/********************************************************************* -* -* SEGGER_RTT_WriteSkipNoLock -* -* Function description -* Stores a specified number of characters in SEGGER RTT -* control block which is then read by the host. -* SEGGER_RTT_WriteSkipNoLock does not lock the application and -* skips all data, if the data does not fit into the buffer. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). -* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. -* NumBytes Number of bytes to be stored in the SEGGER RTT control block. -* MUST be > 0!!! -* This is done for performance reasons, so no initial check has do be done. -* -* Return value -* 1: Data has been copied -* 0: No space, data has not been copied -* -* Notes -* (1) If there is not enough space in the "Up"-buffer, all data is dropped. -* (2) For performance reasons this function does not call Init() -* and may only be called after RTT has been initialized. -* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. -*/ - _SECTION(.text, CODE, 2) - _ALIGN(2) - _THUMB_FUNC -SEGGER_RTT_ASM_WriteSkipNoLock: // unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pData, unsigned NumBytes) { - // - // Cases: - // 1) RdOff <= WrOff => Space until wrap-around is sufficient - // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) - // 3) RdOff < WrOff => No space in buf - // 4) RdOff > WrOff => Space is sufficient - // 5) RdOff > WrOff => No space in buf - // - // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough - // - // Register usage: - // R0 Temporary needed as RdOff, register later on - // R1 pData - // R2 - // R3 register. Hold free for subroutine calls - // R4 - // R5 pRing->pBuffer - // R6 pRing (Points to active struct SEGGER_RTT_BUFFER_DOWN) - // R7 WrOff - // - PUSH {R4-R7} - ADD R3,R0,R0, LSL #+1 - LDR.W R0,=_SEGGER_RTT // pRing = &_SEGGER_RTT.aUp[BufferIndex]; - ADD R0,R0,R3, LSL #+3 - ADD R6,R0,#+24 - LDR R0,[R6, #+16] // RdOff = pRing->RdOff; - LDR R7,[R6, #+12] // WrOff = pRing->WrOff; - LDR R5,[R6, #+4] // pRing->pBuffer - CMP R7,R0 - BCC.N _CheckCase4 // if (RdOff <= WrOff) { => Case 1), 2) or 3) - // - // Handling for case 1, later on identical to case 4 - // - LDR R3,[R6, #+8] // Avail = pRing->SizeOfBuffer - WrOff - 1u; => Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) - SUBS R4,R3,R7 // (Used in case we jump into case 2 afterwards) - SUBS R3,R4,#+1 // - CMP R3,R2 - BCC.N _CheckCase2 // if (Avail >= NumBytes) { => Case 1)? -_Case4: - ADDS R5,R7,R5 // pBuffer += WrOff - ADDS R0,R2,R7 // v = WrOff + NumBytes - // - // 2x unrolling for the copy loop that is used most of the time - // This is a special optimization for small SystemView packets and makes them even faster - // - _ALIGN(2) -_LoopCopyStraight: // memcpy(pRing->pBuffer + WrOff, pData, NumBytes); - LDRB R3,[R1], #+1 - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BEQ _CSDone - LDRB R3,[R1], #+1 - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BNE _LoopCopyStraight -_CSDone: -#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here - DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct -#endif - STR R0,[R6, #+12] // pRing->WrOff = WrOff + NumBytes; - MOVS R0,#+1 - POP {R4-R7} - BX LR // Return 1 -_CheckCase2: - ADDS R0,R0,R3 // Avail += RdOff; => Space incl. wrap-around - CMP R0,R2 - BCC.N _Case3 // if (Avail >= NumBytes) { => Case 2? => If not, we have case 3) (does not fit) - // - // Handling for case 2 - // - ADDS R0,R7,R5 // v = pRing->pBuffer + WrOff => Do not change pRing->pBuffer here because 2nd chunk needs org. value - SUBS R2,R2,R4 // NumBytes -= Rem; (Rem = pRing->SizeOfBuffer - WrOff; => Space until end of buffer) -_LoopCopyBeforeWrapAround: // memcpy(pRing->pBuffer + WrOff, pData, Rem); => Copy 1st chunk - LDRB R3,[R1], #+1 - STRB R3,[R0], #+1 // *pDest++ = *pSrc++ - SUBS R4,R4,#+1 - BNE _LoopCopyBeforeWrapAround - // - // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used - // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element - // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks - // Therefore, check if 2nd memcpy is necessary at all - // - ADDS R4,R2,#+0 // Save (needed as counter in loop but must be written to after the loop). Also use this inst to update the flags to skip 2nd loop if possible - BEQ.N _No2ChunkNeeded // if (NumBytes) { -_LoopCopyAfterWrapAround: // memcpy(pRing->pBuffer, pData + Rem, NumBytes); - LDRB R3,[R1], #+1 // pData already points to the next src byte due to copy loop increment before this loop - STRB R3,[R5], #+1 // *pDest++ = *pSrc++ - SUBS R2,R2,#+1 - BNE _LoopCopyAfterWrapAround -_No2ChunkNeeded: -#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here - DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct -#endif - STR R4,[R6, #+12] // pRing->WrOff = NumBytes; => Must be written after copying data because J-Link may read control block asynchronously while writing into buffer - MOVS R0,#+1 - POP {R4-R7} - BX LR // Return 1 -_CheckCase4: - SUBS R0,R0,R7 - SUBS R0,R0,#+1 // Avail = RdOff - WrOff - 1u; - CMP R0,R2 - BCS.N _Case4 // if (Avail >= NumBytes) { => Case 4) == 1) ? => If not, we have case 5) == 3) (does not fit) -_Case3: - MOVS R0,#+0 - POP {R4-R7} - BX LR // Return 0 - _PLACE_LITS - -#endif // defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) - _END - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Conf.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Conf.h deleted file mode 100644 index b01253a50..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Conf.h +++ /dev/null @@ -1,408 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_Conf.h -Purpose : Implementation of SEGGER real-time transfer (RTT) which - allows real-time communication on targets which support - debugger memory accesses while the CPU is running. -Revision: $Rev: 21386 $ - -*/ - -#ifndef SEGGER_RTT_CONF_H -#define SEGGER_RTT_CONF_H - -#ifdef __IAR_SYSTEMS_ICC__ - #include -#endif - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ - -// -// Take in and set to correct values for Cortex-A systems with CPU cache -// -//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE (32) // Largest cache line size (in bytes) in the current system -//#define SEGGER_RTT_UNCACHED_OFF (0xFB000000) // Address alias where RTT CB and buffers can be accessed uncached -// -// Most common case: -// Up-channel 0: RTT -// Up-channel 1: SystemView -// -#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS - #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) -#endif -// -// Most common case: -// Down-channel 0: RTT -// Down-channel 1: SystemView -// -#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS - #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) -#endif - -#ifndef BUFFER_SIZE_UP - #define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) -#endif - -#ifndef BUFFER_SIZE_DOWN - #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) -#endif - -#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE - #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) -#endif - -#ifndef SEGGER_RTT_MODE_DEFAULT - #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) -#endif - -/********************************************************************* -* -* RTT memcpy configuration -* -* memcpy() is good for large amounts of data, -* but the overhead is big for small amounts, which are usually stored via RTT. -* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. -* -* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. -* This is may be required with memory access restrictions, -* such as on Cortex-A devices with MMU. -*/ -#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP - #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop -#endif -// -// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets -// -//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) -// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) -//#endif - -// -// Target is not allowed to perform other RTT operations while string still has not been stored completely. -// Otherwise we would probably end up with a mixed string in the buffer. -// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. -// -// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. -// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. -// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. -// (Higher priority = lower priority number) -// Default value for embOS: 128u -// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC -// or define SEGGER_RTT_LOCK() to completely disable interrupts. -// -#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) -#endif - -/********************************************************************* -* -* RTT lock configuration for SEGGER Embedded Studio, -* Rowley CrossStudio and GCC -*/ -#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32)) - #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs %0, primask \n\t" \ - "movs r1, #1 \n\t" \ - "msr primask, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : \ - ); \ - } - #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs %0, basepri \n\t" \ - "mov r1, %1 \n\t" \ - "msr basepri, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : \ - ); \ - } - - #elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs r1, CPSR \n\t" \ - "mov %0, r1 \n\t" \ - "orr r1, r1, #0xC0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ - "mrs r1, CPSR \n\t" \ - "bic r1, r1, #0xC0 \n\t" \ - "and r0, r0, #0xC0 \n\t" \ - "orr r1, r1, r0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "r0", "r1", "cc" \ - ); \ - } - #elif defined(__riscv) || defined(__riscv_xlen) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("csrr %0, mstatus \n\t" \ - "csrci mstatus, 8 \n\t" \ - "andi %0, %0, 8 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ - "or %0, %0, a1 \n\t" \ - "csrs mstatus, %0 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "a1" \ - ); \ - } - #else - #define SEGGER_RTT_LOCK() - #define SEGGER_RTT_UNLOCK() - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR EWARM -*/ -#ifdef __ICCARM__ - #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \ - (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_PRIMASK(); \ - __set_PRIMASK(1); - - #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ - } - #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \ - (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \ - (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \ - (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_BASEPRI(); \ - __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); - - #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \ - } - #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \ - (defined (__ARM7R__) && (__CORE__ == __ARM7R__)) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - __asm volatile ("mrs r1, CPSR \n\t" \ - "mov %0, r1 \n\t" \ - "orr r1, r1, #0xC0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : "=r" (_SEGGER_RTT__LockState) \ - : \ - : "r1", "cc" \ - ); - - #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ - "mrs r1, CPSR \n\t" \ - "bic r1, r1, #0xC0 \n\t" \ - "and r0, r0, #0xC0 \n\t" \ - "orr r1, r1, r0 \n\t" \ - "msr CPSR_c, r1 \n\t" \ - : \ - : "r" (_SEGGER_RTT__LockState) \ - : "r0", "r1", "cc" \ - ); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR RX -*/ -#ifdef __ICCRX__ - #define SEGGER_RTT_LOCK() { \ - unsigned long _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_interrupt_state(); \ - __disable_interrupt(); - - #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for IAR RL78 -*/ -#ifdef __ICCRL78__ - #define SEGGER_RTT_LOCK() { \ - __istate_t _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_interrupt_state(); \ - __disable_interrupt(); - - #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for KEIL ARM -*/ -#ifdef __CC_ARM - #if (defined __TARGET_ARCH_6S_M) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \ - _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \ - _SEGGER_RTT__PRIMASK = 1u; \ - __schedule_barrier(); - - #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \ - __schedule_barrier(); \ - } - #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - register unsigned char BASEPRI __asm( "basepri"); \ - _SEGGER_RTT__LockState = BASEPRI; \ - BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ - __schedule_barrier(); - - #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \ - __schedule_barrier(); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for TI ARM -*/ -#ifdef __TI_ARM__ - #if defined (__TI_ARM_V6M0__) - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = __get_PRIMASK(); \ - __set_PRIMASK(1); - - #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ - } - #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) - #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY - #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) - #endif - #define SEGGER_RTT_LOCK() { \ - unsigned int _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); - - #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \ - } - #endif -#endif - -/********************************************************************* -* -* RTT lock configuration for CCRX -*/ -#ifdef __RX - #include - #define SEGGER_RTT_LOCK() { \ - unsigned long _SEGGER_RTT__LockState; \ - _SEGGER_RTT__LockState = get_psw() & 0x010000; \ - clrpsw_i(); - - #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration for embOS Simulation on Windows -* (Can also be used for generic RTT locking with embOS) -*/ -#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS) - -void OS_SIM_EnterCriticalSection(void); -void OS_SIM_LeaveCriticalSection(void); - -#define SEGGER_RTT_LOCK() { \ - OS_SIM_EnterCriticalSection(); - -#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \ - } -#endif - -/********************************************************************* -* -* RTT lock configuration fallback -*/ -#ifndef SEGGER_RTT_LOCK - #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) -#endif - -#ifndef SEGGER_RTT_UNLOCK - #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) -#endif - -#endif -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Syscalls_IAR.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Syscalls_IAR.c deleted file mode 100644 index aaf37c3d2..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_Syscalls_IAR.c +++ /dev/null @@ -1,99 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_Syscalls_IAR.c -Purpose : Low-level functions for using printf() via RTT in IAR. - To use RTT for printf output, include this file in your - application and set the Library Configuration to Normal. -Revision: $Rev: 17697 $ ----------------------------------------------------------------------- -*/ -#ifdef __IAR_SYSTEMS_ICC__ - -// -// Since IAR EWARM V8 and EWRX V4, yfuns.h is considered as deprecated and LowLevelIOInterface.h -// shall be used instead. To not break any compatibility with older compiler versions, we have a -// version check in here. -// -#if ((defined __ICCARM__) && (__VER__ >= 8000000)) || ((defined __ICCRX__) && (__VER__ >= 400)) - #include -#else - #include -#endif - -#include "SEGGER_RTT.h" -#pragma module_name = "?__write" - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ -size_t __write(int handle, const unsigned char * buffer, size_t size); - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ -/********************************************************************* -* -* __write() -* -* Function description -* Low-level write function. -* Standard library subroutines will use this system routine -* for output to all files, including stdout. -* Write data via RTT. -*/ -size_t __write(int handle, const unsigned char * buffer, size_t size) { - (void) handle; /* Not used, avoid warning */ - SEGGER_RTT_Write(0, (const char*)buffer, size); - return size; -} - -/********************************************************************* -* -* __write_buffered() -* -* Function description -* Low-level write function. -* Standard library subroutines will use this system routine -* for output to all files, including stdout. -* Write data via RTT. -*/ -size_t __write_buffered(int handle, const unsigned char * buffer, size_t size) { - (void) handle; /* Not used, avoid warning */ - SEGGER_RTT_Write(0, (const char*)buffer, size); - return size; -} - -#endif -/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_printf.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_printf.c deleted file mode 100644 index 60f2fe3a4..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_RTT_printf.c +++ /dev/null @@ -1,484 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------END-OF-HEADER------------------------------ -File : SEGGER_RTT_printf.c -Purpose : Replacement for printf to write formatted data via RTT -Revision: $Rev: 17697 $ ----------------------------------------------------------------------- -*/ -#include "SEGGER_RTT.h" -#include "SEGGER_RTT_Conf.h" - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ - -#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE - #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) -#endif - -#include -#include - - -#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) -#define FORMAT_FLAG_PAD_ZERO (1u << 1) -#define FORMAT_FLAG_PRINT_SIGN (1u << 2) -#define FORMAT_FLAG_ALTERNATE (1u << 3) - -/********************************************************************* -* -* Types -* -********************************************************************** -*/ - -typedef struct { - char* pBuffer; - unsigned BufferSize; - unsigned Cnt; - - int ReturnValue; - - unsigned RTTBufferIndex; -} SEGGER_RTT_PRINTF_DESC; - -/********************************************************************* -* -* Function prototypes -* -********************************************************************** -*/ - -/********************************************************************* -* -* Static code -* -********************************************************************** -*/ -/********************************************************************* -* -* _StoreChar -*/ -static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { - unsigned Cnt; - - Cnt = p->Cnt; - if ((Cnt + 1u) <= p->BufferSize) { - *(p->pBuffer + Cnt) = c; - p->Cnt = Cnt + 1u; - p->ReturnValue++; - } - // - // Write part of string, when the buffer is full - // - if (p->Cnt == p->BufferSize) { - if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { - p->ReturnValue = -1; - } else { - p->Cnt = 0u; - } - } -} - -/********************************************************************* -* -* _PrintUnsigned -*/ -static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { - static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - unsigned Div; - unsigned Digit; - unsigned Number; - unsigned Width; - char c; - - Number = v; - Digit = 1u; - // - // Get actual field width - // - Width = 1u; - while (Number >= Base) { - Number = (Number / Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - // - // Print leading chars if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { - if (FieldWidth != 0u) { - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { - c = '0'; - } else { - c = ' '; - } - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, c); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Compute Digit. - // Loop until Digit has the value of the highest digit required. - // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. - // - while (1) { - if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) - NumDigits--; - } else { - Div = v / Digit; - if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done - break; - } - } - Digit *= Base; - } - // - // Output digits - // - do { - Div = v / Digit; - v -= Div * Digit; - _StoreChar(pBufferDesc, _aV2C[Div]); - if (pBufferDesc->ReturnValue < 0) { - break; - } - Digit /= Base; - } while (Digit); - // - // Print trailing spaces if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - } -} - -/********************************************************************* -* -* _PrintInt -*/ -static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { - unsigned Width; - int Number; - - Number = (v < 0) ? -v : v; - - // - // Get actual field width - // - Width = 1u; - while (Number >= (int)Base) { - Number = (Number / (int)Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { - FieldWidth--; - } - - // - // Print leading spaces if necessary - // - if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - // - // Print sign if necessary - // - if (pBufferDesc->ReturnValue >= 0) { - if (v < 0) { - v = -v; - _StoreChar(pBufferDesc, '-'); - } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { - _StoreChar(pBufferDesc, '+'); - } else { - - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Print leading zeros if necessary - // - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, '0'); - if (pBufferDesc->ReturnValue < 0) { - break; - } - } - } - } - if (pBufferDesc->ReturnValue >= 0) { - // - // Print number without sign - // - _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); - } - } - } -} - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* SEGGER_RTT_vprintf -* -* Function description -* Stores a formatted string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") -* sFormat Pointer to format string -* pParamList Pointer to the list of arguments for the format string -* -* Return values -* >= 0: Number of bytes which have been stored in the "Up"-buffer. -* < 0: Error -*/ -int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { - char c; - SEGGER_RTT_PRINTF_DESC BufferDesc; - int v; - unsigned NumDigits; - unsigned FormatFlags; - unsigned FieldWidth; - char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; - - BufferDesc.pBuffer = acBuffer; - BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; - BufferDesc.Cnt = 0u; - BufferDesc.RTTBufferIndex = BufferIndex; - BufferDesc.ReturnValue = 0; - - do { - c = *sFormat; - sFormat++; - if (c == 0u) { - break; - } - if (c == '%') { - // - // Filter out flags - // - FormatFlags = 0u; - v = 1; - do { - c = *sFormat; - switch (c) { - case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; - case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; - case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; - case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; - default: v = 0; break; - } - } while (v); - // - // filter out field with - // - FieldWidth = 0u; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); - } while (1); - - // - // Filter out precision (number of digits to display) - // - NumDigits = 0u; - c = *sFormat; - if (c == '.') { - sFormat++; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - NumDigits = NumDigits * 10u + ((unsigned)c - '0'); - } while (1); - } - // - // Filter out length modifier - // - c = *sFormat; - do { - if ((c == 'l') || (c == 'h')) { - sFormat++; - c = *sFormat; - } else { - break; - } - } while (1); - // - // Handle specifiers - // - switch (c) { - case 'c': { - char c0; - v = va_arg(*pParamList, int); - c0 = (char)v; - _StoreChar(&BufferDesc, c0); - break; - } - case 'd': - v = va_arg(*pParamList, int); - _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'u': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'x': - case 'X': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); - break; - case 's': - { - const char * s = va_arg(*pParamList, const char *); - do { - c = *s; - s++; - if (c == '\0') { - break; - } - _StoreChar(&BufferDesc, c); - } while (BufferDesc.ReturnValue >= 0); - } - break; - case 'p': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); - break; - case '%': - _StoreChar(&BufferDesc, '%'); - break; - default: - break; - } - sFormat++; - } else { - _StoreChar(&BufferDesc, c); - } - } while (BufferDesc.ReturnValue >= 0); - - if (BufferDesc.ReturnValue > 0) { - // - // Write remaining data, if any - // - if (BufferDesc.Cnt != 0u) { - SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); - } - BufferDesc.ReturnValue += (int)BufferDesc.Cnt; - } - return BufferDesc.ReturnValue; -} - -/********************************************************************* -* -* SEGGER_RTT_printf -* -* Function description -* Stores a formatted string in SEGGER RTT control block. -* This data is read by the host. -* -* Parameters -* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") -* sFormat Pointer to format string, followed by the arguments for conversion -* -* Return values -* >= 0: Number of bytes which have been stored in the "Up"-buffer. -* < 0: Error -* -* Notes -* (1) Conversion specifications have following syntax: -* %[flags][FieldWidth][.Precision]ConversionSpecifier -* (2) Supported flags: -* -: Left justify within the field width -* +: Always print sign extension for signed conversions -* 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision -* Supported conversion specifiers: -* c: Print the argument as one char -* d: Print the argument as a signed integer -* u: Print the argument as an unsigned integer -* x: Print the argument as an hexadecimal integer -* s: Print the string pointed to by the argument -* p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) -*/ -int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { - int r; - va_list ParamList; - - va_start(ParamList, sFormat); - r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); - va_end(ParamList); - return r; -} -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.c deleted file mode 100644 index 337112ff0..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.c +++ /dev/null @@ -1,3043 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW.c -Purpose : System visualization API implementation. -Revision: $Rev: 22278 $ - -Additional information: - Packet format: - Packets with IDs 0..23 are standard packets with known structure. - For efficiency, they do *NOT* contain a length field. - - - Packets with IDs 24..31 are standard packets with extendible - structure and contain a length field. - - - Packet ID 31 is used for SystemView extended events. - - - Packets with IDs >= 32 always contain a length field. - - - Packet IDs: - 0.. 31 : Standard packets, known by SystemView. - 32..1023 : OS-definable packets, described in a SystemView description file. - 1024..2047 : User-definable packets, described in a SystemView description file. - 2048..32767: Undefined. - - Data encoding: - Basic types (int, short, char, ...): - Basic types are encoded little endian with most-significant bit variant - encoding. - Each encoded byte contains 7 data bits [6:0] and the MSB continuation bit. - The continuation bit indicates whether the next byte belongs to the data - (bit set) or this is the last byte (bit clear). - The most significant bits of data are encoded first, proceeding to the - least significant bits in the final byte (little endian). - - Example encoding: - Data: 0x1F4 (500) - Encoded: 0xF4 (First 7 data bits 74 | Continuation bit) - 0x03 (Second 7 data bits 03, no continuation) - - Data: 0xFFFFFFFF - Encoded: 0xFF 0xFF 0xFF 0xFF 0x0F - - Data: 0xA2 (162), 0x03 (3), 0x7000 - Encoded: 0xA2 0x01 0x03 0x80 0xE0 0x01 - - Byte arrays and strings: - Byte arrays and strings are encoded as followed by the raw data. - NumBytes is encoded as a basic type with a theoretical maximum of 4G. - - Example encoding: - Data: "Hello World\0" (0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x00) - Encoded: 0x0B 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 - - Examples packets: - 01 F4 03 80 80 10 // Overflow packet. Data is a single U32. - This packet means: 500 packets lost, Timestamp is 0x40000 - - 02 0F 50 // ISR(15) Enter. Timestamp 80 (0x50) - - 03 20 // ISR Exit. Timestamp 32 (0x20) (Shortest possible packet.) - - Sample code for user defined Packets: - #define MY_ID 0x400 // Any value between 0x400 and 0x7FF - void SendMyPacket(unsigned Para0, unsigned Para1, const char* s) { - U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + MAX_STR_LEN + 1]; - U8* pPayload; - // - pPayload = SEGGER_SYSVIEW_PPREPARE_PACKET(aPacket); // Prepare the packet for SystemView - pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet - pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet - pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, s, MAX_STR_LEN); // Add the string to the packet - // - SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, MY_ID); // Send the packet with EventId = MY_ID - } - - #define MY_ID_1 0x401 - void SendOnePara(unsigned Para0) { - SEGGER_SYSVIEW_RecordU32(MY_ID_1, Para0); - } - -*/ - -/********************************************************************* -* -* #include section -* -********************************************************************** -*/ - -#define SEGGER_SYSVIEW_C // For EXTERN statements in SEGGER_SYSVIEW.h - -#include -#include -#include -#include "SEGGER_SYSVIEW_Int.h" -#include "SEGGER_RTT.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#if SEGGER_SYSVIEW_ID_SHIFT - #define SHRINK_ID(Id) (((Id) - _SYSVIEW_Globals.RAMBaseAddress) >> SEGGER_SYSVIEW_ID_SHIFT) -#else - #define SHRINK_ID(Id) ((Id) - _SYSVIEW_Globals.RAMBaseAddress) -#endif - -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - #define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL - #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL -#else - #define CHANNEL_ID_UP _SYSVIEW_Globals.UpChannel - #define CHANNEL_ID_DOWN _SYSVIEW_Globals.DownChannel -#endif - -#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #if (SEGGER_SYSVIEW_RTT_BUFFER_SIZE % SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE) - #error "SEGGER_SYSVIEW_RTT_BUFFER_SIZE must be a multiple of SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE" - #endif -#endif - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ -// Timestamps may be less than full 32-bits, in which case we need to zero -// the unused bits to properly handle overflows. -// Note that this is a quite common scenario, as a 32-bit time such as -// SysTick might be scaled down to reduce bandwith -// or a 16-bit hardware time might be used. -#if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits - #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ - Delta >>= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; -#else - #define MAKE_DELTA_32BIT(Delta) -#endif - - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#define ENABLE_STATE_OFF 0 -#define ENABLE_STATE_ON 1 -#define ENABLE_STATE_DROPPING 2 - -#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) -#define FORMAT_FLAG_PAD_ZERO (1u << 1) -#define FORMAT_FLAG_PRINT_SIGN (1u << 2) -#define FORMAT_FLAG_ALTERNATE (1u << 3) - -#define MODULE_EVENT_OFFSET (512) - -/********************************************************************* -* -* Types, local -* -********************************************************************** -*/ -typedef struct { - U8* pBuffer; - U8* pPayload; - U8* pPayloadStart; - U32 Options; - unsigned Cnt; -} SEGGER_SYSVIEW_PRINTF_DESC; - -typedef struct { - U8 EnableState; // 0: Disabled, 1: Enabled, (2: Dropping) - U8 UpChannel; - U8 RecursionCnt; - U32 SysFreq; - U32 CPUFreq; - U32 LastTxTimeStamp; - U32 RAMBaseAddress; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - U32 PacketCount; -#else - U32 DropCount; - U8 DownChannel; -#endif - U32 DisabledEvents; - const SEGGER_SYSVIEW_OS_API* pOSAPI; - SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC* pfSendSysDesc; -} SEGGER_SYSVIEW_GLOBALS; - -/********************************************************************* -* -* Function prototypes, required -* -********************************************************************** -*/ -static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId); - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -static const U8 _abSync[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #ifdef SEGGER_SYSVIEW_SECTION - // - // Alignment + special section required - // - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma location=SEGGER_SYSVIEW_SECTION - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to place SystemView buffers in specific section" - #endif - #else - // - // Only alignment required - // - #if (defined __GNUC__) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to align SystemView buffers to cache line size" - #endif - #endif -#else - #ifdef SEGGER_SYSVIEW_SECTION - // - // Only special section required - // - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Do not know how to place SystemView buffers in specific section" - #endif - #else - // - // Neither special section nor alignment required - // - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#endif - -#ifdef SEGGER_SYSVIEW_SECTION - #if (defined __GNUC__) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined __ICCARM__) || (defined __ICCRX__) - #pragma location=SEGGER_SYSVIEW_SECTION - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #pragma location=SEGGER_SYSVIEW_SECTION - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #elif (defined __CC_ARM) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#else - #if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #if (defined __GNUC__) - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); // Small, fixed-size buffer, for back-channel comms - #endif - #elif (defined(__ICCARM__)) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #else - #error "Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned" - #endif - #else - static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; - #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms - #endif - #endif -#endif - -static SEGGER_SYSVIEW_GLOBALS _SYSVIEW_Globals; - -static SEGGER_SYSVIEW_MODULE* _pFirstModule; -static U8 _NumModules; - -/********************************************************************* -* -* Static code -* -********************************************************************** -*/ - -#define ENCODE_U32(pDest, Value) { \ - U8* pSysviewPointer; \ - U32 SysViewData; \ - pSysviewPointer = pDest; \ - SysViewData = Value; \ - while(SysViewData > 0x7F) { \ - *pSysviewPointer++ = (U8)(SysViewData | 0x80); \ - SysViewData >>= 7; \ - }; \ - *pSysviewPointer++ = (U8)SysViewData; \ - pDest = pSysviewPointer; \ - }; - - - -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) -static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; - -#define RECORD_START(PacketSize) SEGGER_SYSVIEW_LOCK(); \ - pPayloadStart = _PreparePacket(_aPacket); - -#define RECORD_END() SEGGER_SYSVIEW_UNLOCK() - -#else - -#define RECORD_START(PacketSize) U8 aPacket[(PacketSize)]; \ - pPayloadStart = _PreparePacket(aPacket); \ - -#define RECORD_END() - -#endif - -/********************************************************************* -* -* _EncodeData() -* -* Function description -* Encode a byte buffer in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pSrc - Pointer to data buffer to be encoded. -* NumBytes - Number of bytes in the buffer to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The data is encoded as a count byte followed by the contents -* of the data buffer. -* Make sure NumBytes + 1 bytes are free for the payload. -*/ -static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { - unsigned int n; - // - n = 0; - *pPayload++ = NumBytes; - while (n < NumBytes) { - *pPayload++ = *pSrc++; - n++; - } - return pPayload; -} - -/********************************************************************* -* -* _EncodeStr() -* -* Function description -* Encode a string in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pText - String to encode. -* Limit - Maximum number of characters to encode from string. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than 1 + Limit bytes will be encoded to the payload. -*/ -static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { - unsigned int n; - unsigned int Len; - // - // Compute string len - // - Len = 0; - if (pText != NULL) { - while(*(pText + Len) != 0) { - Len++; - } - if (Len > Limit) { - Len = Limit; - } - } - // - // Write Len - // - if (Len < 255) { - *pPayload++ = Len; - } else { - *pPayload++ = 255; - *pPayload++ = (Len & 255); - *pPayload++ = ((Len >> 8) & 255); - } - // - // copy string - // - n = 0; - while (n < Len) { - *pPayload++ = *pText++; - n++; - } - return pPayload; -} - -/********************************************************************* -* -* _PreparePacket() -* -* Function description -* Prepare a SystemView event packet header. -* -* Parameters -* pPacket - Pointer to start of packet to initialize. -* -* Return value -* Pointer to first byte of packet payload. -* -* Additional information -* The payload length and evnetId are not initialized. -* PreparePacket only reserves space for them and they are -* computed and filled in by the sending function. -*/ -static U8* _PreparePacket(U8* pPacket) { - return pPacket + 4; -} - -/********************************************************************* -* -* _HandleIncomingPacket() -* -* Function description -* Read an incoming command from the down channel and process it. -* -* Additional information -* This function is called each time after sending a packet. -* Processing incoming packets is done asynchronous. SystemView might -* already have sent event packets after the host has sent a command. -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) -static void _HandleIncomingPacket(void) { - U8 Cmd; - int Status; - // - Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - if (Status > 0) { - switch (Cmd) { - case SEGGER_SYSVIEW_COMMAND_ID_START: - SEGGER_SYSVIEW_Start(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_STOP: - SEGGER_SYSVIEW_Stop(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME: - SEGGER_SYSVIEW_RecordSystime(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST: - SEGGER_SYSVIEW_SendTaskList(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC: - SEGGER_SYSVIEW_GetSysDesc(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES: - SEGGER_SYSVIEW_SendNumModules(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC: - SEGGER_SYSVIEW_SendModuleDescription(); - break; - case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE: - Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - if (Status > 0) { - SEGGER_SYSVIEW_SendModule(Cmd); - } - break; - case SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT: - break; - default: - if (Cmd >= 128) { // Unknown extended command. Dummy read its parameter. - SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); - } - break; - } - } -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - -/********************************************************************* -* -* _TrySendOverflowPacket() -* -* Function description -* Try to transmit an SystemView Overflow packet containing the -* number of dropped packets. -* -* Additional information -* Format as follows: -* 01 Max. packet len is 1 + 5 + 5 = 11 -* -* Example packets sent -* 01 20 40 -* -* Return value -* !=0: Success, Message sent (stored in RTT-Buffer) -* ==0: Buffer full, Message *NOT* stored -* -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) -static int _TrySendOverflowPacket(void) { - U32 TimeStamp; - I32 Delta; - int Status; - U8 aPacket[11]; - U8* pPayload; - - aPacket[0] = SYSVIEW_EVTID_OVERFLOW; // 1 - pPayload = &aPacket[1]; - ENCODE_U32(pPayload, _SYSVIEW_Globals.DropCount); - // - // Compute time stamp delta and append it to packet. - // - TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; - MAKE_DELTA_32BIT(Delta); - ENCODE_U32(pPayload, Delta); - // - // Try to store packet in RTT buffer and update time stamp when this was successful - // - Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, aPacket, pPayload - aPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pPayload - aPacket); - if (Status) { - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; - _SYSVIEW_Globals.EnableState--; // EnableState has been 2, will be 1. Always. - } else { - _SYSVIEW_Globals.DropCount++; - } - // - return Status; -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - -/********************************************************************* -* -* _SendSyncInfo() -* -* Function description -* Send SystemView sync packet and system information in -* post mortem mode. -* -* Additional information -* Sync is 10 * 0x00 without timestamp -*/ -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -static void _SendSyncInfo(void) { - // - // Add sync packet ( 10 * 0x00) - // Send system description - // Send system time - // Send task list - // Send module description - // Send module information - // - SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, _abSync, 10); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); - SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - } - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } - SEGGER_SYSVIEW_RecordSystime(); - SEGGER_SYSVIEW_SendTaskList(); - if (_NumModules > 0) { - int n; - SEGGER_SYSVIEW_SendNumModules(); - for (n = 0; n < _NumModules; n++) { - SEGGER_SYSVIEW_SendModule(n); - } - SEGGER_SYSVIEW_SendModuleDescription(); - } -} -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - -/********************************************************************* -* -* _SendPacket() -* -* Function description -* Send a SystemView packet over RTT. RTT channel and mode are -* configured by macros when the SystemView component is initialized. -* This function takes care of maintaining the packet drop count -* and sending overflow packets when necessary. -* The packet must be passed without Id and Length because this -* function prepends it to the packet before transmission. -* -* Parameters -* pStartPacket - Pointer to start of packet payload. -* There must be at least 4 bytes free to prepend Id and Length. -* pEndPacket - Pointer to end of packet payload. -* EventId - Id of the event to send. -* -*/ -static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId) { - unsigned int NumBytes; - U32 TimeStamp; - U32 Delta; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - int Status; -#endif - -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) - SEGGER_SYSVIEW_LOCK(); -#endif - -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - if (_SYSVIEW_Globals.EnableState == 0) { - goto SendDone; - } -#else - if (_SYSVIEW_Globals.EnableState == 1) { // Enabled, no dropped packets remaining - goto Send; - } - if (_SYSVIEW_Globals.EnableState == 0) { - goto SendDone; - } - // - // Handle buffer full situations: - // Have packets been dropped before because buffer was full? - // In this case try to send and overflow packet. - // - if (_SYSVIEW_Globals.EnableState == 2) { - _TrySendOverflowPacket(); - if (_SYSVIEW_Globals.EnableState != 1) { - goto SendDone; - } - } -Send: -#endif - // - // Check if event is disabled from being recorded. - // - if (EventId < 32) { - if (_SYSVIEW_Globals.DisabledEvents & ((U32)1u << EventId)) { - goto SendDone; - } - } - // - // Prepare actual packet. - // If it is a known packet, prepend eventId only, - // otherwise prepend packet length and eventId. - // - if (EventId < 24) { - *--pStartPacket = EventId; - } else { - NumBytes = pEndPacket - pStartPacket; - if (NumBytes > 127) { - *--pStartPacket = (NumBytes >> 7); - *--pStartPacket = NumBytes | 0x80; - } else { - *--pStartPacket = NumBytes; - } - if (EventId > 127) { - *--pStartPacket = (EventId >> 7); - *--pStartPacket = EventId | 0x80; - } else { - *--pStartPacket = EventId; - } - } - // - // Compute time stamp delta and append it to packet. - // - TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; - MAKE_DELTA_32BIT(Delta); - ENCODE_U32(pEndPacket, Delta); -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - // - // Store packet in RTT buffer by overwriting old data and update time stamp - // - SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; -#else - // - // Try to store packet in RTT buffer and update time stamp when this was successful - // - Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); - if (Status) { - _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; - } else { - _SYSVIEW_Globals.EnableState++; // EnableState has been 1, will be 2. Always. - } -#endif - -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - // - // Add sync and system information periodically if we are in post mortem mode - // - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - if (_SYSVIEW_Globals.PacketCount++ & (1 << SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT)) { - _SendSyncInfo(); - _SYSVIEW_Globals.PacketCount = 0; - } - _SYSVIEW_Globals.RecursionCnt = 0; - } -SendDone: - ; // Avoid "label at end of compound statement" error when using static buffer -#else -SendDone: - // - // Check if host is sending data which needs to be processed. - // Note that since this code is called for every packet, it is very time critical, so we do - // only what is really needed here, which is checking if there is any data - // - if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - _HandleIncomingPacket(); - _SYSVIEW_Globals.RecursionCnt = 0; - } - } -#endif - // -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) - SEGGER_SYSVIEW_UNLOCK(); // We are done. Unlock and return -#endif -} - -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list -/********************************************************************* -* -* _VPrintHost() -* -* Function description -* Send a format string and its parameters to the host. -* -* Parameters -* s Pointer to format string. -* Options Options to be sent to the host. -* pParamList Pointer to the list of arguments for the format string. -*/ -static int _VPrintHost(const char* s, U32 Options, va_list* pParamList) { - U32 aParas[SEGGER_SYSVIEW_MAX_ARGUMENTS]; - U32* pParas; - U32 NumArguments; - const char* p; - char c; - U8* pPayload; - U8* pPayloadStart; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - U8 HasNonScalar; - - HasNonScalar = 0; -#endif - // - // Count number of arguments by counting '%' characters in string. - // If enabled, check for non-scalar modifier flags to format string on the target. - // - p = s; - NumArguments = 0; - for (;;) { - c = *p++; - if (c == 0) { - break; - } - if (c == '%') { - c = *p; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT == 0 - aParas[NumArguments++] = va_arg(*pParamList, int); - if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { - break; - } -#else - if (c == 's') { - HasNonScalar = 1; - break; - } else { - aParas[NumArguments++] = va_arg(*pParamList, int); - if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { - break; - } - } -#endif - } - } - -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - if (HasNonScalar) { - return -1; - } -#endif - // - // Send string and parameters to host - // - { - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32); - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, Options); - ENCODE_U32(pPayload, NumArguments); - pParas = aParas; - while (NumArguments--) { - ENCODE_U32(pPayload, (*pParas)); - pParas++; - } - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); - } - return 0; -} - -/********************************************************************* -* -* _StoreChar() -* -* Function description -* Stores a character in the printf-buffer and sends the buffer when -* it is filled. -* -* Parameters -* p Pointer to the buffer description. -* c Character to be printed. -*/ -static void _StoreChar(SEGGER_SYSVIEW_PRINTF_DESC * p, char c) { - unsigned int Cnt; - U8* pPayload; - U32 Options; - - Cnt = p->Cnt; - if ((Cnt + 1u) <= SEGGER_SYSVIEW_MAX_STRING_LEN) { - *(p->pPayload++) = c; - p->Cnt = Cnt + 1u; - } - // - // Write part of string, when the buffer is full - // - if (p->Cnt == SEGGER_SYSVIEW_MAX_STRING_LEN) { - *(p->pPayloadStart) = p->Cnt; - pPayload = p->pPayload; - Options = p->Options; - ENCODE_U32(pPayload, Options); - ENCODE_U32(pPayload, 0); - _SendPacket(p->pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - p->pPayloadStart = _PreparePacket(p->pBuffer); - p->pPayload = p->pPayloadStart + 1u; - p->Cnt = 0u; - } -} - -/********************************************************************* -* -* _PrintUnsigned() -* -* Function description -* Print an unsigned integer with the given formatting into the -* formatted string. -* -* Parameters -* pBufferDesc Pointer to the buffer description. -* v Value to be printed. -* Base Base of the value. -* NumDigits Number of digits to be printed. -* FieldWidth Width of the printed field. -* FormatFlags Flags for formatting the value. -*/ -static void _PrintUnsigned(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, unsigned int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { - static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - unsigned int Div; - unsigned int Digit; - unsigned int Number; - unsigned int Width; - char c; - - Number = v; - Digit = 1u; - // - // Get actual field width - // - Width = 1u; - while (Number >= Base) { - Number = (Number / Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - // - // Print leading chars if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { - if (FieldWidth != 0u) { - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { - c = '0'; - } else { - c = ' '; - } - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, c); - } - } - } - // - // Compute Digit. - // Loop until Digit has the value of the highest digit required. - // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. - // - while (1) { - if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) - NumDigits--; - } else { - Div = v / Digit; - if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done - break; - } - } - Digit *= Base; - } - // - // Output digits - // - do { - Div = v / Digit; - v -= Div * Digit; - _StoreChar(pBufferDesc, _aV2C[Div]); - Digit /= Base; - } while (Digit); - // - // Print trailing spaces if necessary - // - if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - } - } - } -} - -/********************************************************************* -* -* _PrintInt() -* -* Function description -* Print a signed integer with the given formatting into the -* formatted string. -* -* Parameters -* pBufferDesc Pointer to the buffer description. -* v Value to be printed. -* Base Base of the value. -* NumDigits Number of digits to be printed. -* FieldWidth Width of the printed field. -* FormatFlags Flags for formatting the value. -*/ -static void _PrintInt(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { - unsigned int Width; - int Number; - - Number = (v < 0) ? -v : v; - - // - // Get actual field width - // - Width = 1u; - while (Number >= (int)Base) { - Number = (Number / (int)Base); - Width++; - } - if (NumDigits > Width) { - Width = NumDigits; - } - if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { - FieldWidth--; - } - - // - // Print leading spaces if necessary - // - if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, ' '); - } - } - } - // - // Print sign if necessary - // - if (v < 0) { - v = -v; - _StoreChar(pBufferDesc, '-'); - } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { - _StoreChar(pBufferDesc, '+'); - } else { - - } - // - // Print leading zeros if necessary - // - if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { - if (FieldWidth != 0u) { - while ((FieldWidth != 0u) && (Width < FieldWidth)) { - FieldWidth--; - _StoreChar(pBufferDesc, '0'); - } - } - } - // - // Print number without sign - // - _PrintUnsigned(pBufferDesc, (unsigned int)v, Base, NumDigits, FieldWidth, FormatFlags); -} - -/********************************************************************* -* -* _VPrintTarget() -* -* Function description -* Stores a formatted string. -* This data is read by the host. -* -* Parameters -* sFormat Pointer to format string. -* Options Options to be sent to the host. -* pParamList Pointer to the list of arguments for the format string. -*/ -static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) { - SEGGER_SYSVIEW_PRINTF_DESC BufferDesc; - char c; - int v; - unsigned int NumDigits; - unsigned int FormatFlags; - unsigned int FieldWidth; - U8* pPayloadStart; -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); - SEGGER_SYSVIEW_LOCK(); -#else - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); -#endif - -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - BufferDesc.pBuffer = aPacket; -#else - BufferDesc.pBuffer = _aPacket; -#endif - BufferDesc.Cnt = 0u; - BufferDesc.pPayloadStart = pPayloadStart; - BufferDesc.pPayload = BufferDesc.pPayloadStart + 1u; - BufferDesc.Options = Options; - - do { - c = *sFormat; - sFormat++; - if (c == 0u) { - break; - } - if (c == '%') { - // - // Filter out flags - // - FormatFlags = 0u; - v = 1; - do { - c = *sFormat; - switch (c) { - case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; - case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; - case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; - case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; - default: v = 0; break; - } - } while (v); - // - // filter out field with - // - FieldWidth = 0u; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - FieldWidth = (FieldWidth * 10u) + ((unsigned int)c - '0'); - } while (1); - - // - // Filter out precision (number of digits to display) - // - NumDigits = 0u; - c = *sFormat; - if (c == '.') { - sFormat++; - do { - c = *sFormat; - if ((c < '0') || (c > '9')) { - break; - } - sFormat++; - NumDigits = NumDigits * 10u + ((unsigned int)c - '0'); - } while (1); - } - // - // Filter out length modifier - // - c = *sFormat; - do { - if ((c == 'l') || (c == 'h')) { - c = *sFormat; - sFormat++; - } else { - break; - } - } while (1); - // - // Handle specifiers - // - switch (c) { - case 'c': { - char c0; - v = va_arg(*pParamList, int); - c0 = (char)v; - _StoreChar(&BufferDesc, c0); - break; - } - case 'd': - v = va_arg(*pParamList, int); - _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'u': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 10u, NumDigits, FieldWidth, FormatFlags); - break; - case 'x': - case 'X': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); - break; - case 'p': - v = va_arg(*pParamList, int); - _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); - break; - case '%': - _StoreChar(&BufferDesc, '%'); - break; - default: - break; - } - sFormat++; - } else { - _StoreChar(&BufferDesc, c); - } - } while (*sFormat); - - // - // Write remaining data, if any - // - if (BufferDesc.Cnt != 0u) { - *(BufferDesc.pPayloadStart) = BufferDesc.Cnt; - ENCODE_U32(BufferDesc.pPayload, BufferDesc.Options); - ENCODE_U32(BufferDesc.pPayload, 0); - _SendPacket(BufferDesc.pPayloadStart, BufferDesc.pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - } -#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 - SEGGER_SYSVIEW_UNLOCK(); - RECORD_END(); -#else - RECORD_END(); -#endif -} -#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ - -/********************************************************************* -* -* SEGGER_SYSVIEW_Init() -* -* Function description -* Initializes the SYSVIEW module. -* Must be called before the Systemview Application connects to -* the system. -* -* Parameters -* SysFreq - Frequency of timestamp, usually CPU core clock frequency. -* CPUFreq - CPU core clock frequency. -* pOSAPI - Pointer to the API structure for OS-specific functions. -* pfSendSysDesc - Pointer to record system description callback function. -* -* Additional information -* This function initializes the RTT channel used to transport -* SEGGER SystemView packets. -* The channel is assigned the label "SysView" for client software -* to identify the SystemView channel. -* -* The channel is configured with the macro SEGGER_SYSVIEW_RTT_CHANNEL. -*/ -void SEGGER_SYSVIEW_Init(U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc) { -#ifdef SEGGER_RTT_SECTION - // - // Explicitly initialize the RTT Control Block if it is in its dedicated section. - // - SEGGER_RTT_Init(); -#endif -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - SEGGER_RTT_ConfigUpBuffer(SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#else - _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#endif - _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; - _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - _SYSVIEW_Globals.pOSAPI = pOSAPI; - _SYSVIEW_Globals.SysFreq = SysFreq; - _SYSVIEW_Globals.CPUFreq = CPUFreq; - _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; - _SYSVIEW_Globals.EnableState = 0; - _SYSVIEW_Globals.PacketCount = 0; -#else // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 - SEGGER_RTT_ConfigUpBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); - SEGGER_RTT_ConfigDownBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#else - _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); - _SYSVIEW_Globals.DownChannel = _SYSVIEW_Globals.UpChannel; - SEGGER_RTT_ConfigDownBuffer (_SYSVIEW_Globals.DownChannel, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); -#endif - _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; - _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); - _SYSVIEW_Globals.pOSAPI = pOSAPI; - _SYSVIEW_Globals.SysFreq = SysFreq; - _SYSVIEW_Globals.CPUFreq = CPUFreq; - _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; - _SYSVIEW_Globals.EnableState = 0; -#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SetRAMBase() -* -* Function description -* Sets the RAM base address, which is subtracted from IDs in order -* to save bandwidth. -* -* Parameters -* RAMBaseAddress - Lowest RAM Address. (i.e. 0x20000000 on most Cortex-M) -*/ -void SEGGER_SYSVIEW_SetRAMBase(U32 RAMBaseAddress) { - _SYSVIEW_Globals.RAMBaseAddress = RAMBaseAddress; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordVoid() -* -* Function description -* Formats and sends a SystemView packet with an empty payload. -* -* Parameters -* EventID - SystemView event ID. -*/ -void SEGGER_SYSVIEW_RecordVoid(unsigned int EventID) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32() -* -* Function description -* Formats and sends a SystemView packet containing a single U32 -* parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Value - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32(unsigned int EventID, U32 Value) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Value); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x2() -* -* Function description -* Formats and sends a SystemView packet containing 2 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x2(unsigned int EventID, U32 Para0, U32 Para1) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x3() -* -* Function description -* Formats and sends a SystemView packet containing 3 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x3(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 3 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x4() -* -* Function description -* Formats and sends a SystemView packet containing 4 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x4(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x5() -* -* Function description -* Formats and sends a SystemView packet containing 5 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x5(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x6() -* -* Function description -* Formats and sends a SystemView packet containing 6 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x6(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 6 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x7() -* -* Function description -* Formats and sends a SystemView packet containing 7 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x7(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 7 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x8() -* -* Function description -* Formats and sends a SystemView packet containing 8 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x8(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x9() -* -* Function description -* Formats and sends a SystemView packet containing 9 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -* Para8 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x9(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 9 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - ENCODE_U32(pPayload, Para8); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordU32x10() -* -* Function description -* Formats and sends a SystemView packet containing 10 U32 parameter payload. -* -* Parameters -* EventID - SystemView event ID. -* Para0 - The 32-bit parameter encoded to SystemView packet payload. -* Para1 - The 32-bit parameter encoded to SystemView packet payload. -* Para2 - The 32-bit parameter encoded to SystemView packet payload. -* Para3 - The 32-bit parameter encoded to SystemView packet payload. -* Para4 - The 32-bit parameter encoded to SystemView packet payload. -* Para5 - The 32-bit parameter encoded to SystemView packet payload. -* Para6 - The 32-bit parameter encoded to SystemView packet payload. -* Para7 - The 32-bit parameter encoded to SystemView packet payload. -* Para8 - The 32-bit parameter encoded to SystemView packet payload. -* Para9 - The 32-bit parameter encoded to SystemView packet payload. -*/ -void SEGGER_SYSVIEW_RecordU32x10(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 10 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, Para0); - ENCODE_U32(pPayload, Para1); - ENCODE_U32(pPayload, Para2); - ENCODE_U32(pPayload, Para3); - ENCODE_U32(pPayload, Para4); - ENCODE_U32(pPayload, Para5); - ENCODE_U32(pPayload, Para6); - ENCODE_U32(pPayload, Para7); - ENCODE_U32(pPayload, Para8); - ENCODE_U32(pPayload, Para9); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordString() -* -* Function description -* Formats and sends a SystemView packet containing a string. -* -* Parameters -* EventID - SystemView event ID. -* pString - The string to be sent in the SystemView packet payload. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than SEGGER_SYSVIEW_MAX_STRING_LEN bytes will be encoded to the payload. -*/ -void SEGGER_SYSVIEW_RecordString(unsigned int EventID, const char* pString) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, pString, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, EventID); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Start() -* -* Function description -* Start recording SystemView events. -* -* This function is triggered by the SystemView Application on connect. -* For single-shot or post-mortem mode recording, it needs to be called -* by the application. -* -* Additional information -* This function enables transmission of SystemView packets recorded -* by subsequent trace calls and records a SystemView Start event. -* -* As part of start, a SystemView Init packet is sent, containing the system -* frequency. The list of current tasks, the current system time and the -* system description string is sent, too. -* -* Notes -* SEGGER_SYSVIEW_Start and SEGGER_SYSVIEW_Stop do not nest. -* When SEGGER_SYSVIEW_CAN_RESTART is 1, each received start command -* records the system information. This is required to enable restart -* of recordings when SystemView unexpectedly disconnects without sending -* a stop command before. -*/ -void SEGGER_SYSVIEW_Start(void) { -#if (SEGGER_SYSVIEW_CAN_RESTART == 0) - if (_SYSVIEW_Globals.EnableState == 0) { -#endif - _SYSVIEW_Globals.EnableState = 1; -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) - _SendSyncInfo(); -#else - SEGGER_SYSVIEW_LOCK(); - SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, _abSync, 10); - SEGGER_SYSVIEW_UNLOCK(); - SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); - SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - } - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } - SEGGER_SYSVIEW_RecordSystime(); - SEGGER_SYSVIEW_SendTaskList(); - SEGGER_SYSVIEW_SendNumModules(); -#endif -#if (SEGGER_SYSVIEW_CAN_RESTART == 0) - } -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Stop() -* -* Function description -* Stop recording SystemView events. -* -* This function is triggered by the SystemView Application on disconnect. -* For single-shot or post-mortem mode recording, it can be called -* by the application. -* -* Additional information -* This function disables transmission of SystemView packets recorded -* by subsequent trace calls. If transmission is enabled when -* this function is called, a single SystemView Stop event is recorded -* to the trace, send, and then trace transmission is halted. -*/ -void SEGGER_SYSVIEW_Stop(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - if (_SYSVIEW_Globals.EnableState) { - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TRACE_STOP); - _SYSVIEW_Globals.EnableState = 0; - } - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_GetChannelID() -* -* Function description -* Returns the RTT / channel ID used by SystemView. -*/ -int SEGGER_SYSVIEW_GetChannelID(void) { - return CHANNEL_ID_UP; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_GetSysDesc() -* -* Function description -* Triggers a send of the system information and description. -* -*/ -void SEGGER_SYSVIEW_GetSysDesc(void) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); - ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); - RECORD_END(); - if (_SYSVIEW_Globals.pfSendSysDesc) { - _SYSVIEW_Globals.pfSendSysDesc(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendTaskInfo() -* -* Function description -* Send a Task Info Packet, containing TaskId for identification, -* task priority and task name. -* -* Parameters -* pInfo - Pointer to task information to send. -*/ -void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + 32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); - ENCODE_U32(pPayload, pInfo->Prio); - pPayload = _EncodeStr(pPayload, pInfo->sName, 32); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_INFO); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); - ENCODE_U32(pPayload, pInfo->StackBase); - ENCODE_U32(pPayload, pInfo->StackSize); - ENCODE_U32(pPayload, 0); // Stack End, future use - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendTaskList() -* -* Function description -* Send all tasks descriptors to the host. -*/ -void SEGGER_SYSVIEW_SendTaskList(void) { - if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfSendTaskList) { - _SYSVIEW_Globals.pOSAPI->pfSendTaskList(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendSysDesc() -* -* Function description -* Send the system description string to the host. -* The system description is used by the Systemview Application -* to identify the current application and handle events accordingly. -* -* The system description is usually called by the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* sSysDesc - Pointer to the 0-terminated system description string. -* -* Additional information -* One system description string may not exceed SEGGER_SYSVIEW_MAX_STRING_LEN characters. -* Multiple description strings can be recorded. -* -* The Following items can be described in a system description string. -* Each item is identified by its identifier, followed by '=' and the value. -* Items are separated by ','. -*/ -void SEGGER_SYSVIEW_SendSysDesc(const char *sSysDesc) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, sSysDesc, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_SYSDESC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordSystime() -* -* Function description -* Formats and sends a SystemView Systime containing a single U64 or U32 -* parameter payload. -*/ -void SEGGER_SYSVIEW_RecordSystime(void) { - U64 Systime; - - if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfGetTime) { - Systime = _SYSVIEW_Globals.pOSAPI->pfGetTime(); - SEGGER_SYSVIEW_RecordU32x2(SYSVIEW_EVTID_SYSTIME_US, - (U32)(Systime), - (U32)(Systime >> 32)); - } else { - SEGGER_SYSVIEW_RecordU32(SYSVIEW_EVTID_SYSTIME_CYCLES, SEGGER_SYSVIEW_GET_TIMESTAMP()); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEnterISR() -* -* Function description -* Format and send an ISR entry event. -* -* Additional information -* Example packets sent -* 02 0F 50 // ISR(15) Enter. Timestamp is 80 (0x50) -*/ -void SEGGER_SYSVIEW_RecordEnterISR(void) { - unsigned v; - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - v = SEGGER_SYSVIEW_GET_INTERRUPT_ID(); - ENCODE_U32(pPayload, v); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_ISR_ENTER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitISR() -* -* Function description -* Format and send an ISR exit event. -* -* Additional information -* Format as follows: -* 03 // Max. packet len is 6 -* -* Example packets sent -* 03 20 // ISR Exit. Timestamp is 32 (0x20) -*/ -void SEGGER_SYSVIEW_RecordExitISR(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_EXIT); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitISRToScheduler() -* -* Function description -* Format and send an ISR exit into scheduler event. -* -* Additional information -* Format as follows: -* 18 // Max. packet len is 6 -* -* Example packets sent -* 18 20 // ISR Exit to Scheduler. Timestamp is 32 (0x20) -*/ -void SEGGER_SYSVIEW_RecordExitISRToScheduler(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_TO_SCHEDULER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEnterTimer() -* -* Function description -* Format and send a Timer entry event. -* -* Parameters -* TimerId - Id of the timer which starts. -*/ -void SEGGER_SYSVIEW_RecordEnterTimer(U32 TimerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(TimerId)); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TIMER_ENTER); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordExitTimer() -* -* Function description -* Format and send a Timer exit event. -*/ -void SEGGER_SYSVIEW_RecordExitTimer(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TIMER_EXIT); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEndCall() -* -* Function description -* Format and send an End API Call event without return value. -* -* Parameters -* EventID - Id of API function which ends. -*/ -void SEGGER_SYSVIEW_RecordEndCall(unsigned int EventID) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, EventID); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordEndCallU32() -* -* Function description -* Format and send an End API Call event with return value. -* -* Parameters -* EventID - Id of API function which ends. -* Para0 - Return value which will be returned by the API function. -*/ -void SEGGER_SYSVIEW_RecordEndCallU32(unsigned int EventID, U32 Para0) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, EventID); - ENCODE_U32(pPayload, Para0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnIdle() -* -* Function description -* Record an Idle event. -*/ -void SEGGER_SYSVIEW_OnIdle(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_IDLE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskCreate() -* -* Function description -* Record a Task Create event. The Task Create event corresponds -* to creating a task in the OS. -* -* Parameters -* TaskId - Task ID of created task. -*/ -void SEGGER_SYSVIEW_OnTaskCreate(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_CREATE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskTerminate() -* -* Function description -* Record a Task termination event. -* The Task termination event corresponds to terminating a task in -* the OS. If the TaskId is the currently active task, -* SEGGER_SYSVIEW_OnTaskStopExec may be used, either. -* -* Parameters -* TaskId - Task ID of terminated task. -*/ -void SEGGER_SYSVIEW_OnTaskTerminate(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_TERMINATE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStartExec() -* -* Function description -* Record a Task Start Execution event. The Task Start event -* corresponds to when a task has started to execute rather than -* when it is ready to execute. -* -* Parameters -* TaskId - Task ID of task that started to execute. -*/ -void SEGGER_SYSVIEW_OnTaskStartExec(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_EXEC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStopExec() -* -* Function description -* Record a Task Stop Execution event. The Task Stop event -* corresponds to when a task stops executing and terminates. -*/ -void SEGGER_SYSVIEW_OnTaskStopExec(void) { - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); - // - _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TASK_STOP_EXEC); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStartReady() -* -* Function description -* Record a Task Start Ready event. -* -* Parameters -* TaskId - Task ID of task that started to execute. -*/ -void SEGGER_SYSVIEW_OnTaskStartReady(U32 TaskId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_READY); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_OnTaskStopReady() -* -* Function description -* Record a Task Stop Ready event. -* -* Parameters -* TaskId - Task ID of task that completed execution. -* Cause - Reason for task to stop (i.e. Idle/Sleep) -*/ -void SEGGER_SYSVIEW_OnTaskStopReady(U32 TaskId, unsigned int Cause) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - TaskId = SHRINK_ID(TaskId); - ENCODE_U32(pPayload, TaskId); - ENCODE_U32(pPayload, Cause); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_STOP_READY); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_MarkStart() -* -* Function description -* Record a Performance Marker Start event to start measuring runtime. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_MarkStart(unsigned MarkerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_START); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_MarkStop() -* -* Function description -* Record a Performance Marker Stop event to stop measuring runtime. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_MarkStop(unsigned MarkerId) { - U8 * pPayload; - U8 * pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_STOP); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Mark() -* -* Function description -* Record a Performance Marker intermediate event. -* -* Parameters -* MarkerId - User defined ID for the marker. -*/ -void SEGGER_SYSVIEW_Mark(unsigned int MarkerId) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_MARK); - ENCODE_U32(pPayload, MarkerId); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_NameMarker() -* -* Function description -* Send the name of a Performance Marker to be displayed in SystemView. -* -* Marker names are usually set in the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* MarkerId - User defined ID for the marker. -* sName - Pointer to the marker name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) -*/ -void SEGGER_SYSVIEW_NameMarker(unsigned int MarkerId, const char* sName) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_NAME_MARKER); - ENCODE_U32(pPayload, MarkerId); - pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_NameResource() -* -* Function description -* Send the name of a resource to be displayed in SystemView. -* -* Marker names are usually set in the system description -* callback, to ensure it is only sent when the SystemView Application -* is connected. -* -* Parameters -* ResourceId - Id of the resource to be named. i.e. its address. -* sName - Pointer to the resource name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) -*/ -void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - ENCODE_U32(pPayload, SHRINK_ID(ResourceId)); - pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NAME_RESOURCE); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendPacket() -* -* Function description -* Send an event packet. -* -* Parameters -* pPacket - Pointer to the start of the packet. -* pPayloadEnd - Pointer to the end of the payload. -* Make sure there are at least 5 bytes free after the payload. -* EventId - Id of the event packet. -* -* Return value -* !=0: Success, Message sent. -* ==0: Buffer full, Message *NOT* sent. -*/ -int SEGGER_SYSVIEW_SendPacket(U8* pPacket, U8* pPayloadEnd, unsigned int EventId) { -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) - SEGGER_SYSVIEW_LOCK(); -#endif - _SendPacket(pPacket + 4, pPayloadEnd, EventId); -#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) - SEGGER_SYSVIEW_UNLOCK(); -#endif - return 0; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeU32() -* -* Function description -* Encode a U32 in variable-length format. -* -* Parameters -* pPayload - Pointer to where U32 will be encoded. -* Value - The 32-bit value to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -*/ -U8* SEGGER_SYSVIEW_EncodeU32(U8* pPayload, U32 Value) { - ENCODE_U32(pPayload, Value); - return pPayload; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeString() -* -* Function description -* Encode a string in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* s - String to encode. -* MaxLen - Maximum number of characters to encode from string. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The string is encoded as a count byte followed by the contents -* of the string. -* No more than 1 + MaxLen bytes will be encoded to the payload. -*/ -U8* SEGGER_SYSVIEW_EncodeString(U8* pPayload, const char* s, unsigned int MaxLen) { - return _EncodeStr(pPayload, s, MaxLen); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeData() -* -* Function description -* Encode a byte buffer in variable-length format. -* -* Parameters -* pPayload - Pointer to where string will be encoded. -* pSrc - Pointer to data buffer to be encoded. -* NumBytes - Number of bytes in the buffer to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The data is encoded as a count byte followed by the contents -* of the data buffer. -* Make sure NumBytes + 1 bytes are free for the payload. -*/ -U8* SEGGER_SYSVIEW_EncodeData(U8 *pPayload, const char* pSrc, unsigned int NumBytes) { - return _EncodeData(pPayload, pSrc, NumBytes); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EncodeId() -* -* Function description -* Encode a 32-bit Id in shrunken variable-length format. -* -* Parameters -* pPayload - Pointer to where the Id will be encoded. -* Id - The 32-bit value to be encoded. -* -* Return value -* Pointer to the byte following the value, i.e. the first free -* byte in the payload and the next position to store payload -* content. -* -* Additional information -* The parameters to shrink an Id can be configured in -* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). -* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. -* (i.e. 0x20000000 when all Ids are an address in this RAM) -* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to -* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) -*/ -U8* SEGGER_SYSVIEW_EncodeId(U8* pPayload, U32 Id) { - Id = SHRINK_ID(Id); - ENCODE_U32(pPayload, Id); - return pPayload; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ShrinkId() -* -* Function description -* Get the shrunken value of an Id for further processing like in -* SEGGER_SYSVIEW_NameResource(). -* -* Parameters -* Id - The 32-bit value to be shrunken. -* -* Return value -* Shrunken Id. -* -* Additional information -* The parameters to shrink an Id can be configured in -* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). -* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. -* (i.e. 0x20000000 when all Ids are an address in this RAM) -* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to -* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) -*/ -U32 SEGGER_SYSVIEW_ShrinkId(U32 Id) { - return SHRINK_ID(Id); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RegisterModule() -* -* Function description -* Register a middleware module for recording its events. -* -* Parameters -* pModule - The middleware module information. -* -* Additional information -* SEGGER_SYSVIEW_MODULE elements: -* sDescription - Pointer to a string containing the module name and optionally the module event description. -* NumEvents - Number of events the module wants to register. -* EventOffset - Offset to be added to the event Ids. Out parameter, set by this function. Do not modify after calling this function. -* pfSendModuleDesc - Callback function pointer to send more detailed module description to SystemView Application. -* pNext - Pointer to next registered module. Out parameter, set by this function. Do not modify after calling this function. -*/ -void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { - SEGGER_SYSVIEW_LOCK(); - if (_pFirstModule == 0) { - // - // No module registered, yet. - // Start list with new module. - // EventOffset is the base offset for modules - // - pModule->EventOffset = MODULE_EVENT_OFFSET; - pModule->pNext = 0; - _pFirstModule = pModule; - _NumModules = 1; - } else { - // - // Registreded module(s) present. - // Prepend new module in list. - // EventOffset set from number of events and offset of previous module. - // - pModule->EventOffset = _pFirstModule->EventOffset + _pFirstModule->NumEvents; - pModule->pNext = _pFirstModule; - _pFirstModule = pModule; - _NumModules++; - } - SEGGER_SYSVIEW_SendModule(0); - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } - SEGGER_SYSVIEW_UNLOCK(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_RecordModuleDescription() -* -* Function description -* Sends detailed information of a registered module to the host. -* -* Parameters -* pModule - Pointer to the described module. -* sDescription - Pointer to a description string. -*/ -void SEGGER_SYSVIEW_RecordModuleDescription(const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription) { - U8 ModuleId; - SEGGER_SYSVIEW_MODULE* p; - - p = _pFirstModule; - ModuleId = 0; - do { - if (p == pModule) { - break; - } - ModuleId++; - p = p->pNext; - } while (p); - { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - // - // Send module description - // Send event offset and number of events - // - ENCODE_U32(pPayload, ModuleId); - ENCODE_U32(pPayload, (pModule->EventOffset)); - pPayload = _EncodeStr(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); - RECORD_END(); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendModule() -* -* Function description -* Sends the information of a registered module to the host. -* -* Parameters -* ModuleId - Id of the requested module. -*/ -void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { - SEGGER_SYSVIEW_MODULE* pModule; - U32 n; - - if (_pFirstModule != 0) { - pModule = _pFirstModule; - for (n = 0; n < ModuleId; n++) { - pModule = pModule->pNext; - if (pModule == 0) { - break; - } - } - if (pModule != 0) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = pPayloadStart; - // - // Send module description - // Send event offset and number of events - // - ENCODE_U32(pPayload, ModuleId); - ENCODE_U32(pPayload, (pModule->EventOffset)); - pPayload = _EncodeStr(pPayload, pModule->sModule, SEGGER_SYSVIEW_MAX_STRING_LEN); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); - RECORD_END(); - } - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendModuleDescription() -* -* Function description -* Triggers a send of the registered module descriptions. -* -*/ -void SEGGER_SYSVIEW_SendModuleDescription(void) { - SEGGER_SYSVIEW_MODULE* pModule; - - if (_pFirstModule != 0) { - pModule = _pFirstModule; - do { - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } - pModule = pModule->pNext; - } while (pModule); - } -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_SendNumModules() -* -* Function description -* Send the number of registered modules to the host. -*/ -void SEGGER_SYSVIEW_SendNumModules(void) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2*SEGGER_SYSVIEW_QUANTA_U32); - pPayload = pPayloadStart; - ENCODE_U32(pPayload, _NumModules); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NUMMODULES); - RECORD_END(); -} - -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfHostEx() -* -* Function description -* Print a string which is formatted on the host by the SystemView Application -* with Additional information. -* -* Parameters -* s - String to be formatted. -* Options - Options for the string. i.e. Log level. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, Options); - r = _VPrintHost(s, Options, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, Options); - _VPrintTarget(s, Options, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, Options); - _VPrintHost(s, Options, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfHost() -* -* Function description -* Print a string which is formatted on the host by the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_WarnfHost() -* -* Function description -* Print a warnin string which is formatted on the host by -* the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ErrorfHost() -* -* Function description -* Print an error string which is formatted on the host by -* the SystemView Application. -* -* Parameters -* s - String to be formatted. -* -* Additional information -* All format arguments are treated as 32-bit scalar values. -*/ -void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { - va_list ParamList; -#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - int r; - - va_start(ParamList, s); - r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); - - if (r == -1) { - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); - } -#else - va_start(ParamList, s); - _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); -#endif -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfTargetEx() -* -* Function description -* Print a string which is formatted on the target before sent to -* the host with Additional information. -* -* Parameters -* s - String to be formatted. -* Options - Options for the string. i.e. Log level. -*/ -void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { - va_list ParamList; - - va_start(ParamList, Options); - _VPrintTarget(s, Options, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_PrintfTarget() -* -* Function description -* Print a string which is formatted on the target before sent to -* the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_WarnfTarget() -* -* Function description -* Print a warning string which is formatted on the target before -* sent to the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); - va_end(ParamList); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_ErrorfTarget() -* -* Function description -* Print an error string which is formatted on the target before -* sent to the host. -* -* Parameters -* s - String to be formatted. -*/ -void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { - va_list ParamList; - - va_start(ParamList, s); - _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); - va_end(ParamList); -} -#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF - -/********************************************************************* -* -* SEGGER_SYSVIEW_Print() -* -* Function description -* Print a string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Print(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_LOG); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Warn() -* -* Function description -* Print a warning string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Warn(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_WARNING); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_Error() -* -* Function description -* Print an error string to the host. -* -* Parameters -* s - String to sent. -*/ -void SEGGER_SYSVIEW_Error(const char* s) { - U8* pPayload; - U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); - // - pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); - ENCODE_U32(pPayload, SEGGER_SYSVIEW_ERROR); - ENCODE_U32(pPayload, 0); - _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); - RECORD_END(); -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_EnableEvents() -* -* Function description -* Enable standard SystemView events to be generated. -* -* Parameters -* EnableMask - Events to be enabled. -*/ -void SEGGER_SYSVIEW_EnableEvents(U32 EnableMask) { - _SYSVIEW_Globals.DisabledEvents &= ~EnableMask; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_DisableEvents() -* -* Function description -* Disable standard SystemView events to not be generated. -* -* Parameters -* DisableMask - Events to be disabled. -*/ -void SEGGER_SYSVIEW_DisableEvents(U32 DisableMask) { - _SYSVIEW_Globals.DisabledEvents |= DisableMask; -} - -/********************************************************************* -* -* SEGGER_SYSVIEW_IsStarted() -* -* Function description -* Handle incoming packets if any and check if recording is started. -* -* Return value -* 0: Recording not started. -* > 0: Recording started. -*/ -int SEGGER_SYSVIEW_IsStarted(void) { -#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) - // - // Check if host is sending data which needs to be processed. - // - if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { - if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. - _SYSVIEW_Globals.RecursionCnt = 1; - _HandleIncomingPacket(); - _SYSVIEW_Globals.RecursionCnt = 0; - } - } -#endif - return _SYSVIEW_Globals.EnableState; -} - - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.h deleted file mode 100644 index a42802498..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW.h +++ /dev/null @@ -1,350 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW.h -Purpose : System visualization API. -Revision: $Rev: 21292 $ -*/ - -#ifndef SEGGER_SYSVIEW_H -#define SEGGER_SYSVIEW_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER.h" -#include "SEGGER_SYSVIEW_ConfDefaults.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ - -#define SEGGER_SYSVIEW_MAJOR 3 -#define SEGGER_SYSVIEW_MINOR 10 -#define SEGGER_SYSVIEW_REV 0 -#define SEGGER_SYSVIEW_VERSION ((SEGGER_SYSVIEW_MAJOR * 10000) + (SEGGER_SYSVIEW_MINOR * 100) + SEGGER_SYSVIEW_REV) - -#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp. -#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet. - -#define SEGGER_SYSVIEW_LOG (0u) -#define SEGGER_SYSVIEW_WARNING (1u) -#define SEGGER_SYSVIEW_ERROR (2u) -#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6) - -#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4 -// -// SystemView events. First 32 IDs from 0 .. 31 are reserved for these -// -#define SYSVIEW_EVTID_NOP 0 // Dummy packet. -#define SYSVIEW_EVTID_OVERFLOW 1 -#define SYSVIEW_EVTID_ISR_ENTER 2 -#define SYSVIEW_EVTID_ISR_EXIT 3 -#define SYSVIEW_EVTID_TASK_START_EXEC 4 -#define SYSVIEW_EVTID_TASK_STOP_EXEC 5 -#define SYSVIEW_EVTID_TASK_START_READY 6 -#define SYSVIEW_EVTID_TASK_STOP_READY 7 -#define SYSVIEW_EVTID_TASK_CREATE 8 -#define SYSVIEW_EVTID_TASK_INFO 9 -#define SYSVIEW_EVTID_TRACE_START 10 -#define SYSVIEW_EVTID_TRACE_STOP 11 -#define SYSVIEW_EVTID_SYSTIME_CYCLES 12 -#define SYSVIEW_EVTID_SYSTIME_US 13 -#define SYSVIEW_EVTID_SYSDESC 14 -#define SYSVIEW_EVTID_MARK_START 15 -#define SYSVIEW_EVTID_MARK_STOP 16 -#define SYSVIEW_EVTID_IDLE 17 -#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18 -#define SYSVIEW_EVTID_TIMER_ENTER 19 -#define SYSVIEW_EVTID_TIMER_EXIT 20 -#define SYSVIEW_EVTID_STACK_INFO 21 -#define SYSVIEW_EVTID_MODULEDESC 22 - -#define SYSVIEW_EVTID_INIT 24 -#define SYSVIEW_EVTID_NAME_RESOURCE 25 -#define SYSVIEW_EVTID_PRINT_FORMATTED 26 -#define SYSVIEW_EVTID_NUMMODULES 27 -#define SYSVIEW_EVTID_END_CALL 28 -#define SYSVIEW_EVTID_TASK_TERMINATE 29 - -#define SYSVIEW_EVTID_EX 31 -// -// SystemView extended events. Sent with ID 31. -// -#define SYSVIEW_EVTID_EX_MARK 0 -#define SYSVIEW_EVTID_EX_NAME_MARKER 1 -// -// Event masks to disable/enable events -// -#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP) -#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW) -#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER) -#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT) -#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC) -#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC) -#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY) -#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY) -#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE) -#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO) -#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START) -#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP) -#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES) -#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US) -#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC) -#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START) -#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP) -#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE) -#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER) -#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER) -#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) -#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) -#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) - -#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) -#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) -#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) -#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES) -#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL) -#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE) - -#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX) - -#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \ - | SYSVIEW_EVTMASK_ISR_EXIT \ - | SYSVIEW_EVTMASK_ISR_TO_SCHEDULER) -#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \ - | SYSVIEW_EVTMASK_TASK_STOP_EXEC \ - | SYSVIEW_EVTMASK_TASK_START_READY \ - | SYSVIEW_EVTMASK_TASK_STOP_READY \ - | SYSVIEW_EVTMASK_TASK_CREATE \ - | SYSVIEW_EVTMASK_TASK_INFO \ - | SYSVIEW_EVTMASK_STACK_INFO \ - | SYSVIEW_EVTMASK_TASK_TERMINATE) - -/********************************************************************* -* -* Structures -* -********************************************************************** -*/ - -typedef struct { - U32 TaskID; - const char* sName; - U32 Prio; - U32 StackBase; - U32 StackSize; -} SEGGER_SYSVIEW_TASKINFO; - -typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; - -struct SEGGER_SYSVIEW_MODULE_STRUCT { - const char* sModule; - U32 NumEvents; - U32 EventOffset; - void (*pfSendModuleDesc)(void); - SEGGER_SYSVIEW_MODULE* pNext; -}; - -typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void); - - -/********************************************************************* -* -* Global data -* -********************************************************************** -*/ - -#ifdef EXTERN - #undef EXTERN -#endif - -#ifndef SEGGER_SYSVIEW_C // Defined in SEGGER_SYSVIEW.c which includes this header beside other C-files - #define EXTERN extern -#else - #define EXTERN -#endif - -EXTERN unsigned int SEGGER_SYSVIEW_TickCnt; -EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; - -#undef EXTERN - -/********************************************************************* -* -* API functions -* -********************************************************************** -*/ - -typedef struct { - U64 (*pfGetTime) (void); - void (*pfSendTaskList) (void); -} SEGGER_SYSVIEW_OS_API; - -/********************************************************************* -* -* Control and initialization functions -*/ -void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc); -void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress); -void SEGGER_SYSVIEW_Start (void); -void SEGGER_SYSVIEW_Stop (void); -void SEGGER_SYSVIEW_GetSysDesc (void); -void SEGGER_SYSVIEW_SendTaskList (void); -void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); -void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); -int SEGGER_SYSVIEW_IsStarted (void); -int SEGGER_SYSVIEW_GetChannelID (void); - -/********************************************************************* -* -* Event recording functions -*/ -void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId); -void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0); -void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1); -void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2); -void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3); -void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4); -void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5); -void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6); -void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7); -void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8); -void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9); -void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString); -void SEGGER_SYSVIEW_RecordSystime (void); -void SEGGER_SYSVIEW_RecordEnterISR (void); -void SEGGER_SYSVIEW_RecordExitISR (void); -void SEGGER_SYSVIEW_RecordExitISRToScheduler (void); -void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId); -void SEGGER_SYSVIEW_RecordExitTimer (void); -void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID); -void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0); - -void SEGGER_SYSVIEW_OnIdle (void); -void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStopExec (void); -void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId); -void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause); -void SEGGER_SYSVIEW_MarkStart (unsigned int MarkerId); -void SEGGER_SYSVIEW_MarkStop (unsigned int MarkerId); -void SEGGER_SYSVIEW_Mark (unsigned int MarkerId); -void SEGGER_SYSVIEW_NameMarker (unsigned int MarkerId, const char* sName); - -void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); - -int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); - -/********************************************************************* -* -* Event parameter encoding functions -*/ -U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value); -U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len); -U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen); -U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id); -U32 SEGGER_SYSVIEW_ShrinkId (U32 Id); - - -/********************************************************************* -* -* Middleware module registration -*/ -void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule); -void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription); -void SEGGER_SYSVIEW_SendModule (U8 ModuleId); -void SEGGER_SYSVIEW_SendModuleDescription (void); -void SEGGER_SYSVIEW_SendNumModules (void); - -/********************************************************************* -* -* printf-Style functions -*/ -#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list -void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); -void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); -void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); -void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); -void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); -void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); -void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); -void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); -#endif - -void SEGGER_SYSVIEW_Print (const char* s); -void SEGGER_SYSVIEW_Warn (const char* s); -void SEGGER_SYSVIEW_Error (const char* s); - -/********************************************************************* -* -* Run-time configuration functions -*/ -void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask); -void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask); - -/********************************************************************* -* -* Application-provided functions -*/ -void SEGGER_SYSVIEW_Conf (void); -U32 SEGGER_SYSVIEW_X_GetTimestamp (void); -U32 SEGGER_SYSVIEW_X_GetInterruptId (void); - -void SEGGER_SYSVIEW_X_StartComm (void); -void SEGGER_SYSVIEW_X_OnEventRecorded (unsigned NumBytes); - -#ifdef __cplusplus -} -#endif - -/********************************************************************* -* -* Compatibility API defines -*/ -#define SEGGER_SYSVIEW_OnUserStart SEGGER_SYSVIEW_MarkStart -#define SEGGER_SYSVIEW_OnUserStop SEGGER_SYSVIEW_MarkStop - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Conf.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Conf.h deleted file mode 100644 index 1f910bfff..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Conf.h +++ /dev/null @@ -1,67 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_Conf.h -Purpose : SEGGER SystemView configuration file. - Set defines which deviate from the defaults (see SEGGER_SYSVIEW_ConfDefaults.h) here. -Revision: $Rev: 21292 $ - -Additional information: - Required defines which must be set are: - SEGGER_SYSVIEW_GET_TIMESTAMP - SEGGER_SYSVIEW_GET_INTERRUPT_ID - For known compilers and cores, these might be set to good defaults - in SEGGER_SYSVIEW_ConfDefaults.h. - - SystemView needs a (nestable) locking mechanism. - If not defined, the RTT locking mechanism is used, - which then needs to be properly configured. -*/ - -#ifndef SEGGER_SYSVIEW_CONF_H -#define SEGGER_SYSVIEW_CONF_H - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ -extern unsigned int SystemCoreClock; - -#define SEGGER_SYSVIEW_APP_NAME "embOS start project" -#define SEGGER_SYSVIEW_DEVICE_NAME "STM32H743ZI" -#define SEGGER_SYSVIEW_ID_BASE 0x20000000 -#define SEGGER_SYSVIEW_TIMESTAMP_FREQ SystemCoreClock -#define SEGGER_SYSVIEW_CPU_FREQ SystemCoreClock -#define SEGGER_SYSVIEW_SYSDESC0 "I#15=SysTick" - -#endif // SEGGER_SYSVIEW_CONF_H - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h deleted file mode 100644 index 0c650e8d9..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h +++ /dev/null @@ -1,533 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW_ConfDefaults.h -Purpose : Defines defaults for configurable defines used in - SEGGER SystemView. -Revision: $Rev: 21319 $ -*/ - -#ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H -#define SEGGER_SYSVIEW_CONFDEFAULTS_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER_SYSVIEW_Conf.h" -#include "SEGGER_RTT_Conf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -// -// Use auto-detection for SEGGER_SYSVIEW_CORE define -// based on compiler-/toolchain-specific defines -// to define SEGGER_SYSVIEW_GET_INTERRUPT_ID and SEGGER_SYSVIEW_GET_TIMESTAMP -// -#define SEGGER_SYSVIEW_CORE_OTHER 0 -#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 -#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 -#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX -#ifndef SEGGER_SYSVIEW_CORE - #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __SEGGER_CC__) || (defined __GNUC__) || (defined __clang__) - #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__ICCARM__) - #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) \ - || (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) \ - || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) \ - || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) \ - || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__CC_ARM) - #if (defined(__TARGET_ARCH_6S_M)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__TI_ARM__) - #ifdef __TI_ARM_V6M0__ - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 - #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 - #endif - #elif defined(__ICCRX__) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX - #elif defined(__RX) - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX - #endif - - #ifndef SEGGER_SYSVIEW_CORE - #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER - #endif -#endif - - -/********************************************************************* -* -* Defines, defaults -* -********************************************************************** -*/ -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_APP_NAME -* -* Description -* The application name to be displayed in SystemView. -* Default -* "SystemView-enabled Application" -* Notes -* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). -*/ -#ifndef SEGGER_SYSVIEW_APP_NAME - #define SEGGER_SYSVIEW_APP_NAME "SystemView-enabled Application" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_DEVICE_NAME -* -* Description -* The target device name to be displayed in SystemView. -* Default -* "undefined device" -* Notes -* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). -*/ -#ifndef SEGGER_SYSVIEW_DEVICE_NAME - #define SEGGER_SYSVIEW_DEVICE_NAME "undefined device" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_GET_INTERRUPT_ID() -* -* Description -* Function macro to retrieve the Id of the currently active -* interrupt. -* Default -* Call user-supplied function SEGGER_SYSVIEW_X_GetInterruptId(). -* Notes -* For some known compilers and cores, a ready-to-use, core-specific -* default is set. -* ARMv7M: Read ICSR[8:0] (active vector) -* ARMv6M: Read ICSR[5:0] (active vector) -*/ -#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID - #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) - #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 - #if defined(__ICCARM__) - #if (__VER__ > 6010000) - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. - #endif - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) - #endif - #else - #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. - #endif -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_GET_TIMESTAMP() -* -* Description -* Function macro to retrieve a system timestamp for SYSVIEW events. -* Default -* Call user-supplied function SEGGER_SYSVIEW_X_GetTimestamp(). -* Notes -* For some known compilers and cores, a ready-to-use, core-specific -* default is set. -* ARMv7M: Read Cortex-M Cycle Count register. -* -* The system timestamp clock frequency has to be passed in -* SEGGER_SYSVIEW_Init(). -*/ -#ifndef SEGGER_SYSVIEW_GET_TIMESTAMP - #if defined (SEGGER_SYSVIEW_CORE) && (SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3) - #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. - #else - #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function - #endif -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_TIMESTAMP_BITS -* -* Description -* Number of valid (low-order) bits delivered in system timestamp. -* Default -* 32 -* Notes -* Value has to match system timestamp clock source. -*/ -// Define number of valid bits low-order delivered by clock source. -#ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS - #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_RTT_CHANNEL -* -* Description -* The RTT channel that SystemView will use. -* Default -* 0: Auto selection. -* Notes -* Value has to be lower than SEGGER_RTT_MAX_NUM_UP_BUFFERS. -*/ -#ifndef SEGGER_SYSVIEW_RTT_CHANNEL - #define SEGGER_SYSVIEW_RTT_CHANNEL 0 -#endif -// Sanity check of RTT channel -#if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2) - #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!" -#elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) - #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!" -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_RTT_BUFFER_SIZE -* -* Description -* Number of bytes that SystemView uses for the RTT buffer. -* Default -* 1024 -*/ -#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE - #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_SECTION -* -* Description -* Section to place the SystemView RTT Buffer into. -* Default -* undefined: Do not place into a specific section. -* Notes -* If SEGGER_RTT_SECTION is defined, the default changes to use -* this section for the SystemView RTT Buffer, too. -*/ -#if !(defined SEGGER_SYSVIEW_SECTION) && (defined SEGGER_RTT_SECTION) - #define SEGGER_SYSVIEW_SECTION SEGGER_RTT_SECTION -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE -* -* Description -* Largest cache line size (in bytes) in the target system. -* Default -* 0 -* Notes -* Required in systems with caches to make sure that the SystemView -* RTT buffer can be aligned accordingly. -*/ -#ifndef SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE - #define SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ID_BASE -* -* Description -* Lowest Id reported by the application. -* Default -* 0 -* Notes -* Value is usually subtracted from mailboxes, semaphores, tasks, -* .... addresses, to compress event parameters. -* Should be the lowest RAM address of the system. -*/ -#ifndef SEGGER_SYSVIEW_ID_BASE - #define SEGGER_SYSVIEW_ID_BASE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ID_SHIFT -* -* Description -* Number of bits to shift Ids. -* Default -* 0 -* Notes -* Ids are shifted to compress event parameters. -* Should match the alignment of Ids (addresses), -* e.g. 2 when Ids are 4 byte aligned. -*/ -#ifndef SEGGER_SYSVIEW_ID_SHIFT - #define SEGGER_SYSVIEW_ID_SHIFT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_ARGUMENTS -* -* Description -* Maximum number of arguments which are handled with SystemView -* print routines or may be encoded in one recording function. -* routines. -* Default -* 16 -*/ -#ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS - #define SEGGER_SYSVIEW_MAX_ARGUMENTS 16 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_STRING_LEN -* -* Description -* Maximum string length which can be used in SystemView print and -* system description routines. -* Default -* 128 -*/ -#ifndef SEGGER_SYSVIEW_MAX_STRING_LEN - #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT -* -* Description -* If enabled, on SEGGER_SYSVIEW_PrintHost, check the format string -* and if it includes unsupported formatters, use formatting on the -* target instead. -* Default -* 0: Disabled. -*/ -#ifndef SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT - #define SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_USE_INTERNAL_RECORDER -* -* Description -* If set, an internal recorder, such as UART or IP is used. -* Default -* 0: Disabled. -* Notes -* Convenience define to be used by SEGGER_SYSVIEW_Conf(), -* such as in embOS configuration to enable Cortex-M cycle counter. -*/ -#ifndef SEGGER_SYSVIEW_USE_INTERNAL_RECORDER - #define SEGGER_SYSVIEW_USE_INTERNAL_RECORDER 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_CAN_RESTART -* -* Description -* If enabled, send the SystemView start sequence on every start -* command, not just on the first one. -* Enables restart when SystemView disconnected unexpectedly. -* Default -* 1: Enabled -*/ -#ifndef SEGGER_SYSVIEW_CAN_RESTART - #define SEGGER_SYSVIEW_CAN_RESTART 1 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_START_ON_INIT -* -* Description -* Enable calling SEGGER_SYSVIEW_Start() after initialization. -* Default -* 0: Disabled. -* Notes -* Convenience define to be used by SEGGER_SYSVIEW_Conf(), -* such as in embOS configuration. -*/ -#ifndef SEGGER_SYSVIEW_START_ON_INIT - #define SEGGER_SYSVIEW_START_ON_INIT 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_USE_STATIC_BUFFER -* -* Description -* If enabled, use a static buffer instead of a buffer on the stack -* for SystemView event packets. -* Default -* 1: Enabled. -* Notes -* If enabled, the static memory use by SystemView is increased by -* the maximum packet size. SystemView is locked on entry of a -* recording function. -* If disabled, the stack usage by SystemView recording functions -* might be increased by up to the maximum packet size. SystemView -* is locked when writing the packet to the RTT buffer. -*/ -#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER - #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_MAX_PACKET_SIZE -* -* Description -* Maximum packet size for a SystemView event. -* Default -* Automatically calculated. -* Notes -* The maximum packet size is mainly defined by the maximum string -* length and the maximum number of arguments. -*/ -#ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE - #define SEGGER_SYSVIEW_MAX_PACKET_SIZE (SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32) -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_POST_MORTEM_MODE -* -* Description -* If enabled, SystemView records for post-mortem analysis instead -* of real-time analysis. -* Default -* 0: Disabled. -* Notes -* For more information refer to -* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode -*/ -#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE - #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT -* -* Description -* Configure how frequently syncronization is sent in post-mortem -* mode. -* Default -* 8: (1 << 8) = Every 256 Events. -* Notes -* In post-mortem mode, at least one sync has to be in the RTT buffer. -* Recommended sync frequency: Buffer Size / 16 -* For more information refer to -* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode -*/ -#ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT - #define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8 -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_ON_EVENT_RECORDED() -* -* Description -* Function macro to notify recorder about a new event in buffer. -* Default -* undefined: Do not notify recorder. -* Notes -* Used for non-J-Link recorder, -* such as to enable transmission via UART or notify IP task. -*/ -#ifndef SEGGER_SYSVIEW_ON_EVENT_RECORDED - #define SEGGER_SYSVIEW_ON_EVENT_RECORDED(NumBytes) -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_LOCK() -* -* Description -* Function macro to (nestable) lock SystemView recording. -* Default -* Use RTT Locking mechanism (defined by SEGGER_RTT_LOCK()). -* Notes -* If SystemView recording is not locked, recording events from -* interrupts and tasks may lead to unpredictable, undefined, event -* data. -*/ -#ifndef SEGGER_SYSVIEW_LOCK - #define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK() -#endif - -/********************************************************************* -* -* Define: SEGGER_SYSVIEW_UNLOCK -* -* Description -* Function macro to unlock SystemView recording. -* Default -* Use RTT Unlocking mechanism (defined by SEGGER_RTT_UNLOCK()). -*/ -#ifndef SEGGER_SYSVIEW_UNLOCK - #define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK() -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Config_embOS.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Config_embOS.c deleted file mode 100644 index ce395be0f..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Config_embOS.c +++ /dev/null @@ -1,124 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_Config_embOS.c -Purpose : Sample setup configuration of SystemView with embOS. -Revision: $Rev: 21319 $ -*/ -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "SEGGER_SYSVIEW_embOS.h" - -/********************************************************************* -* -* Defines, fixed -* -********************************************************************** -*/ -#define DEMCR (*(volatile U32*) (0xE000EDFCuL)) // Debug Exception and Monitor Control Register -#define TRACEENA_BIT (1uL << 24) // Trace enable bit -#define DWT_CTRL (*(volatile U32*) (0xE0001000uL)) // DWT Control Register -#define NOCYCCNT_BIT (1uL << 25) // Cycle counter support bit -#define CYCCNTENA_BIT (1uL << 0) // Cycle counter enable bit -// -// If events will be recorded without a debug probe (J-Link) attached, -// enable the cycle counter -// -#define ENABLE_DWT_CYCCNT (SEGGER_SYSVIEW_POST_MORTEM_MODE || SEGGER_SYSVIEW_USE_INTERNAL_RECORDER) - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ -/********************************************************************* -* -* _cbSendSystemDesc() -* -* Function description -* Sends SystemView description strings. -*/ -static void _cbSendSystemDesc(void) { - SEGGER_SYSVIEW_SendSysDesc("N=" SEGGER_SYSVIEW_APP_NAME ",O=embOS,D=" SEGGER_SYSVIEW_DEVICE_NAME ); -#ifdef SEGGER_SYSVIEW_SYSDESC0 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC0); -#endif -#ifdef SEGGER_SYSVIEW_SYSDESC1 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC1); -#endif -#ifdef SEGGER_SYSVIEW_SYSDESC2 - SEGGER_SYSVIEW_SendSysDesc(SEGGER_SYSVIEW_SYSDESC2); -#endif -} - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ -/********************************************************************* -* -* SEGGER_SYSVIEW_Conf() -* -* Function description -* Configure and initialize SystemView and register it with embOS. -* -* Additional information -* If enabled, SEGGER_SYSVIEW_Conf() will also immediately start -* recording events with SystemView. -*/ -void SEGGER_SYSVIEW_Conf(void) { -#if ENABLE_DWT_CYCCNT - // - // If no debugger is connected, the DWT must be enabled by the application - // - if ((DEMCR & TRACEENA_BIT) == 0) { - DEMCR |= TRACEENA_BIT; - } -#endif - // - // The cycle counter must be activated in order - // to use time related functions. - // - if ((DWT_CTRL & NOCYCCNT_BIT) == 0) { // Cycle counter supported? - if ((DWT_CTRL & CYCCNTENA_BIT) == 0) { // Cycle counter not enabled? - DWT_CTRL |= CYCCNTENA_BIT; // Enable Cycle counter - } - } - SEGGER_SYSVIEW_Init(SEGGER_SYSVIEW_TIMESTAMP_FREQ, SEGGER_SYSVIEW_CPU_FREQ, - &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc); - OS_TRACE_SetAPI(&embOS_TraceAPI_SYSVIEW); // Configure embOS to use SYSVIEW. -#if SEGGER_SYSVIEW_START_ON_INIT - SEGGER_SYSVIEW_Start(); // Start recording to catch system initialization. -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Int.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Int.h deleted file mode 100644 index 5c6f14c13..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_Int.h +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_SYSVIEW_Int.h -Purpose : SEGGER SystemView internal header. -Revision: $Rev: 21281 $ -*/ - -#ifndef SEGGER_SYSVIEW_INT_H -#define SEGGER_SYSVIEW_INT_H - -/********************************************************************* -* -* #include Section -* -********************************************************************** -*/ - -#include "SEGGER_SYSVIEW.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/********************************************************************* -* -* Private data types -* -********************************************************************** -*/ -// -// Commands that Host can send to target -// -typedef enum { - SEGGER_SYSVIEW_COMMAND_ID_START = 1, - SEGGER_SYSVIEW_COMMAND_ID_STOP, - SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME, - SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST, - SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC, - SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES, - SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC, - SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT = 127, - // Extended commands: Commands >= 128 have a second parameter - SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128 -} SEGGER_SYSVIEW_COMMAND_ID; - -#ifdef __cplusplus -} -#endif - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.c deleted file mode 100644 index 393a53e29..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.c +++ /dev/null @@ -1,227 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_embOS.c -Purpose : Interface between embOS and System View. -Revision: $Rev: 22295 $ -*/ - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "SEGGER_RTT.h" -#include "SEGGER_SYSVIEW_embOS.h" - -#if (OS_VERSION < 41201) - #error "SystemView is only supported in embOS V4.12a and later." -#endif - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _cbSendTaskInfo() -* -* Function description -* Sends task information to SystemView -*/ -static void _cbSendTaskInfo(const OS_TASK* pTask) { - SEGGER_SYSVIEW_TASKINFO Info; - - OS_EnterRegion(); // No scheduling to make sure the task list does not change while we are transmitting it - memset(&Info, 0, sizeof(Info)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code - Info.TaskID = (U32)pTask; -#if OS_TRACKNAME - Info.sName = pTask->Name; -#endif - Info.Prio = pTask->Priority; -#if OS_CHECKSTACK - Info.StackBase = (U32)pTask->pStackBot; - Info.StackSize = pTask->StackSize; -#endif - SEGGER_SYSVIEW_SendTaskInfo(&Info); - OS_LeaveRegion(); // No scheduling to make sure the task list does not change while we are transmitting it -} - -/********************************************************************* -* -* _cbSendTaskList() -* -* Function description -* This function is part of the link between embOS and SYSVIEW. -* Called from SystemView when asked by the host, it uses SYSVIEW -* functions to send the entire task list to the host. -*/ -static void _cbSendTaskList(void) { - OS_TASK* pTask; - - OS_EnterRegion(); // No scheduling to make sure the task list does not change while we are transmitting it - for (pTask = OS_Global.pTask; pTask; pTask = pTask->pNext) { - _cbSendTaskInfo(pTask); - } -#if ((OS_VERSION >= 43800) && (OS_TRACKNAME != 0)) // Human readable object identifiers supported since embOS V4.38 - { - OS_OBJNAME* p; - for (p = OS_pObjNameRoot; p != NULL; p = p->pNext) { - SEGGER_SYSVIEW_NameResource((OS_U32)p->pOSObjID, p->sName); - } - } -#endif - OS_LeaveRegion(); // No scheduling to make sure the task list does not change while we are transmitting it -} - -/********************************************************************* -* -* _cbOnTaskCreate() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskCreate(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskCreate((OS_U32)TaskId); -} -#else -#define _cbOnTaskCreate SEGGER_SYSVIEW_OnTaskCreate -#endif - -/********************************************************************* -* -* _cbOnTaskStartExec() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStartExec(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskStartExec((OS_U32)TaskId); -} -#else -#define _cbOnTaskStartExec SEGGER_SYSVIEW_OnTaskStartExec -#endif - -/********************************************************************* -* -* _cbOnTaskStartReady() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStartReady(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskStartReady((OS_U32)TaskId); -} -#else -#define _cbOnTaskStartReady SEGGER_SYSVIEW_OnTaskStartReady -#endif - -/********************************************************************* -* -* _cbOnTaskStopReady() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskStopReady(unsigned int TaskId, unsigned int Reason) { - SEGGER_SYSVIEW_OnTaskStopReady((OS_U32)TaskId, Reason); -} -#else -#define _cbOnTaskStopReady SEGGER_SYSVIEW_OnTaskStopReady -#endif - -/********************************************************************* -* -* _cbOnTaskTerminate() -* -* Function description -* For embOS prior to V4.32 the cast to OS_U32 is necessary -*/ -#if (OS_VERSION < 43200) // Work around different embOS Trace API function types prior to V4.32 -static void _cbOnTaskTerminate(unsigned int TaskId) { - SEGGER_SYSVIEW_OnTaskTerminate((OS_U32)TaskId); -} -#else -#define _cbOnTaskTerminate SEGGER_SYSVIEW_OnTaskTerminate -#endif - -// -// embOS trace API that targets SYSVIEW -// -const OS_TRACE_API embOS_TraceAPI_SYSVIEW = { - // - // Specific Trace Events - // - SEGGER_SYSVIEW_RecordEnterISR, // void (*pfRecordEnterISR) (void); - SEGGER_SYSVIEW_RecordExitISR, // void (*pfRecordExitISR) (void); - SEGGER_SYSVIEW_RecordExitISRToScheduler, // void (*pfRecordExitISRToScheduler) (void); - _cbSendTaskInfo, // void (*pfRecordTaskInfo) (const OS_TASK* pTask); - _cbOnTaskCreate, // void (*pfRecordTaskCreate) (OS_U32 TaskId); - _cbOnTaskStartExec, // void (*pfRecordTaskStartExec) (OS_U32 TaskId); - SEGGER_SYSVIEW_OnTaskStopExec, // void (*pfRecordTaskStopExec) (void); - _cbOnTaskStartReady, // void (*pfRecordTaskStartReady) (OS_U32 TaskId); - _cbOnTaskStopReady, // void (*pfRecordTaskStopReady) (OS_U32 TaskId, unsigned Reason); - SEGGER_SYSVIEW_OnIdle, // void (*pfRecordIdle) (void); - // - // Generic Trace Event logging - // - SEGGER_SYSVIEW_RecordVoid, // void (*pfRecordVoid) (unsigned Id); - SEGGER_SYSVIEW_RecordU32, // void (*pfRecordU32) (unsigned Id, OS_U32 Para0); - SEGGER_SYSVIEW_RecordU32x2, // void (*pfRecordU32x2) (unsigned Id, OS_U32 Para0, OS_U32 Para1); - SEGGER_SYSVIEW_RecordU32x3, // void (*pfRecordU32x3) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2); - SEGGER_SYSVIEW_RecordU32x4, // void (*pfRecordU32x4) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2, OS_U32 Para3); - SEGGER_SYSVIEW_ShrinkId, // OS_U32 (*pfPtrToId) (OS_U32 Ptr); -#if (OS_VERSION >= 41400) // Tracing timer is supported since embOS V4.14 - SEGGER_SYSVIEW_RecordEnterTimer, // void (*pfRecordEnterTimer) (OS_U32 TimerID); - SEGGER_SYSVIEW_RecordExitTimer, // void (*pfRecordExitTimer) (void); -#endif -#if (OS_VERSION >= 42400) // Tracing end of call supported since embOS V4.24 - SEGGER_SYSVIEW_RecordEndCall, // void (*pfRecordEndCall) (unsigned int Id); - SEGGER_SYSVIEW_RecordEndCallU32, // void (*pfRecordEndCallReturnValue) (unsigned int Id, OS_U32 ReturnValue); - _cbOnTaskTerminate, // void (*pfRecordTaskTerminate) (OS_U32 TaskId); - SEGGER_SYSVIEW_RecordU32x5, // void (*pfRecordU32x5) (unsigned Id, OS_U32 Para0, OS_U32 Para1, OS_U32 Para2, OS_U32 Para3, OS_U32 Para4); -#endif -#if (OS_VERSION >= 43800) // Human readable object identifiers supported since embOS V4.38 - SEGGER_SYSVIEW_NameResource, // void (*pfRecordObjName) (OS_U32 Id, OS_CONST_PTR char* Para0); -#endif -}; - -// -// Services provided to SYSVIEW by embOS -// -const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = { - OS_GetTime_us64, - _cbSendTaskList, -}; - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.h deleted file mode 100644 index d59c303b5..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/SEGGER/SEGGER_SYSVIEW_embOS.h +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- - -File : SEGGER_SYSVIEW_embOS.h -Purpose : Interface between embOS and System View. -Revision: $Rev: 9599 $ -*/ - -#ifndef SYSVIEW_EMBOS_H -#define SYSVIEW_EMBOS_H - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" - -// embOS trace API that targets SYSVIEW -extern const OS_TRACE_API embOS_TraceAPI_SYSVIEW; - -// Services provided to SYSVIEW by embOS -extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP.c deleted file mode 100644 index b9a528de2..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP.c +++ /dev/null @@ -1,148 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - ----------------------------------------------------------------------- -File : BSP.c -Purpose : BSP for STM32H743I Nucleo board --------- END-OF-HEADER --------------------------------------------- -*/ - -#include "BSP.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -#define LD1_PIN ( 0) // LD1, Green Led -#define LD2_PIN ( 7) // LD2, Blue Led -#define LD3_PIN (14) // LD3, Red Led - -#define GPIOB_BASE_ADDR (0x58020400u) -#define GPIOB_MODER (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x00u)) -#define GPIOB_OTYPER (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x04u)) -#define GPIOB_OSPEEDR (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x08u)) -#define GPIOB_PUPDR (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x0Cu)) -#define GPIOB_ODR (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x14u)) -#define GPIOB_BSRR (*(volatile unsigned int*)(GPIOB_BASE_ADDR + 0x18u)) - -#define RCC_BASE_ADDR (0x58024400u) -#define RCC_AHB4ENR (*(volatile unsigned int*)(RCC_BASE_ADDR + 0xE0u)) - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* BSP_Init() -*/ -void BSP_Init(void) { - // - // Enable GPIO clocks - // - RCC_AHB4ENR |= (0x01u << 1); // Enable the GPIOB clock - // - // Initialize LD1 - // - GPIOB_MODER &= ~(0x3u << (LD1_PIN * 2)); // Clear mode register - GPIOB_MODER |= (0x1u << (LD1_PIN * 2)); // Set IO direction to output mode - GPIOB_OSPEEDR |= (0x3u << (LD1_PIN * 2)); // Set speed to high frequency - GPIOB_OTYPER &= ~(0x1u << (LD1_PIN * 1)); // Set output to push-pull - GPIOB_PUPDR &= ~(0x3u << (LD1_PIN * 2)); // Clear the pull-up/pull-down register - GPIOB_PUPDR |= (0x1u << (LD1_PIN * 2)); // Set push-pull to pull-up - GPIOB_BSRR = ((0x1u << 16) << LD1_PIN); // Turn LED off - // - // Initialize LD2 - // - GPIOB_MODER &= ~(0x3u << (LD2_PIN * 2)); // Clear mode register - GPIOB_MODER |= (0x1u << (LD2_PIN * 2)); // Set IO direction to output mode - GPIOB_OSPEEDR |= (0x3u << (LD2_PIN * 2)); // Set speed to high frequency - GPIOB_OTYPER &= ~(0x1u << (LD2_PIN * 1)); // Set output to push-pull - GPIOB_PUPDR &= ~(0x3u << (LD2_PIN * 2)); // Clear the pull-up/pull-down register - GPIOB_PUPDR |= (0x1u << (LD2_PIN * 2)); // Set push-pull to pull-up - GPIOB_BSRR = ((0x1u << 16) << LD2_PIN); // Turn LED off - // - // Initialize LD3 - // - GPIOB_MODER &= ~(0x3u << (LD3_PIN * 2)); // Clear mode register - GPIOB_MODER |= (0x1u << (LD3_PIN * 2)); // Set IO direction to output mode - GPIOB_OSPEEDR |= (0x3u << (LD3_PIN * 2)); // Set speed to high frequency - GPIOB_OTYPER &= ~(0x1u << (LD3_PIN * 1)); // Set output to push-pull - GPIOB_PUPDR &= ~(0x3u << (LD3_PIN * 2)); // Clear the pull-up/pull-down register - GPIOB_PUPDR |= (0x1u << (LD3_PIN * 2)); // Set push-pull to pull-up - GPIOB_BSRR = ((0x1u << 16) << LD3_PIN); // Turn LED off -} - -/********************************************************************* -* -* BSP_SetLED() -*/ -void BSP_SetLED(int Index) { - if (Index == 0) { - GPIOB_BSRR |= (0x1u << LD1_PIN); // Turn LED on - } else if (Index == 1) { - GPIOB_BSRR |= (0x1u << LD2_PIN); // Turn LED on - } else if (Index == 2) { - GPIOB_BSRR |= (0x1u << LD3_PIN); // Turn LED on - } -} - -/********************************************************************* -* -* BSP_ClrLED() -*/ -void BSP_ClrLED(int Index) { - if (Index == 0) { - GPIOB_BSRR |= ((0x1u << 16) << LD1_PIN); // Turn LED off - } else if (Index == 1) { - GPIOB_BSRR |= ((0x1u << 16) << LD2_PIN); // Turn LED off - } else if (Index == 2) { - GPIOB_BSRR |= ((0x1u << 16) << LD3_PIN); // Turn LED off - } -} - -/********************************************************************* -* -* BSP_ToggleLED() -*/ -void BSP_ToggleLED(int Index) { - if (Index == 0) { - GPIOB_ODR ^= (0x1u << LD1_PIN); // Toggle LED - } else if (Index == 1) { - GPIOB_ODR ^= (0x1u << LD2_PIN); // Toggle LED - } else if (Index == 2) { - GPIOB_ODR ^= (0x1u << LD3_PIN); // Toggle LED - } -} - -/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP_UART.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP_UART.c deleted file mode 100644 index dda6bf6f3..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/BSP_UART.c +++ /dev/null @@ -1,387 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : UART implementation for ST NUCLEO-H743ZI(2). -Additional information: - - Device : STM32H743 - Board : ST NUCLEO-H743ZI - Unit | UART | Board connector - ============================================================= - 0 | USART1 | TTL Adapter (PB6: USART1_TX, PB15: USART1_RX) -*/ - -#include "BSP_UART.h" -#include "RTOS.h" -#include "stm32h7xx.h" // Device specific header file, contains CMSIS - -/********************************************************************* -* -* Defines, configurable -* -********************************************************************** -*/ - -/********************************************************************* -* -* UART settings -*/ -#define BSP_UART_BAUDRATE (38400) -#define BSP_UART_CLOCK (SystemCoreClock / 2 / 4) // SystemCoreClock / RCC_D1CFGR_HPRE_DIV2 / RCC_D2CFGR_D2PPRE1_DIV4 -#define BSP_UART_IRQHandler (USART1_IRQHandler) - -#ifndef DEBUG - #define DEBUG (0) -#endif - - -#define ISR_ID_USART1 USART1_IRQn // USART1 ID -#define USART_BASE_ADDR (0x40011000u) // USART1 base address - -#define USART_ISR (*(volatile unsigned long*)(USART_BASE_ADDR + 0x1Cu)) -#define USART_ICR (*(volatile unsigned long*)(USART_BASE_ADDR + 0x20u)) -#define USART_RDR (*(volatile unsigned long*)(USART_BASE_ADDR + 0x24u)) -#define USART_TDR (*(volatile unsigned long*)(USART_BASE_ADDR + 0x28u)) -#define USART_BRR (*(volatile unsigned long*)(USART_BASE_ADDR + 0x0Cu)) -#define USART_CR1 (*(volatile unsigned long*)(USART_BASE_ADDR + 0x00u)) -#define USART_CR2 (*(volatile unsigned long*)(USART_BASE_ADDR + 0x04u)) - -#define RCC_BASE_ADDR (0x58024400u) -#define RCC_AHB4ENR (*(volatile unsigned long*)(RCC_BASE_ADDR + 0xE0u)) -#define RCC_APB2ENR (*(volatile unsigned long*)(RCC_BASE_ADDR + 0xF0u)) - -#define GPIOB_BASE_ADDR (0x58020400u) -#define GPIOB_MODER (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x00u)) -#define GPIOB_OTYPER (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x04u)) -#define GPIOB_OSPEEDR (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x08u)) -#define GPIOB_PUPDR (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x0Cu)) -#define GPIOB_AF_LOW (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x20u)) -#define GPIOB_AF_HIGH (*(volatile unsigned long*)(GPIOB_BASE_ADDR + 0x24u)) - -#define US_RXRDY (0x20u) // RXNE -#define USART_RX_ERROR_FLAGS (0x0Fu) // ORE/NE/FE/PE -#define US_TXEMPTY (0x80u) // TXE - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ - -static BSP_UART_RX_CB* _pfOnRx; -static BSP_UART_TX_CB* _pfOnTx; - -#if (DEBUG != 0) -// -// Variables used for debugging. -// -static volatile unsigned char _Send1Buffer; -static unsigned long _ErrCnt; -static unsigned long _RxCnt; -static unsigned char _RxData[1024]; -static unsigned long _TxCnt; -static unsigned char _TxData[1024]; -#endif - -/********************************************************************* -* -* Prototypes -* -* Declare ISR handler here to avoid "no prototype" warning. -* They are not declared in any CMSIS header. -* -********************************************************************** -*/ - -#if defined(__cplusplus) - extern "C" { // Make sure we have C-declarations in C++ programs. -#endif - -void BSP_UART_IRQHandler(void); - -#if defined(__cplusplus) -} // Make sure we have C-declarations in C++ programs. -#endif - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* _SetBaudrate() -* -* Function description -* Configures the UART baud rate. -* -* Parameters -* Unit : Unit number (typically zero-based). -* Baudrate: Baud rate to configure [Hz]. -*/ -static void _SetBaudrate(unsigned int Unit, unsigned long Baudrate) { - unsigned short Baud; - - BSP_UART_USE_PARA(Unit); - USART_CR1 &= ~((5u << 5) // RX and TX interrupt disable - | (3u << 2) // TX and RX disable - | (1u << 0)); // USART disable - Baud = BSP_UART_CLOCK / Baudrate; - USART_BRR = Baud; // Set baudrate - USART_CR1 = (3u << 2) // TX and RX enable - | (1u << 5) // RX interrupt enable - | (1u << 0); // USART enable -} - -/********************************************************************* -* -* Global functions, IRQ handler -* -********************************************************************** -*/ - -/********************************************************************* -* -* BSP_UART_IRQHandler() -* -* Function description -* UART Rx & Tx interrupt handler. -* -* Additional information -* Needs to inform the OS that we are in interrupt context. -*/ -void BSP_UART_IRQHandler(void) { - volatile unsigned int Dummy; - unsigned long UsartStatus; - - OS_EnterNestableInterrupt(); - UsartStatus = USART_ISR; // Examine status register - USART_ICR = UsartStatus; // Clear flags. - do { - if (UsartStatus & US_RXRDY) { // Data received? - if (UsartStatus & USART_RX_ERROR_FLAGS) { // Any error ? -#if (DEBUG != 0) - _ErrCnt++; -#endif - Dummy = USART_RDR; // => Discard data - BSP_UART_USE_PARA(Dummy); - } else { - if (_pfOnRx) { -#if (DEBUG != 0) - if (_RxCnt >= sizeof(_RxData)) { - _RxCnt = 0; - } - _RxData[_RxCnt] = (USART_RDR & 0xFFu); - _pfOnRx(0, (unsigned char)_RxData[_RxCnt]); - _RxCnt++; -#else - _pfOnRx(0, (unsigned char)(USART_RDR & 0xFFu)); -#endif - } else { - Dummy = USART_RDR; // => Discard data - } - } - } - UsartStatus = USART_ISR; // Examine current status - } while (UsartStatus & US_RXRDY); - if ((UsartStatus & US_TXEMPTY) && ((USART_CR1 & 0x40u) != 0)) { - if (_pfOnTx) { - if (_pfOnTx(0)) { // No more characters to send ? - USART_CR1 &= ~0x40u; // Disable further tx interrupts - } - } - } - OS_LeaveNestableInterrupt(); -} - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* BSP_UART_Init() -* -* Function description -* Initializes the UART peripheral. -* -* Parameters -* Unit : Unit number (typically zero-based). -* Baudrate : Baud rate to configure [Hz]. -* NumDataBits: Number of data bits to use. -* Parity : One of the following values: -* * BSP_UART_PARITY_NONE -* * BSP_UART_PARITY_ODD -* * BSP_UART_PARITY_EVEN -* NumStopBits: Number of stop bits to use. -*/ -void BSP_UART_Init(unsigned int Unit, unsigned long Baudrate, unsigned char NumDataBits, unsigned char Parity, unsigned char NumStopBits) { - unsigned long v; - - BSP_UART_USE_PARA(Unit); - BSP_UART_USE_PARA(NumDataBits); - BSP_UART_USE_PARA(Parity); - BSP_UART_USE_PARA(NumStopBits); - if (Baudrate == 0) { - Baudrate = BSP_UART_BAUDRATE; - } - // - // Initialize clock and port for USART, selection specific - // - OS_IncDI(); - RCC_AHB4ENR |= (1u << 1); // GPIO CLK enable - RCC_APB2ENR |= (1u << 4); // Enable USART1 clock - // GPIOB set alternate function for USART1 - GPIOB_AF_LOW = (7u << 24); // - Set PB6 to AF7 (USART1_TX) - GPIOB_AF_HIGH = (4u << 28); // - Set PB15 to AF4 (USART1_RX) - // GPIOB alternate function mode - v = GPIOB_MODER; - v &= ~((3u << 12) - | (3u << 30)); - v |= (2u << 12) // - PB6 -> AF - | (2u << 30); // - PB15 -> AF - GPIOB_MODER = v; - // GPIOC speed setting - GPIOB_OSPEEDR = (3u << 12) // - PB6 high speed - | (3u << 30); // - PB15 high speed - GPIOB_PUPDR = (1u << 12) // - PB6 pull-up - | (1u << 30); // - PB15 pull-up - // - // USART settings - // - USART_CR1 = (1u << 2) // Receiver enable - | (1u << 3) // Transmitter enable - | (1u << 5); // RX interrupt enable - _SetBaudrate(Unit, Baudrate); // Set baudrate - USART_CR1 |= (1u << 0); // Enable USART - NVIC_SetPriority(ISR_ID_USART1, (1u << __NVIC_PRIO_BITS) - 4u); - NVIC_EnableIRQ(ISR_ID_USART1); - OS_DecRI(); -} - -/********************************************************************* -* -* BSP_UART_DeInit() -* -* Function description -* De-initializes the UART peripheral. -* -* Parameters -* Unit: Unit number (typically zero-based). -*/ -void BSP_UART_DeInit(unsigned int Unit) { - BSP_UART_USE_PARA(Unit); - NVIC_DisableIRQ(ISR_ID_USART1); - USART_CR1 = 0x00000000u; - USART_BRR = 0x00000000u; -} - -/********************************************************************* -* -* BSP_UART_SetBaudrate() -* -* Function description -* Configures/changes the UART baud rate. -* -* Parameters -* Unit : Unit number (typically zero-based). -* Baudrate: Baud rate to configure [Hz]. -*/ -void BSP_UART_SetBaudrate(unsigned int Unit, unsigned long Baudrate) { - _SetBaudrate(Unit, Baudrate); -} - -/********************************************************************* -* -* BSP_UART_SetReadCallback() -* -* Function description -* Sets the callback to execute upon an Rx interrupt. -* -* Parameters -* Unit: Unit number (typically zero-based). -* pf : Callback to execute. -*/ -void BSP_UART_SetReadCallback(unsigned Unit, BSP_UART_RX_CB* pf) { - BSP_UART_USE_PARA(Unit); - _pfOnRx = pf; -} - -/********************************************************************* -* -* BSP_UART_SetWriteCallback() -* -* Function description -* Sets the callback to execute upon a Tx interrupt. -* -* Parameters -* Unit: Unit number (typically zero-based). -* pf : Callback to execute. -*/ -void BSP_UART_SetWriteCallback(unsigned int Unit, BSP_UART_TX_CB* pf) { - BSP_UART_USE_PARA(Unit); - _pfOnTx = pf; -} - -/********************************************************************* -* -* BSP_UART_Write1() -* -* Function description -* Sends one byte via UART. -* -* Parameters -* Unit: Unit number (typically zero-based). -* Data: (First) data byte to send. -* -* Additional information -* The first byte of a transfer is typically sent from application -* context. Further bytes of the transfer are then sent from the -* Tx interrupt handler by also calling this function from interrupt -* context. -*/ -void BSP_UART_Write1(unsigned int Unit, unsigned char Data) { - BSP_UART_USE_PARA(Unit); -#if (DEBUG != 0) - if (_TxCnt >= sizeof(_TxData)) { - _TxCnt = 0; - } - _TxData[_TxCnt] = Data; - _Send1Buffer = _TxData[_TxCnt++]; -#endif - USART_TDR = Data; - USART_CR1 |= 0x40; // Enable TX interrupt -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/HardFaultHandler.S b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/HardFaultHandler.S deleted file mode 100644 index 51c06e589..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/HardFaultHandler.S +++ /dev/null @@ -1,172 +0,0 @@ -;/********************************************************************* -;* (c) SEGGER Microcontroller GmbH * -;* The Embedded Experts * -;* www.segger.com * -;********************************************************************** -; -;-------------------------- END-OF-HEADER ----------------------------- -; -;File : HardFaultHandler.S -;Purpose : HardFault exception handler for IAR, Keil and GNU assembler. -; Evaluates used stack (MSP, PSP) and passes appropriate stack -; pointer to the HardFaultHandler "C"-routine. -;*/ - -#ifndef __IAR_SYSTEMS_ASM__ - #ifndef __CC_ARM - #ifndef __clang__ - #ifndef __GNUC__ - #error "Unsupported assembler!" - #endif - #endif - #endif -#endif - -;/********************************************************************* -;* -;* Forward declarations of segments used -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - SECTION CODE:CODE:NOROOT(2) - SECTION CSTACK:DATA:NOROOT(3) - -#elif (defined(__CC_ARM)) - - AREA OSKERNEL, CODE, READONLY, ALIGN=2 - PRESERVE8 - -#endif - -;/********************************************************************* -;* -;* Publics -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - SECTION .text:CODE:NOROOT(2) - PUBLIC HardFault_Handler - -#elif (defined(__CC_ARM)) - - EXPORT HardFault_Handler - -#elif (defined(__clang__) || defined(__GNUC__)) - - .global HardFault_Handler - .type HardFault_Handler, function - -#endif - -;/********************************************************************* -;* -;* Externals, code -;* -;********************************************************************** -;*/ - -#if (defined(__IAR_SYSTEMS_ASM__)) - - EXTERN HardFaultHandler - -#elif (defined(__CC_ARM)) - - IMPORT HardFaultHandler - -#elif (defined(__clang__) || defined(__GNUC__)) - - .extern HardFaultHandler - -#endif - -;/********************************************************************* -;* -;* CODE segment -;* -;********************************************************************** -;*/ - -#if (defined(__clang__) || defined(__GNUC__)) - - .syntax unified - .thumb - .balign 4 - .text - -#else - - THUMB - -#endif - -;/********************************************************************* -;* -;* Global functions -;* -;********************************************************************** -;*/ - -;/********************************************************************* -;* -;* HardFault_Handler() -;* -;* Function description -;* Evaluates the used stack (MSP, PSP) and passes the appropiate -;* stack pointer to the HardFaultHandler "C"-routine. -;* -;* Notes -;* (1) Ensure that HardFault_Handler is part of the exception table -;*/ -#if (defined(__clang__) || defined(__GNUC__)) -HardFault_Handler: -#else -HardFault_Handler -#endif -#if ((defined(__IAR_SYSTEMS_ASM__) && ((defined(__ARM6M__) && (__CORE__ == __ARM6M__)) || (defined(__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)))) \ - || (defined(__CC_ARM) && ( defined(__TARGET_ARCH_6S_M) || defined(__ARM_ARCH_8M_BASE__))) \ - || (defined(__clang__) && ( defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__))) \ - || (defined(__GNUC__) && ( defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)))) - ;// This version is for Cortex-M0/M0+/M1/M23 - movs R0, #4 - mov R1, LR - tst R0, R1 ;// Check EXC_RETURN in Link register bit 2. - bne Uses_PSP - mrs R0, MSP ;// Stacking was using MSP. - b Pass_StackPtr -#if (defined(__clang__) || defined(__GNUC__)) -Uses_PSP: -#else -Uses_PSP -#endif - mrs R0, PSP ;// Stacking was using PSP. -#if (defined(__GNUC__) || defined(__clang__)) -Pass_StackPtr: -#else -Pass_StackPtr -#endif -#else - ;// This version is for Cortex-M3/M4/M4F/M7/M7F/M33 - tst LR, #4 ;// Check EXC_RETURN in Link register bit 2. - ite EQ - mrseq R0, MSP ;// Stacking was using MSP. - mrsne R0, PSP ;// Stacking was using PSP. -#endif -#if (defined(__CC_ARM)) - ALIGN -#endif - ldr R1,=HardFaultHandler - bx R1 ;// Stack pointer passed through R0. - -#if (defined(__clang__) || defined(__GNUC__)) - .end -#else - END -#endif - -;/****** End Of File *************************************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/OS_Error.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/OS_Error.c deleted file mode 100644 index 40c6b7385..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/OS_Error.c +++ /dev/null @@ -1,274 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : OS_Error.c -Purpose : embOS error handler. - Feel free to modify this file according to your needs. -*/ - -#include "RTOS.h" - -/********************************************************************* -* -* Error Codes -* -********************************************************************** - - OS_OK = (0u), // No error, everything ok. -// User 1..99 *********************************** - -// Port 100..109 ********************************* - OS_ERR_ISR_INDEX = (100u), // Index value out of bounds during interrupt controller initialization or interrupt installation. - OS_ERR_ISR_VECTOR = (101u), // Default interrupt handler called, but interrupt vector not initialized. - OS_ERR_ISR_PRIO = (102u), // Wrong interrupt priority. - OS_ERR_WRONG_STACK = (103u), // Wrong stack used before main(). - OS_ERR_ISR_NO_HANDLER = (104u), // No interrupt handler was defined for this interrupt. - OS_ERR_TLS_INIT = (105u), // OS_TLS_Init() called multiple times from one task. - OS_ERR_MB_BUFFER_SIZE = (106u), // For 16-bit CPUs, the maximum buffer size for a mailbox (64KB) exceeded. - -// OS generic ************************************ - OS_ERR_EXTEND_CONTEXT = (116u), // OS_TASK_SetContextExtension() called multiple times from one task. - OS_ERR_INTERNAL = (118u), // OS_ChangeTask() called without Region Counter set (or other internal error). - OS_ERR_IDLE_RETURNS = (119u), // OS_Idle() must not return. - OS_ERR_TASK_STACK = (120u), // Task stack overflow or invalid task stack. - -// Semaphore value overflow - OS_ERR_SEMAPHORE_OVERFLOW = (121u), // Semaphore value overflow. - -// Peripheral Power management module - OS_ERR_POWER_OVER = (122u), // Counter overflows when calling OS_POWER_UsageInc(). - OS_ERR_POWER_UNDER = (123u), // Counter underflows when calling OS_POWER_UsageDec(). - OS_ERR_POWER_INDEX = (124u), // Index to high, exceeds (OS_POWER_NUM_COUNTERS - 1). - -// System/interrupt stack - OS_ERR_SYS_STACK = (125u), // System stack overflow. - OS_ERR_INT_STACK = (126u), // Interrupt stack overflow. - -// invalid or non-initialized data structures - OS_ERR_INV_TASK = (128u), // Task control block invalid, not initialized or overwritten. - OS_ERR_INV_TIMER = (129u), // Timer control block invalid, not initialized or overwritten. - OS_ERR_INV_MAILBOX = (130u), // Mailbox control block invalid, not initialized or overwritten. - OS_ERR_INV_SEMAPHORE = (132u), // Control block for semaphore invalid, not initialized or overwritten. - OS_ERR_INV_MUTEX = (133u), // Control block for mutex invalid, not initialized or overwritten. - -// Using GetMail1 or PutMail1 or GetMailCond1 or PutMailCond1 on -// a non-1 byte mailbox - OS_ERR_MAILBOX_NOT1 = (135u), // One of the following 1-byte mailbox functions has been used on a multibyte mailbox: OS_MAILBOX_Get1(), OS_MAILBOX_GetBlocked1(), OS_MAILBOX_GetTimed1(), OS_MAILBOX_Put1(), OS_MAILBOX_PutBlocked1(), OS_MAILBOX_PutFront1(), OS_MAILBOX_PutFrontBlocked1() or OS_MAILBOX_PutTimed1(). - -// Waitable objects deleted with waiting tasks or occupied by task - OS_ERR_MAILBOX_DELETE = (136u), // OS_MAILBOX_Delete() was called on a mailbox with waiting tasks. - OS_ERR_SEMAPHORE_DELETE = (137u), // OS_SEMAPHORE_Delete() was called on a semaphore with waiting tasks. - OS_ERR_MUTEX_DELETE = (138u), // OS_MUTEX_Delete() was called on a mutex which is claimed by a task. - -// internal errors, please contact SEGGER Microcontroller - OS_ERR_MAILBOX_NOT_IN_LIST = (140u), // The mailbox is not in the list of mailboxes as expected. Possible reasons may be that one mailbox data structure was overwritten. - OS_ERR_TASKLIST_CORRUPT = (142u), // The OS internal task list is destroyed. - -// Queue errors - OS_ERR_QUEUE_INUSE = (143u), // Queue in use. - OS_ERR_QUEUE_NOT_INUSE = (144u), // Queue not in use. - OS_ERR_QUEUE_INVALID = (145u), // Queue invalid. - OS_ERR_QUEUE_DELETE = (146u), // A queue was deleted by a call of OS_QUEUE_Delete() while tasks are waiting at the queue. - -// Mailbox errors - OS_ERR_MB_INUSE = (147u), // Mailbox in use. - OS_ERR_MB_NOT_INUSE = (148u), // Mailbox not in use. - -// Message size - OS_ERR_MESSAGE_SIZE_ZERO = (149u), // Attempt to store a message with size of zero. - -// Not matching routine calls or macro usage - OS_ERR_UNUSE_BEFORE_USE = (150u), // OS_MUTEX_Unlock() has been called on a mutex that hasn't been locked before. - OS_ERR_LEAVEREGION_BEFORE_ENTERREGION = (151u), // OS_TASK_LeaveRegion() has been called before OS_TASK_EnterRegion(). - OS_ERR_LEAVEINT = (152u), // Error in OS_INT_Leave(). - OS_ERR_DICNT_OVERFLOW = (153u), // The interrupt disable counter ( OS_Global.Counters.Cnt.DI ) is out of range (0-15). The counter is affected by the API calls OS_INT_IncDI(), OS_INT_DecRI(), OS_INT_Enter() and OS_INT_Leave(). - OS_ERR_INTERRUPT_DISABLED = (154u), // OS_TASK_Delay() or OS_TASK_DelayUntil() called from inside a critical region with interrupts disabled. - OS_ERR_TASK_ENDS_WITHOUT_TERMINATE = (155u), // Task routine returns without 0S_TASK_Terminate(). - OS_ERR_MUTEX_OWNER = (156u), // OS_MUTEX_Unlock() has been called from a task which does not own the mutex. - OS_ERR_REGIONCNT = (157u), // The Region counter overflows (>255). - OS_ERR_DELAYUS_INTERRUPT_DISABLED = (158u), // OS_TASK_Delayus() called with interrupts disabled. - OS_ERR_MUTEX_OVERFLOW = (159u), // OS_MUTEX_Lock(), OS_MUTEX_LockBlocked() or OS_MUTEX_LockTimed() has been called too often from the same task. - - OS_ERR_ILLEGAL_IN_ISR = (160u), // Illegal function call in an interrupt service routine: A routine that must not be called from within an ISR has been called from within an ISR. - OS_ERR_ILLEGAL_IN_TIMER = (161u), // Illegal function call in a software timer: A routine that must not be called from within a software timer has been called from within a timer. - OS_ERR_ILLEGAL_OUT_ISR = (162u), // Not a legal API outside interrupt. - OS_ERR_NOT_IN_ISR = (163u), // OS_INT_Enter() has been called, but CPU is not in ISR state. - OS_ERR_IN_ISR = (164u), // OS_INT_Enter() has not been called, but CPU is in ISR state. - - OS_ERR_INIT_NOT_CALLED = (165u), // OS_Init() was not called. - - OS_ERR_ISR_PRIORITY_INVALID = (166u), // embOS API called from ISR with an invalid priority. - OS_ERR_CPU_STATE_ILLEGAL = (167u), // CPU runs in illegal mode. - OS_ERR_CPU_STATE_UNKNOWN = (168u), // CPU runs in unknown mode or mode could not be read. - - OS_ERR_TICKLESS_WITH_FRACTIONAL_TICK = (169u), // OS_TICKLESS_AdjustTime() was called despite OS_TICK_Config() has been called before. - -// Double used data structures - OS_ERR_2USE_TASK = (170u), // Task control block has been initialized by calling a create function twice. - OS_ERR_2USE_TIMER = (171u), // Timer control block has been initialized by calling a create function twice. - OS_ERR_2USE_MAILBOX = (172u), // Mailbox control block has been initialized by calling a create function twice. - OS_ERR_2USE_SEMAPHORE = (174u), // Semaphore has been initialized by calling a create function twice. - OS_ERR_2USE_MUTEX = (175u), // Mutex has been initialized by calling a create function twice. - OS_ERR_2USE_MEMF = (176u), // Fixed size memory pool has been initialized by calling a create function twice. - OS_ERR_2USE_QUEUE = (177u), // Queue has been initialized by calling a create function twice. - OS_ERR_2USE_EVENT = (178u), // Event object has been initialized by calling a create function twice. - OS_ERR_2USE_WATCHDOG = (179u), // Watchdog has been initialized by calling a create function twice. - -// Communication errors - OS_ERR_NESTED_RX_INT = (180u), // OS_Rx interrupt handler for embOSView is nested. Disable nestable interrupts. - -// Spinlock - OS_ERR_SPINLOCK_INV_CORE = (185u), // Invalid core ID specified for accessing a OS_SPINLOCK_SW struct. - -// Fixed block memory pool - OS_ERR_MEMF_INV = (190u), // Fixed size memory block control structure not created before use. - OS_ERR_MEMF_INV_PTR = (191u), // Pointer to memory block does not belong to memory pool on Release. - OS_ERR_MEMF_PTR_FREE = (192u), // Pointer to memory block is already free when calling OS_MEMPOOL_Release(). Possibly, same pointer was released twice. - OS_ERR_MEMF_RELEASE = (193u), // OS_MEMPOOL_Release() was called for a memory pool, that had no memory block allocated (all available blocks were already free before). - OS_ERR_MEMF_POOLADDR = (194u), // OS_MEMPOOL_Create() was called with a memory pool base address which is not located at a word aligned base address. - OS_ERR_MEMF_BLOCKSIZE = (195u), // OS_MEMPOOL_Create() was called with a data block size which is not a multiple of processors word size. - -// Task suspend / resume errors - OS_ERR_SUSPEND_TOO_OFTEN = (200u), // Number of nested calls to OS_TASK_Suspend() exceeded 3. - OS_ERR_RESUME_BEFORE_SUSPEND = (201u), // OS_TASK_Resume() called on a task that was not suspended. - -// Other task related errors - OS_ERR_TASK_PRIORITY = (202u), // OS_TASK_Create() was called with a task priority which is already assigned to another task. This error can only occur when embOS was compiled without round-robin support. - OS_ERR_TASK_PRIORITY_INVALID = (203u), // The value 0 was used as task priority. - -// Timer related errors - OS_ERR_TIMER_PERIOD_INVALID = (205u), // The value 0 was used as timer period. - -// Event object - OS_ERR_EVENT_INVALID = (210u), // An OS_EVENT object was used before it was created. - OS_ERR_EVENT_DELETE = (212u), // An OS_EVENT object was deleted with waiting tasks. - -// Waitlist (checked build) - OS_ERR_WAITLIST_RING = (220u), // This error should not occur. Please contact the support. - OS_ERR_WAITLIST_PREV = (221u), // This error should not occur. Please contact the support. - OS_ERR_WAITLIST_NEXT = (222u), // This error should not occur. Please contact the support. - -// Tick Hook - OS_ERR_TICKHOOK_INVALID = (223u), // Invalid tick hook. - OS_ERR_TICKHOOK_FUNC_INVALID = (224u), // Invalid tick hook function. - -// Other potential problems discovered in checked build - OS_ERR_NOT_IN_REGION = (225u), // A function was called without declaring the necessary critical region. - -// API context check - OS_ERR_ILLEGAL_IN_MAIN = (226u), // Not a legal API call from main(). - OS_ERR_ILLEGAL_IN_TASK = (227u), // Not a legal API after OS_Start(). - OS_ERR_ILLEGAL_AFTER_OSSTART = (228u), // Not a legal API after OS_Start(). - -// Cache related - OS_ERR_NON_ALIGNED_INVALIDATE = (230u), // Cache invalidation needs to be cache line aligned. - -// Available hardware - OS_ERR_HW_NOT_AVAILABLE = (234u), // Hardware unit is not implemented or enabled. - -// System timer config related - OS_ERR_NON_TIMERCYCLES_FUNC = (235u), // OS_TIME_ConfigSysTimer() has not been called. Callback function for timer counter value has not been set. - OS_ERR_NON_TIMERINTPENDING_FUNC = (236u), // OS_TIME_ConfigSysTimer() has not been called. Callback function for timer interrupt pending flag has not been set. - OS_ERR_FRACTIONAL_TICK = (237u), // embOS API function called with fractional tick to interrupt ratio. - OS_ERR_ZERO_TIMER_INT_FREQ = (238u), // OS_TIME_ConfigSysTimer() not called or called with zero interrupt frequency. - -// embOS MPU related - OS_ERR_MPU_NOT_PRESENT = (240u), // MPU unit not present in the device. - OS_ERR_MPU_INVALID_REGION = (241u), // Invalid MPU region index number. - OS_ERR_MPU_INVALID_SIZE = (242u), // Invalid MPU region size. - OS_ERR_MPU_INVALID_PERMISSION = (243u), // Invalid MPU region permission. - OS_ERR_MPU_INVALID_ALIGNMENT = (244u), // Invalid MPU region alignment. - OS_ERR_MPU_INVALID_OBJECT = (245u), // OS object is directly accessible from the task which is not allowed. - OS_ERR_MPU_PRIVSTATE_INVALID = (246u), // Invalid call from a privileged task. - -// Buffer to small to keep a backup copy of the CSTACK - OS_ERR_CONFIG_OSSTOP = (250u), // OS_Stop() is called without using OS_ConfigStop() before. - OS_ERR_OSSTOP_BUFFER = (251u), // Buffer is too small to hold a copy of the main() stack. - -// 252 is used as special value to send the status to embOSView as a 16-Bit value. - OS_EMBOSVIEW_SEND_STATUS_16BIT = (252u), - -// OS version mismatch between library and RTOS.h - OS_ERR_VERSION_MISMATCH = (253u), // OS library and RTOS.h have different version numbers. Please ensure both are from the same embOS shipment. - -// Incompatible embOS library - OS_ERR_LIB_INCOMPATIBLE = (254u), // Incompatible OS library is used. -// Invalid parameter value - OS_ERR_INV_PARAMETER_VALUE = (255u), // An invalid value was passed to the called function (see callstack). Check the API description for valid values. - -// Wrong Tick handler function - OS_ERR_TICKHANDLE_WITH_FRACTIONAL_TICK = (256u), // OS_TICK_Handle() or OS_TICK_HandleNoHook() was called after OS_TICK_Config() was used for an interrupt to tick ratio other than 1:1. - -// RW Lock error - OS_ERR_RWLOCK_INVALID = (257u), // RWLock control block invalid, not initialized or overwritten. - OS_ERR_2USE_RWLOCK = (258u), // RWLock has been initialized by calling a create function twice. - -// Unaligned stacks - OS_ERR_UNALIGNED_IRQ_STACK = (260u), // Unaligned IRQ stack. - OS_ERR_UNALIGNED_MAIN_STACK = (261u) // Unaligned main stack. - -*/ - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* OS_Error() -* -* Function description -* Run-time error reaction -* -* When this happens, an application error occurred and was detected by -* embOS. -* -* This routine can be modified to suit your needs, e.g. a red LED could -* light up. When using an emulator, you may set a breakpoint here. -* In the release builds of the library (R, XR), this routine is not -* required (as no checks are performed). -* In the stack check builds (S/SP), only error 120 may occur. -* In the debug builds(D/DP,DT), all of the listed errors may occur. -* -* Parameters -* ErrCode: embOS error code -*/ -void OS_Error(OS_STATUS ErrCode) { - OS_TASK_EnterRegion(); // Avoid further task switches - OS_Global.Counters.Cnt.DI = 0u; // Allow interrupts so we can communicate with embOSView - OS_INT_Enable(); - OS_Status = ErrCode; - while (OS_Status) { - // Endless loop may be left by setting OS_Status to 0 - } -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/RTOSInit_STM32H7xx.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/RTOSInit_STM32H7xx.c deleted file mode 100644 index 961451f54..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/RTOSInit_STM32H7xx.c +++ /dev/null @@ -1,292 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : Initializes and handles the hardware for embOS -*/ -/* modified by Quantum Leaps: -* commented out OS_Idle() to allow for costomization in the BSP -*/ - -#include "RTOS.h" -#include "SEGGER_SYSVIEW.h" -#include "stm32h7xx.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ - -/********************************************************************* -* -* System tick settings -*/ -#ifdef CORE_CM4 - #define OS_TIMER_FREQ (SystemD2Clock) -#else - #define OS_TIMER_FREQ (SystemCoreClock) -#endif -#define OS_TICK_FREQ (1000u) -#define OS_INT_FREQ (OS_TICK_FREQ) - -/********************************************************************* -* -* embOSView settings -*/ -#ifndef OS_VIEW_IFSELECT - #define OS_VIEW_IFSELECT OS_VIEW_IF_JLINK -#endif - -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - #include "JLINKMEM.h" -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - #include "BSP_UART.h" - #define OS_UART (0u) - #define OS_BAUDRATE (38400u) -#endif - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - const OS_U32 OS_JLINKMEM_BufferSize = 32u; // Size of the communication buffer for JLINKMEM -#else - const OS_U32 OS_JLINKMEM_BufferSize = 0u; // Buffer not used -#endif - -/********************************************************************* -* -* Local functions -* -********************************************************************** -*/ - -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) -/********************************************************************* -* -* _OS_OnRX() -* -* Function description -* Callback wrapper function for BSP UART module. -*/ -static void _OS_OnRX(unsigned int Unit, unsigned char c) { - OS_USE_PARA(Unit); - OS_COM_OnRx(c); -} - -/********************************************************************* -* -* _OS_OnTX() -* -* Function description -* Callback wrapper function for BSP UART module. -*/ -static int _OS_OnTX(unsigned int Unit) { - OS_USE_PARA(Unit); - return (int)OS_COM_OnTx(); -} -#endif - -/********************************************************************* -* -* _OS_GetHWTimerCycles() -* -* Function description -* Returns the current hardware timer count value. -* -* Return value -* Current timer count value. -*/ -static unsigned int _OS_GetHWTimerCycles(void) { - return SysTick->VAL; -} - -/********************************************************************* -* -* _OS_GetHWTimer_IntPending() -* -* Function description -* Returns if the hardware timer interrupt pending flag is set. -* -* Return value -* == 0: Interrupt pending flag not set. -* != 0: Interrupt pending flag set. -*/ -static unsigned int _OS_GetHWTimer_IntPending(void) { - return SCB->ICSR & SCB_ICSR_PENDSTSET_Msk; -} - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* SysTick_Handler() -* -* Function description -* This is the hardware timer exception handler. -*/ -void SysTick_Handler(void) { -#if (OS_SUPPORT_PROFILE != 0) - if (SEGGER_SYSVIEW_DWT_IS_ENABLED() == 0u) { - SEGGER_SYSVIEW_TickCnt++; - } -#endif - OS_INT_EnterNestable(); - OS_TICK_Handle(); -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_Process(); -#endif - OS_INT_LeaveNestable(); -} - -/********************************************************************* -* -* OS_InitHW() -* -* Function description -* Initialize the hardware required for embOS to run. -*/ -void OS_InitHW(void) { - OS_INT_IncDI(); - // - // Initialize NVIC vector table offset register if applicable for this device. - // Might be necessary for RAM targets or application not running from 0x00. - // -#if (defined(__VTOR_PRESENT) && __VTOR_PRESENT == 1) - SCB->VTOR = (OS_U32)&__Vectors; -#endif - // - // Enable instruction and data cache if applicable for this device - // -#if (defined(__ICACHE_PRESENT) && __ICACHE_PRESENT == 1) - SCB_EnableICache(); -#endif -#if (defined(__DCACHE_PRESENT) && __DCACHE_PRESENT == 1) - SCB_EnableDCache(); -#endif - // - // We assume PLL and core clock were already set by the SystemInit() function, - // which was called from the startup code. Therefore, we just ensure the system - // clock variable is updated and then set the periodic system timer tick for embOS. - // - SystemCoreClockUpdate(); // Update the system clock variable (might not have been set before) - SysTick_Config(OS_TIMER_FREQ / OS_INT_FREQ); // Setup SysTick Timer - NVIC_SetPriority(SysTick_IRQn, (1u << __NVIC_PRIO_BITS) - 2u); // Set the priority higher than the PendSV priority - // - // Inform embOS about the timer settings - // - { - OS_SYSTIMER_CONFIG SysTimerConfig = {OS_TIMER_FREQ, OS_INT_FREQ, OS_TIMER_DOWNCOUNTING, _OS_GetHWTimerCycles, _OS_GetHWTimer_IntPending}; - OS_TIME_ConfigSysTimer(&SysTimerConfig); - } - // - // Configure and initialize SEGGER SystemView - // -#if (OS_SUPPORT_PROFILE != 0) - SEGGER_SYSVIEW_Conf(); -#endif - // - // Initialize communication for embOSView - // -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_SetpfOnRx(OS_COM_OnRx); - JLINKMEM_SetpfOnTx(OS_COM_OnTx); - JLINKMEM_SetpfGetNextChar(OS_COM_GetNextChar); -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - BSP_UART_Init(OS_UART, OS_BAUDRATE, BSP_UART_DATA_BITS_8, BSP_UART_PARITY_NONE, BSP_UART_STOP_BITS_1); - BSP_UART_SetReadCallback(OS_UART, _OS_OnRX); - BSP_UART_SetWriteCallback(OS_UART, _OS_OnTX); -#endif - OS_INT_DecRI(); -} - -/********************************************************************* -* -* OS_Idle() -* -* Function description -* This code is executed whenever no task, software timer, or -* interrupt is ready for execution. -* -* Additional information -* The idle loop does not have a stack of its own, therefore no -* functionality should be implemented that relies on the stack -* to be preserved. -*/ -/* Quantum Leaps: - commented out OS_Idle() to allow for costomization in the BSP - -void OS_Idle(void) { // Idle loop: No task is ready to execute - while (1) { // Nothing to do ... wait for interrupt - #if ((OS_VIEW_IFSELECT != OS_VIEW_IF_JLINK) && (OS_DEBUG == 0)) - // - // When uncommenting this line, please be aware device - // specific issues could occur. - // Therefore, we do not call __WFI() by default. - // - //__WFI(); // Switch CPU into sleep mode - #endif - } -} -*/ - -/********************************************************************* -* -* Optional communication with embOSView -* -********************************************************************** -*/ - -/********************************************************************* -* -* OS_COM_Send1() -* -* Function description -* Sends one character. -*/ -void OS_COM_Send1(OS_U8 c) { -#if (OS_VIEW_IFSELECT == OS_VIEW_IF_JLINK) - JLINKMEM_SendChar(c); -#elif (OS_VIEW_IFSELECT == OS_VIEW_IF_UART) - BSP_UART_Write1(OS_UART, c); -#elif (OS_VIEW_IFSELECT == OS_VIEW_DISABLED) - OS_USE_PARA(c); // Avoid compiler warning - OS_COM_ClearTxActive(); // Let embOS know that Tx is not busy -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/SEGGER_HardFaultHandler.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/SEGGER_HardFaultHandler.c deleted file mode 100644 index b8e4a6ea7..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/SEGGER_HardFaultHandler.c +++ /dev/null @@ -1,267 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -File : SEGGER_HardFaultHandler.c -Purpose : Generic SEGGER HardFault handler for Cortex-M -Literature: - [1] Analyzing HardFaults on Cortex-M CPUs (https://www.segger.com/downloads/appnotes/AN00016_AnalyzingHardFaultsOnCortexM.pdf) - -Additional information: - This HardFault handler enables user-friendly analysis of hard faults - in debug configurations. - If a release configuration requires a HardFault handler, - a specific HardFault handler should be included instead, - which for example issues a reset or turns on an error LED. -*/ - -#include "RTOS.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ -#define SYSHND_CTRL (*(volatile unsigned int*) (0xE000ED24u)) // System Handler Control and State Register -#define NVIC_MFSR (*(volatile unsigned char*) (0xE000ED28u)) // Memory Management Fault Status Register -#define NVIC_BFSR (*(volatile unsigned char*) (0xE000ED29u)) // Bus Fault Status Register -#define NVIC_UFSR (*(volatile unsigned short*)(0xE000ED2Au)) // Usage Fault Status Register -#define NVIC_HFSR (*(volatile unsigned int*) (0xE000ED2Cu)) // Hard Fault Status Register -#define NVIC_DFSR (*(volatile unsigned int*) (0xE000ED30u)) // Debug Fault Status Register -#define NVIC_BFAR (*(volatile unsigned int*) (0xE000ED38u)) // Bus Fault Manage Address Register -#define NVIC_AFSR (*(volatile unsigned int*) (0xE000ED3Cu)) // Auxiliary Fault Status Register - -#ifndef OS_DEBUG // Should be overwritten by project settings - #define OS_DEBUG (0) // in debug builds -#endif - -/********************************************************************* -* -* Prototypes -* -********************************************************************** -*/ -#ifdef __cplusplus - extern "C" { -#endif -void HardFaultHandler(unsigned int* pStack); -#ifdef __cplusplus - } -#endif - -/********************************************************************* -* -* Static data -* -********************************************************************** -*/ -#if OS_DEBUG -static volatile unsigned int _Continue; // Set this variable to 1 to run further - -static struct { - struct { - volatile unsigned int r0; // Register R0 - volatile unsigned int r1; // Register R1 - volatile unsigned int r2; // Register R2 - volatile unsigned int r3; // Register R3 - volatile unsigned int r12; // Register R12 - volatile unsigned int lr; // Link register - volatile unsigned int pc; // Program counter - union { - volatile unsigned int byte; - struct { - unsigned int IPSR : 8; // Interrupt Program Status register (IPSR) - unsigned int EPSR : 19; // Execution Program Status register (EPSR) - unsigned int APSR : 5; // Application Program Status register (APSR) - } bits; - } psr; // Program status register. - } SavedRegs; - - union { - volatile unsigned int byte; - struct { - unsigned int MEMFAULTACT : 1; // Read as 1 if memory management fault is active - unsigned int BUSFAULTACT : 1; // Read as 1 if bus fault exception is active - unsigned int UnusedBits1 : 1; - unsigned int USGFAULTACT : 1; // Read as 1 if usage fault exception is active - unsigned int UnusedBits2 : 3; - unsigned int SVCALLACT : 1; // Read as 1 if SVC exception is active - unsigned int MONITORACT : 1; // Read as 1 if debug monitor exception is active - unsigned int UnusedBits3 : 1; - unsigned int PENDSVACT : 1; // Read as 1 if PendSV exception is active - unsigned int SYSTICKACT : 1; // Read as 1 if SYSTICK exception is active - unsigned int USGFAULTPENDED : 1; // Usage fault pended; usage fault started but was replaced by a higher-priority exception - unsigned int MEMFAULTPENDED : 1; // Memory management fault pended; memory management fault started but was replaced by a higher-priority exception - unsigned int BUSFAULTPENDED : 1; // Bus fault pended; bus fault handler was started but was replaced by a higher-priority exception - unsigned int SVCALLPENDED : 1; // SVC pended; SVC was started but was replaced by a higher-priority exception - unsigned int MEMFAULTENA : 1; // Memory management fault handler enable - unsigned int BUSFAULTENA : 1; // Bus fault handler enable - unsigned int USGFAULTENA : 1; // Usage fault handler enable - } bits; - } syshndctrl; // System Handler Control and State Register (0xE000ED24) - - union { - volatile unsigned char byte; - struct { - unsigned char IACCVIOL : 1; // Instruction access violation - unsigned char DACCVIOL : 1; // Data access violation - unsigned char UnusedBits : 1; - unsigned char MUNSTKERR : 1; // Unstacking error - unsigned char MSTKERR : 1; // Stacking error - unsigned char UnusedBits2 : 2; - unsigned char MMARVALID : 1; // Indicates the MMAR is valid - } bits; - } mfsr; // Memory Management Fault Status Register (0xE000ED28) - - union { - volatile unsigned int byte; - struct { - unsigned int IBUSERR : 1; // Instruction access violation - unsigned int PRECISERR : 1; // Precise data access violation - unsigned int IMPREISERR : 1; // Imprecise data access violation - unsigned int UNSTKERR : 1; // Unstacking error - unsigned int STKERR : 1; // Stacking error - unsigned int UnusedBits : 2; - unsigned int BFARVALID : 1; // Indicates BFAR is valid - } bits; - } bfsr; // Bus Fault Status Register (0xE000ED29) - volatile unsigned int bfar; // Bus Fault Manage Address Register (0xE000ED38) - - union { - volatile unsigned short byte; - struct { - unsigned short UNDEFINSTR : 1; // Attempts to execute an undefined instruction - unsigned short INVSTATE : 1; // Attempts to switch to an invalid state (e.g., ARM) - unsigned short INVPC : 1; // Attempts to do an exception with a bad value in the EXC_RETURN number - unsigned short NOCP : 1; // Attempts to execute a coprocessor instruction - unsigned short UnusedBits : 4; - unsigned short UNALIGNED : 1; // Indicates that an unaligned access fault has taken place - unsigned short DIVBYZERO : 1; // Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set) - } bits; - } ufsr; // Usage Fault Status Register (0xE000ED2A) - - union { - volatile unsigned int byte; - struct { - unsigned int UnusedBits : 1; - unsigned int VECTBL : 1; // Indicates hard fault is caused by failed vector fetch - unsigned int UnusedBits2 : 28; - unsigned int FORCED : 1; // Indicates hard fault is taken because of bus fault/memory management fault/usage fault - unsigned int DEBUGEVT : 1; // Indicates hard fault is triggered by debug event - } bits; - } hfsr; // Hard Fault Status Register (0xE000ED2C) - - union { - volatile unsigned int byte; - struct { - unsigned int HALTED : 1; // Halt requested in NVIC - unsigned int BKPT : 1; // BKPT instruction executed - unsigned int DWTTRAP : 1; // DWT match occurred - unsigned int VCATCH : 1; // Vector fetch occurred - unsigned int EXTERNAL : 1; // EDBGRQ signal asserted - } bits; - } dfsr; // Debug Fault Status Register (0xE000ED30) - - volatile unsigned int afsr; // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional) -} HardFaultRegs; -#endif - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* HardFaultHandler() -* -* Function description -* C part of the hard fault handler which is called by the assembler -* function HardFault_Handler -*/ -void HardFaultHandler(unsigned int* pStack) { - // - // In case we received a hard fault because of a breakpoint instruction, we return. - // This may happen when using semihosting for printf outputs and no debugger is connected, - // i.e. when running a "Debug" configuration in release mode. - // - if (NVIC_HFSR & (1u << 31)) { - NVIC_HFSR |= (1u << 31); // Reset Hard Fault status - *(pStack + 6u) += 2u; // PC is located on stack at SP + 24 bytes. Increment PC by 2 to skip break instruction. - return; // Return to interrupted application - } -#if OS_DEBUG - // - // Read NVIC registers - // - HardFaultRegs.syshndctrl.byte = SYSHND_CTRL; // System Handler Control and State Register - HardFaultRegs.mfsr.byte = NVIC_MFSR; // Memory Fault Status Register - HardFaultRegs.bfsr.byte = NVIC_BFSR; // Bus Fault Status Register - HardFaultRegs.bfar = NVIC_BFAR; // Bus Fault Manage Address Register - HardFaultRegs.ufsr.byte = NVIC_UFSR; // Usage Fault Status Register - HardFaultRegs.hfsr.byte = NVIC_HFSR; // Hard Fault Status Register - HardFaultRegs.dfsr.byte = NVIC_DFSR; // Debug Fault Status Register - HardFaultRegs.afsr = NVIC_AFSR; // Auxiliary Fault Status Register - // - // Halt execution - // If NVIC registers indicate readable memory, change the variable value to != 0 to continue execution. - // - _Continue = 0u; - while (_Continue == 0u) { - } - // - // Read saved registers from the stack. - // - HardFaultRegs.SavedRegs.r0 = pStack[0]; // Register R0 - HardFaultRegs.SavedRegs.r1 = pStack[1]; // Register R1 - HardFaultRegs.SavedRegs.r2 = pStack[2]; // Register R2 - HardFaultRegs.SavedRegs.r3 = pStack[3]; // Register R3 - HardFaultRegs.SavedRegs.r12 = pStack[4]; // Register R12 - HardFaultRegs.SavedRegs.lr = pStack[5]; // Link register LR - HardFaultRegs.SavedRegs.pc = pStack[6]; // Program counter PC - HardFaultRegs.SavedRegs.psr.byte = pStack[7]; // Program status word PSR - // - // Halt execution - // To step out of the HardFaultHandler, change the variable value to != 0. - // - _Continue = 0u; - while (_Continue == 0u) { - } -#else - // - // If this module is included in a release configuration, simply stay in the HardFault handler - // - (void)pStack; - do { - } while (1); -#endif -} - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/stm32h743xx_flash_rw_sram1.icf b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/stm32h743xx_flash_rw_sram1.icf deleted file mode 100644 index 69df62958..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/stm32h743xx_flash_rw_sram1.icf +++ /dev/null @@ -1,34 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x24000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_ITCMRAM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMRAM_end__ = 0x0000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; -define region ITCMRAM_region = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; \ No newline at end of file diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx.c deleted file mode 100644 index 329135b76..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx.c +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : xmtx system interface -- thread locking and unlocking - functions, adapted to embOS -*/ - -#include -#include "RTOS.h" - -#if (_MULTI_THREAD != 0) - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* __iar_system_Mtxinit() -*/ -__ATTRIBUTES void __iar_system_Mtxinit(__iar_Rmtx* m) { - OS__iar_system_Mtxinit(m); -} - -/********************************************************************* -* -* __iar_system_Mtxdst() -*/ -__ATTRIBUTES void __iar_system_Mtxdst(__iar_Rmtx* m) { - OS__iar_system_Mtxdst(m); -} - -/********************************************************************* -* -* __iar_system_Mtxlock() -*/ -__ATTRIBUTES void __iar_system_Mtxlock(__iar_Rmtx* m) { - OS__iar_system_Mtxlock(m); -} - -/********************************************************************* -* -* __iar_system_Mtxunlock() -*/ -__ATTRIBUTES void __iar_system_Mtxunlock(__iar_Rmtx* m) { - OS__iar_system_Mtxunlock(m); -} - -#endif // (_MULTI_THREAD != 0) - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx2.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx2.c deleted file mode 100644 index 6a8f9ee94..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx2.c +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : xmtx file interface -- thread locking and unlocking - functions for file i/o -*/ - -#include -#include "RTOS.h" - -#if ((_MULTI_THREAD != 0) && (_DLIB_FILE_DESCRIPTOR != 0)) - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* __iar_file_Mtxinit() -*/ -__ATTRIBUTES void __iar_file_Mtxinit(__iar_Rmtx* m) { - OS__iar_system_Mtxinit(m); -} - -/********************************************************************* -* -* __iar_file_Mtxdst() -*/ -__ATTRIBUTES void __iar_file_Mtxdst(__iar_Rmtx* m) { - OS__iar_system_Mtxdst(m); -} - -/********************************************************************* -* -* __iar_file_Mtxlock() -*/ -__ATTRIBUTES void __iar_file_Mtxlock(__iar_Rmtx* m) { - OS__iar_system_Mtxlock(m); -} - -/********************************************************************* -* -* __iar_file_Mtxunlock() -*/ -__ATTRIBUTES void __iar_file_Mtxunlock(__iar_Rmtx* m) { - OS__iar_system_Mtxunlock(m); -} - -#endif // ((_MULTI_THREAD != 0) && (_DLIB_FILE_DESCRIPTOR != 0)) - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx3.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx3.c deleted file mode 100644 index 12a457b32..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/Setup/xmtx3.c +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* The Embedded Experts * -********************************************************************** -* * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * -* * -* Internet: segger.com Support: support_embos@segger.com * -* * -********************************************************************** -* * -* embOS * Real time operating system for microcontrollers * -* * -* Please note: * -* * -* Knowledge of this file may under no circumstances * -* be used to write a similar product or a real-time * -* operating system for in-house use. * -* * -* Thank you for your fairness ! * -* * -********************************************************************** -* * -* OS version: V5.14.0.0 * -* * -********************************************************************** - --------------------------- END-OF-HEADER ----------------------------- -Purpose : xmtx file interface -- thread locking and unlocking - functions for C++ dynamic lock, adapted to embOS -*/ - -#include -#include "RTOS.h" - -#if (_MULTI_THREAD != 0) - -/********************************************************************* -* -* Global functions -* -********************************************************************** -*/ - -/********************************************************************* -* -* __iar_Initdynamiclock() -*/ -__ATTRIBUTES void __iar_Initdynamiclock(__iar_Rmtx* m) { - OS__iar_system_Mtxinit(m); -} - -/********************************************************************* -* -* __iar_Dstdynamiclock() -*/ -__ATTRIBUTES void __iar_Dstdynamiclock(__iar_Rmtx* m) { - OS__iar_system_Mtxdst(m); -} - -/********************************************************************* -* -* __iar_Lockdynamiclock() -*/ -__ATTRIBUTES void __iar_Lockdynamiclock(__iar_Rmtx* m) { - OS__iar_system_Mtxlock(m); -} - -/********************************************************************* -* -* __iar_Unlockdynamiclock() -*/ -__ATTRIBUTES void __iar_Unlockdynamiclock(__iar_Rmtx* m) { - OS__iar_system_Mtxunlock(m); -} - -#endif // (_MULTI_THREAD != 0) - -/*************************** End of file ****************************/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd deleted file mode 100644 index 7ba8c84a9..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp deleted file mode 100644 index 67f030e74..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp +++ /dev/null @@ -1,3410 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - embOS - - $PROJ_DIR$\..\..\..\..\..\3rd_party\embOS-iar\Start\Lib\os7m_tlv_r.a - - - - nucleo-h743zi - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - - - $PROJ_DIR$\..\stm32h7xx_hal_conf.h - - - $PROJ_DIR$\..\stm32h7xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\embos\qf_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - Setup - - $PROJ_DIR$\Setup\JLINKMEM_Process.c - - - $PROJ_DIR$\Setup\OS_Error.c - - - $PROJ_DIR$\Setup\RTOSInit_STM32H7xx.c - - - - STM32H7xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww deleted file mode 100644 index 0b40333fd..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww +++ /dev/null @@ -1,7 +0,0 @@ - - - - $WS_DIR$\dpp.ewp - - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf b/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf deleted file mode 100644 index 8d3950ccd..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf +++ /dev/null @@ -1,84 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32h7xx.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_FLASH1_start__ = 0x08000000; -define symbol __ICFEDIT_region_FLASH1_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_FLASH2_start__ = 0x08100000; -define symbol __ICFEDIT_region_FLASH2_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_NORPSR_start__ = 0x0; -define symbol __ICFEDIT_region_NORPSR_end__ = 0x0; -define symbol __ICFEDIT_region_NAND_start__ = 0x0; -define symbol __ICFEDIT_region_NAND_end__ = 0x0; -define symbol __ICFEDIT_region_QSPI_start__ = 0x0; -define symbol __ICFEDIT_region_QSPI_end__ = 0x0; -define symbol __ICFEDIT_region_ITCMR_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMR_end__ = 0x0000FFFF; -define symbol __ICFEDIT_region_DTCMR_start__ = 0x20000000; -define symbol __ICFEDIT_region_DTCMR_end__ = 0x2001FFFF; -define symbol __ICFEDIT_region_AXISR_start__ = 0x24000000; -define symbol __ICFEDIT_region_AXISR_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_SRAM1_start__ = 0x30000000; -define symbol __ICFEDIT_region_SRAM1_end__ = 0x3001FFFF; -define symbol __ICFEDIT_region_SRAM2_start__ = 0x30020000; -define symbol __ICFEDIT_region_SRAM2_end__ = 0x3003FFFF; -define symbol __ICFEDIT_region_SRAM3_start__ = 0x30040000; -define symbol __ICFEDIT_region_SRAM3_end__ = 0x30047FFF; -define symbol __ICFEDIT_region_SRAM4_start__ = 0x38000000; -define symbol __ICFEDIT_region_SRAM4_end__ = 0x3800FFFF; -define symbol __ICFEDIT_region_BKPR_start__ = 0x38800000; -define symbol __ICFEDIT_region_BKPR_end__ = 0x38800FFF; -define symbol __ICFEDIT_region_SDR1_start__ = 0x0; -define symbol __ICFEDIT_region_SDR1_end__ = 0x0; -define symbol __ICFEDIT_region_SDR2_start__ = 0x0; -define symbol __ICFEDIT_region_SDR2_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region FLASH_region = mem:[from __ICFEDIT_region_FLASH1_start__ to __ICFEDIT_region_FLASH1_end__] - | mem:[from __ICFEDIT_region_FLASH2_start__ to __ICFEDIT_region_FLASH2_end__]; -define region NORPSR_region = mem:[from __ICFEDIT_region_NORPSR_start__ to __ICFEDIT_region_NORPSR_end__]; -define region NAND_region = mem:[from __ICFEDIT_region_NAND_start__ to __ICFEDIT_region_NAND_end__ ]; -define region QSPI_region = mem:[from __ICFEDIT_region_QSPI_start__ to __ICFEDIT_region_QSPI_end__ ]; -define region ITCMR_region = mem:[from __ICFEDIT_region_ITCMR_start__ to __ICFEDIT_region_ITCMR_end__ ]; -define region DTCMR_region = mem:[from __ICFEDIT_region_DTCMR_start__ to __ICFEDIT_region_DTCMR_end__ ]; -define region AXISR_region = mem:[from __ICFEDIT_region_AXISR_start__ to __ICFEDIT_region_AXISR_end__ ]; -define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] - | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ] - | mem:[from __ICFEDIT_region_SRAM3_start__ to __ICFEDIT_region_SRAM3_end__ ] - | mem:[from __ICFEDIT_region_SRAM4_start__ to __ICFEDIT_region_SRAM4_end__ ]; -define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; -define region SDR_region = mem:[from __ICFEDIT_region_SDR1_start__ to __ICFEDIT_region_SDR1_end__ ] - | mem:[from __ICFEDIT_region_SDR2_start__ to __ICFEDIT_region_SDR2_end__ ]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in FLASH_region { readonly }; -place in QSPI_region { readonly section application_specific_ro }; -//place in NORPSR_region { }; -//place in NAND_region { }; -place in ITCMR_region { section .textrw }; -place in DTCMR_region { section .dtcm_ram, block CSTACK, block PROC_STACK }; -place in SRAM_region { section .axi_sram, block HEAP }; -place in AXISR_region { readwrite }; -place in BKPR_region { section .backup_sram }; -place in SDR_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/main.cpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/philo.cpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h b/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h deleted file mode 100644 index b8d883b84..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h +++ /dev/null @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file Demonstrations/Inc/stm32h7xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32h7xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32H7xx_HAL_CONF_H -#define __STM32H7xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -/* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_COMP_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -#define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -#define HAL_EXTI_MODULE_ENABLED -/* #define HAL_FDCAN_MODULE_ENABLED */ -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -/* #define HAL_HASH_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_HRTIM_MODULE_ENABLED */ -/* #define HAL_HSEM_MODULE_ENABLED */ -/* #define HAL_I2C_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_JPEG_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_MDIOS_MODULE_ENABLED */ -/* #define HAL_MDMA_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_OPAMP_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -#define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_RAMECC_MODULE_ENABLED */ -#define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SWPMI_MODULE_ENABLED */ -/* #define HAL_TIM_MODULE_ENABLED */ -#define HAL_UART_MODULE_ENABLED -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal oscillator (CSI) default value. - * This value is the default CSI value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ -#endif /* LSE_VALUE */ - - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0F) /*!< tick interrupt priority */ -#define USE_RTOS 0 -/* #define USE_SD_TRANSCEIVER 1U */ /*!< use uSD Transceiver */ - -/* ########################### Ethernet Configuration ######################### */ -#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ -#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ - -#define ETH_MAC_ADDR0 ((uint8_t)0x02) -#define ETH_MAC_ADDR1 ((uint8_t)0x00) -#define ETH_MAC_ADDR2 ((uint8_t)0x00) -#define ETH_MAC_ADDR3 ((uint8_t)0x00) -#define ETH_MAC_ADDR4 ((uint8_t)0x00) -#define ETH_MAC_ADDR5 ((uint8_t)0x00) - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1 */ - - -/* ################## SPI peripheral configuration ########################## */ -/** - * @brief Used to activate CRC feature inside HAL SPI Driver - * Activated (1U): CRC code is compiled within HAL SPI driver - * Deactivated (0U): CRC code excluded from HAL SPI driver - */ - -#define USE_SPI_CRC 1U - - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32h7xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32h7xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32h7xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_MDMA_MODULE_ENABLED - #include "stm32h7xx_hal_mdma.h" -#endif /* HAL_MDMA_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32h7xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32h7xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32h7xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32h7xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32h7xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32h7xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32h7xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32h7xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED - #include "stm32h7xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32h7xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED - #include "stm32h7xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32h7xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32h7xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32h7xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32h7xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED - #include "stm32h7xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_HSEM_MODULE_ENABLED - #include "stm32h7xx_hal_hsem.h" -#endif /* HAL_HSEM_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32h7xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32h7xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32h7xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32h7xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32h7xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_JPEG_MODULE_ENABLED - #include "stm32h7xx_hal_jpeg.h" -#endif /* HAL_JPEG_MODULE_ENABLED */ - -#ifdef HAL_MDIOS_MODULE_ENABLED - #include "stm32h7xx_hal_mdios.h" -#endif /* HAL_MDIOS_MODULE_ENABLED */ - - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32h7xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32h7xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED -#include "stm32h7xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32h7xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32h7xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32h7xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RAMECC_MODULE_ENABLED - #include "stm32h7xx_hal_ramecc.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32h7xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32h7xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32h7xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32h7xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32h7xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32h7xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_SWPMI_MODULE_ENABLED - #include "stm32h7xx_hal_swpmi.h" -#endif /* HAL_SWPMI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32h7xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32h7xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32h7xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32h7xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32h7xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32h7xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32h7xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32h7xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32h7xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32H7xx_HAL_CONF_H */ - - diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c b/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c deleted file mode 100644 index 4b5cb97c0..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c +++ /dev/null @@ -1,194 +0,0 @@ -/** - ****************************************************************************** - * @file UART/UART_WakeUpFromStopUsingFIFO/Src/stm32h7xx_hal_msp.c - * @author MCD Application Team - * @version V1.2.0 - * @date 29-December-2017 - * @brief HAL MSP module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2017 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -//#include "main.h" -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" - -/** @addtogroup STM32H7xx_HAL_Examples - * @{ - */ - -/** @defgroup HAL_MSP - * @brief HAL MSP module. - * @{ - */ - -/* User can use this section to tailor USARTx/UARTx instance used and associated - resources */ -/* Definition for USARTx clock resources */ -#define USARTx USART3 -#define USARTx_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE() -#define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() - -#define USARTx_FORCE_RESET() __HAL_RCC_USART3_FORCE_RESET() -#define USARTx_RELEASE_RESET() __HAL_RCC_USART3_RELEASE_RESET() - -/* Definition for USARTx Pins */ -#define USARTx_TX_PIN GPIO_PIN_8 -#define USARTx_TX_GPIO_PORT GPIOD -#define USARTx_TX_AF GPIO_AF7_USART3 -#define USARTx_RX_PIN GPIO_PIN_9 -#define USARTx_RX_GPIO_PORT GPIOD -#define USARTx_RX_AF GPIO_AF7_USART3 - -/** @addtogroup STM32F7xx_HAL_Examples - * @{ - */ - -/** @defgroup UART_TwoBoards_ComPolling - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_MSP_Private_Functions - * @{ - */ - -/* NOTE: -* STM32Cube's initialization calls the weakly defined HAL_InitTick(), which -* by default configures and starts the Systick interrupt. This is TOO EARLY, -* because the system os NOT ready yet to handle interrupts. -* To avoid problems, a dummy definition for HAL_InitTick() is provided -* in the file stm32l5xx_hal_msp.c. The SystTick is configured and -* started later in QF_onStartup(). -*/ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - (void)TickPriority; /* unused parameter */ - return HAL_OK; -} - -/** - * @brief UART MSP Initialization - * This function configures the hardware resources used in this example: - * - Peripheral's clock enable - * - Peripheral's GPIO Configuration - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspInit(UART_HandleTypeDef *huart) { - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable GPIO TX/RX clock */ - USARTx_TX_GPIO_CLK_ENABLE(); - USARTx_RX_GPIO_CLK_ENABLE(); - - /* Enable USARTx clock */ - USARTx_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* UART TX GPIO pin configuration */ - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = USARTx_TX_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = USARTx_TX_AF; - HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct); - - /* UART RX GPIO pin configuration */ - GPIO_InitStruct.Pin = USARTx_RX_PIN; - GPIO_InitStruct.Alternate = USARTx_RX_AF; - HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct); - - /*##-3- Configure the NVIC for UART ########################################*/ - /* NVIC for USART */ - /* this is delayed till QF_onStartup() */ -} - -/** - * @brief UART MSP De-Initialization - * This function frees the hardware resources used in this example: - * - Disable the Peripheral's clock - * - Revert GPIO and NVIC configuration to their default state - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) -{ - /*##-1- Reset peripherals ##################################################*/ - USARTx_FORCE_RESET(); - USARTx_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure USART Tx as alternate function */ - HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN); - /* Configure USART Rx as alternate function */ - HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN); - - /*##-3- Disable the NVIC for UART ##########################################*/ - /* this is delayed till QF_onCleanup() */ -} - -/* dummy legacy callbacks for STM32CubeH7 */ -void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/embos/arm-cm/dpp_nucleo-h743zi/table.cpp b/examples/embos/arm-cm/dpp_nucleo-h743zi/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/embos/arm-cm/dpp_nucleo-h743zi/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/emwin/demo_no_wm/Config/GUIConf.c b/examples/emwin/demo_no_wm/Config/GUIConf.c deleted file mode 100644 index 80eb99232..000000000 --- a/examples/emwin/demo_no_wm/Config/GUIConf.c +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : GUIConf.c -Purpose : Display controller initialization ----------------------------END-OF-HEADER------------------------------ -*/ - -#include "GUI.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ -// -// Define the available number of bytes available for the GUI -// -#define GUI_NUMBYTES 0x280000 - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* GUI_X_Config -* -* Purpose: -* Called during the initialization process in order to set up the -* available memory for the GUI. -*/ -void GUI_X_Config(void) { - // - // 32 bit aligned memory area - // - static U32 aMemory[GUI_NUMBYTES / 4]; - // - // Assign memory to emWin - // - GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); -} - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_no_wm/Config/GUIConf.h b/examples/emwin/demo_no_wm/Config/GUIConf.h deleted file mode 100644 index af51cc9c5..000000000 --- a/examples/emwin/demo_no_wm/Config/GUIConf.h +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : GUIConf.h -Purpose : Configuration of available features and default values ----------------------------------------------------------------------- -*/ - -#ifndef GUICONF_H -#define GUICONF_H - -/********************************************************************* -* -* Multi layer/display support -*/ -#define GUI_NUM_LAYERS 16 // Maximum number of available layers - -/********************************************************************* -* -* Multi tasking support -*/ -#define GUI_OS (1) // Compile with multitasking support - -/********************************************************************* -* -* Configuration of available packages -*/ -#define GUI_SUPPORT_TOUCH (1) // Support a touch screen (req. win-manager) -#define GUI_SUPPORT_MOUSE (1) // Support a mouse -#define GUI_WINSUPPORT (1) // Window manager package available -#define GUI_SUPPORT_MEMDEV (1) // Memory devices available - -/********************************************************************* -* -* Configuration of window manager -*/ -#define WM_SUPPORT_NOTIFY_VIS_CHANGED (1) // Enable sending of WM_NOTIFY_VIS_CHANGED messages - -/********************************************************************* -* -* Default font -*/ -#define GUI_DEFAULT_FONT &GUI_Font6x8 - -#endif /* Avoid multiple inclusion */ - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_no_wm/Config/LCDConf.c b/examples/emwin/demo_no_wm/Config/LCDConf.c deleted file mode 100644 index 7e6de9978..000000000 --- a/examples/emwin/demo_no_wm/Config/LCDConf.c +++ /dev/null @@ -1,199 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : LCDConf.c -Purpose : Display controller configuration (single layer) ----------------------------END-OF-HEADER------------------------------ -*/ - -#include "GUI.h" - -/********************************************************************* -* -* Layer configuration (to be modified) -* -********************************************************************** -*/ -// -// Physical display size -// -#define XSIZE_PHYS 320 -#define YSIZE_PHYS 240 - -// -// Color conversion -// -#if GUI_USE_ARGB - #define COLOR_CONVERSION GUICC_M8888I -#else - #define COLOR_CONVERSION GUICC_8888 -#endif - -// -// Display driver -// -#define DISPLAY_DRIVER GUIDRV_WIN32 - -/********************************************************************* -* -* Configuration checking -* -********************************************************************** -*/ -#ifndef VXSIZE_PHYS - #define VXSIZE_PHYS XSIZE_PHYS -#endif -#ifndef VYSIZE_PHYS - #define VYSIZE_PHYS YSIZE_PHYS -#endif -#ifndef VRAM_ADDR - #define VRAM_ADDR 0 -#endif - -#ifndef XSIZE_PHYS - #error Physical X size of display is not defined! -#endif -#ifndef YSIZE_PHYS - #error Physical Y size of display is not defined! -#endif -#ifndef COLOR_CONVERSION - #error Color conversion not defined! -#endif -#ifndef DISPLAY_DRIVER - #error No display driver defined! -#endif - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* LCD_X_Config -* -* Purpose: -* Called during the initialization process in order to set up the -* display driver configuration. -* -*/ -void LCD_X_Config(void) { - // - // Set display driver and color conversion for 1st layer - // - GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0); - // - // Display driver configuration - // - LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS); - LCD_SetVSizeEx (0, VXSIZE_PHYS, VYSIZE_PHYS); - LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR); - // - // Set user palette data (only required if no fixed palette is used) - // - #if defined(PALETTE) - LCD_SetLUTEx(0, PALETTE); - #endif -} - -/********************************************************************* -* -* LCD_X_DisplayDriver -* -* Purpose: -* This function is called by the display driver for several purposes. -* To support the according task the routine needs to be adapted to -* the display controller. Please note that the commands marked with -* 'optional' are not cogently required and should only be adapted if -* the display controller supports these features. -* -* Parameter: -* LayerIndex - Index of layer to be configured -* Cmd - Please refer to the details in the switch statement below -* pData - Pointer to a LCD_X_DATA structure -* -* Return Value: -* < -1 - Error -* -1 - Command not handled -* 0 - Ok -*/ -int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) { - int r; - - switch (Cmd) { - // - // Required - // - case LCD_X_INITCONTROLLER: { - // - // Called during the initialization process in order to set up the - // display controller and put it into operation. If the display - // controller is not initialized by any external routine this needs - // to be adapted by the customer... - // - // ... - return 0; - } - case LCD_X_SETVRAMADDR: { - // - // Required for setting the address of the video RAM for drivers - // with memory mapped video RAM which is passed in the 'pVRAM' element of p - // - LCD_X_SETVRAMADDR_INFO * p; - p = (LCD_X_SETVRAMADDR_INFO *)pData; - //... - return 0; - } - case LCD_X_SETORG: { - // - // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p - // - LCD_X_SETORG_INFO * p; - p = (LCD_X_SETORG_INFO *)pData; - //... - return 0; - } - case LCD_X_SETLUTENTRY: { - // - // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p - // - LCD_X_SETLUTENTRY_INFO * p; - p = (LCD_X_SETLUTENTRY_INFO *)pData; - //... - return 0; - } - case LCD_X_ON: { - // - // Required if the display controller should support switching on and off - // - return 0; - } - case LCD_X_OFF: { - // - // Required if the display controller should support switching on and off - // - // ... - return 0; - } - default: - r = -1; - } - return r; -} - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_no_wm/Config/LCDConf.h b/examples/emwin/demo_no_wm/Config/LCDConf.h deleted file mode 100644 index 4d791da51..000000000 --- a/examples/emwin/demo_no_wm/Config/LCDConf.h +++ /dev/null @@ -1,28 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : LCDConf.h -Purpose : Display driver configuration file ----------------------------------------------------------------------- -*/ - -#ifndef LCDCONF_H -#define LCDCONF_H - -#endif /* LCDCONF_H */ - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_no_wm/Config/SIMConf.c b/examples/emwin/demo_no_wm/Config/SIMConf.c deleted file mode 100644 index badc4638c..000000000 --- a/examples/emwin/demo_no_wm/Config/SIMConf.c +++ /dev/null @@ -1,55 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : SIMConf.c -Purpose : Windows Simulator configuration ----------------------------END-OF-HEADER------------------------------ -*/ - -#ifdef WIN32 - -#include "LCD_SIM.h" - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* SIM_X_Config -* -* Purpose: -* Called during the initialization process in order to configure -* the simulator. -*/ -void SIM_X_Config() { - SIM_GUI_SetTransColor(0xff0000); // Define the transparent color - SIM_GUI_UseCustomBitmaps(); // custom bitmaps should be used - SIM_GUI_SetLCDPos(132, 45); // position of the LCD in the bitmap - SIM_GUI_SetCompositeTouch(0); -} - -#else - -void SIMConf_C(void); // Avoid empty object files -void SIMConf_C(void) {} - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_no_wm/bsp.cpp b/examples/emwin/demo_no_wm/bsp.cpp deleted file mode 100644 index 0324ab7af..000000000 --- a/examples/emwin/demo_no_wm/bsp.cpp +++ /dev/null @@ -1,138 +0,0 @@ -//============================================================================ -// Product: BSP for emWin/uC/GUI, Win32 simulation, NO Window Manager -// Last updated for version 7.3.0 -// Last updated on 2023-07-20 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -extern "C" { - #include "GUI.h" - #include "LCD_SIM.h" - #include "DIALOG.h" -} - -#include "safe_std.h" // portable "safe" / facilities -#include -#include - -Q_DEFINE_THIS_FILE - -// local variables ----------------------------------------------------------- -#ifdef Q_SPY - static uint8_t l_running; - static SOCKET l_sock = INVALID_SOCKET; - - static uint8_t const l_clock_tick = 0U; - static uint8_t const l_simHardKey = 0U; - static uint8_t const l_MOUSE_StoreState = 0U; -#endif - -//............................................................................ -static void simHardKey(int keyIndex, int keyState) { - static const QEvt keyEvt[] = { - QP::QEvt(KEY_UP_REL_SIG), // hardkey UP released - QP::QEvt(KEY_UP_PRESS_SIG), // hardkey UP pressed - QP::QEvt(KEY_RIGHT_REL_SIG), // hardkey RIGHT released - QP::QEvt(KEY_RIGHT_PRESS_SIG), // hardkey RIGHT pressed - QP::QEvt(KEY_CENTER_REL_SIG), // hardkey CENTER released - QP::QEvt(KEY_CENTER_PRESS_SIG),// hardkey CENTER pressed - QP::QEvt(KEY_LEFT_REL_SIG), // hardkey LEFT released - QP::QEvt(KEY_LEFT_PRESS_SIG), // hardkey LEFT pressed - QP::QEvt(KEY_DOWN_REL_SIG), // hardkey DOWN released - QP::QEvt(KEY_DOWN_PRESS_SIG), // hardkey DOWN pressed - QP::QEvt(KEY_POWER_REL_SIG), // hardkey POWER released - QP::QEvt(KEY_POWER_PRESS_SIG) // hardkey POWER pressed - }; - - // do not overrun the array - Q_REQUIRE((keyIndex * 2) + keyState < Q_DIM(keyEvt)); - - // post the hardkey event to the Table active object (GUI manager) - AO_Table->POST(&keyEvt[(keyIndex * 2) + keyState], &l_simHardKey); - - if ((keyIndex == 5) && (keyState == 0)) { // hardkey POWER released? - QF::stop(); // terminate the simulation - } -} -//............................................................................ -extern "C" void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState) { - MouseEvt *pe = Q_NEW(MouseEvt, MOUSE_CHANGE_SIG); - pe->x = pState->x; - pe->y = pState->y; - pe->Pressed = pState->Pressed; - pe->Layer = pState->Layer; - AO_Table->POST(pe, &l_MOUSE_StoreState); -} - -//............................................................................ -void BSP_init(void) { - int n; - - GUI_Init(); // initialize the embedded GUI - - n = SIM_HARDKEY_GetNum(); - for (n = n - 1; n >= 0; --n) { - SIM_HARDKEY_SetCallback(n, &simHardKey); - } - - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate -} -//............................................................................ -void QF::onStartup(void) { -} -//............................................................................ -void QF::onCleanup(void) { -#if Q_SPY - l_running = (uint8_t)0; -#endif -} -//............................................................................ -void QF::onClockTick(void) { - QTimeEvt::TICK(&l_clock_tick); // perform the QF clock tick processing -} - -extern "C" { -//............................................................................ -Q_NORETURN Q_onError(char const * const file, int_t const loc) { - char str[256]; - SNPRINTF_S(str, sizeof(str), "%s:%d", file, loc); - MessageBox(NULL, str, "Assertion Failure", MB_TASKMODAL | MB_OK); - QF::stop(); // terminate the QF, causes termination of the MainTask() -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" diff --git a/examples/emwin/demo_no_wm/bsp.hpp b/examples/emwin/demo_no_wm/bsp.hpp deleted file mode 100644 index c74a1ea13..000000000 --- a/examples/emwin/demo_no_wm/bsp.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// Product: BSP for emWin/uC/GUI, Win32 simulation, NO Window Manager -// Last updated for version 5.8.2 -// Last updated on 2017-01-15 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -#define BSP_TICKS_PER_SEC 100 - -void BSP_init(void); - -#endif // BSP_HPP diff --git a/examples/emwin/demo_no_wm/demo_no_wm.sln b/examples/emwin/demo_no_wm/demo_no_wm.sln deleted file mode 100644 index 5ac9bc81e..000000000 --- a/examples/emwin/demo_no_wm/demo_no_wm.sln +++ /dev/null @@ -1,24 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29709.97 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_no_wm", "demo_no_wm.vcxproj", "{5A1F2953-14F0-4676-8E36-1C759C4AE2A1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Debug|Win32.Build.0 = Debug|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Release|Win32.ActiveCfg = Release|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0B2739F7-EC74-4A06-AA74-9C33F52AD9BA} - EndGlobalSection -EndGlobal diff --git a/examples/emwin/demo_no_wm/demo_no_wm.vcxproj b/examples/emwin/demo_no_wm/demo_no_wm.vcxproj deleted file mode 100644 index 5e4ecd58d..000000000 --- a/examples/emwin/demo_no_wm/demo_no_wm.vcxproj +++ /dev/null @@ -1,269 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - QSpy - Win32 - - - - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1} - 10.0 - - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>11.0.60610.1 - - - .\Release\ - .\Release\ - false - - - .\Debug\ - .\Debug\ - false - - - .\QSpy\ - .\QSpy\ - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/demo_no_wm.tlb - - - - MaxSpeed - OnlyExplicitInline - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - .\Release/demo_no_wm.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;%(AdditionalDependencies) - .\Release/demo_no_wm.exe - true - %(AdditionalLibraryDirectories) - false - .\Release/demo_no_wm.pdb - true - .\Release/demo_no_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\Release/demo_no_wm.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/demo_no_wm.tlb - - - - Disabled - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - Default - MultiThreadedDebug - .\Debug/demo_no_wm.pch - .\Debug/ - .\Debug/ - .\Debug/ - Level3 - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;%(AdditionalDependencies) - .\Debug/demo_no_wm.exe - true - %(AdditionalLibraryDirectories) - false - true - .\Debug/demo_no_wm.pdb - true - .\Debug/demo_no_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\Debug/demo_no_wm.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\QSpy/demo_no_wm.tlb - - - - Disabled - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;Q_SPY;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreaded - .\QSpy/demo_no_wm.pch - .\QSpy/ - .\QSpy/ - .\QSpy/ - Level3 - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;ws2_32.lib;%(AdditionalDependencies) - .\QSpy/demo_no_wm.exe - true - %(AdditionalLibraryDirectories) - false - true - .\QSpy/demo_no_wm.pdb - true - .\QSpy/demo_no_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\QSpy/demo_no_wm.bsc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/emwin/demo_no_wm/demo_no_wm.vcxproj.filters b/examples/emwin/demo_no_wm/demo_no_wm.vcxproj.filters deleted file mode 100644 index 592c64b58..000000000 --- a/examples/emwin/demo_no_wm/demo_no_wm.vcxproj.filters +++ /dev/null @@ -1,139 +0,0 @@ - - - - - {39b51785-bb27-4d42-b439-073a1a9a910b} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {016d9e72-83bc-45de-a3be-7a1ddadcf0d0} - h;hpp;hxx;hm;inl - - - {e2b2644d-3a90-49b2-907a-2c90edbd53d5} - ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - {edb4bdd4-7822-4812-b677-b21cb00121b0} - *.lib - - - {c3592ef4-5e20-44d3-97b5-90dd6b206777} - - - {7a7fe1ad-75a5-4b4b-85cc-602c1d933e3b} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - emWin - - - emWin - - - emWin - - - Source Files - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP_port - - - - - emWin - - - emWin - - - Header Files - - - Header Files - - - QP_port - - - QP_port - - - QP_port - - - - - Resource Files - - - - - emWin - - - emWin - - - - - QP_port - - - \ No newline at end of file diff --git a/examples/emwin/demo_no_wm/dpp.hpp b/examples/emwin/demo_no_wm/dpp.hpp deleted file mode 100644 index 02074a864..000000000 --- a/examples/emwin/demo_no_wm/dpp.hpp +++ /dev/null @@ -1,80 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef DPP_HPP -#define DPP_HPP - -using namespace QP; - -enum DPPSignals { - HUNGRY_SIG = Q_USER_SIG, // sent when Philosopher becomes hungry - DONE_SIG, // sent by Philosopher when done eating - EAT_SIG, // sent by Table to let a philosopher eat - PAUSE_SIG, // sent by the user to pause the feast - MAX_PUB_SIG, // the last published signal - - MOUSE_CHANGE_SIG, // mouse change (move or click) event - - KEY_UP_REL_SIG, // hardkey UP released - KEY_UP_PRESS_SIG, // hardkey UP pressed - KEY_LEFT_REL_SIG, // hardkey LEFT released - KEY_LEFT_PRESS_SIG, // hardkey LEFT pressed - KEY_CENTER_REL_SIG, // hardkey CENTER released - KEY_CENTER_PRESS_SIG, // hardkey CENTER pressed - KEY_RIGHT_REL_SIG, // hardkey RIGHT released - KEY_RIGHT_PRESS_SIG, // hardkey RIGHT pressed - KEY_DOWN_REL_SIG, // hardkey DOWN released - KEY_DOWN_PRESS_SIG, // hardkey DOWN pressed - KEY_POWER_REL_SIG, // hardkey POWER released - KEY_POWER_PRESS_SIG, // hardkey POWER pressed - - MAX_SIG // the last signal -}; - -struct TableEvt : public QEvt { - uint8_t philoNum; // philosopher number -}; - -struct MouseEvt : public QEvt { - // payload: GUI_PID_STATE - int x, y; - uint8_t Pressed; - uint8_t Layer; -}; - -enum { N_PHILO = 5 }; // number of philosophers - -extern QActive * const AO_Philo[N_PHILO]; // "opaque" pointers to Philo AO -extern QActive * const AO_Table; // "opaque" pointer to Table AO - -#endif // DPP_HPP diff --git a/examples/emwin/demo_no_wm/main.cpp b/examples/emwin/demo_no_wm/main.cpp deleted file mode 100644 index 535317381..000000000 --- a/examples/emwin/demo_no_wm/main.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//============================================================================ -// Product: main task for emWin/uC/GUI, Win32 simulation -// Last updated for version 7.3.0 -// Last updated on 2023-07-20 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -// GUI includes -Q_DEFINE_THIS_FILE - -//............................................................................ -extern "C" void MainTask(void) { - QF::init(); // initialize the framework and the underlying RT kernel - BSP_init(); // initialize the BSP - - // initialize event pools... - static union SmallEvents { - void* min_size; - TableEvt te; - MouseEvt me; - // other event types to go into this pool - } l_smlPoolSto[2 * N_PHILO]; // storage for the small event pool - QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // initialize publish-subscribe - static QSubscrList l_subscrSto[MAX_PUB_SIG]; - QActive::psInit(l_subscrSto, Q_DIM(l_subscrSto)); - - // start the active objects... - static QEvt const *l_philoQueueSto[N_PHILO][10]; - for (uint8_t n = 0; n < N_PHILO; ++n) { - AO_Philo[n]->start(n + 1U, - l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]), - nullptr, 1024, nullptr); - } - - static QEvt const *l_tableQueueSto[N_PHILO]; - AO_Table->start(N_PHILO + 1U, - l_tableQueueSto, Q_DIM(l_tableQueueSto), - nullptr, 1024, nullptr); - - QF::run(); // run the QF application -} - diff --git a/examples/emwin/demo_no_wm/philo.cpp b/examples/emwin/demo_no_wm/philo.cpp deleted file mode 100644 index 6c106cc85..000000000 --- a/examples/emwin/demo_no_wm/philo.cpp +++ /dev/null @@ -1,154 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Philo : public QActive { -private: - QTimeEvt m_timeEvt; // to timeout thinking or eating - -public: - Philo(); - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -#define THINK_TIME 7 -#define EAT_TIME 5 - -// helper macro to provide the ID of Philo "me_" -#define PHILO_ID(me_) ((uint8_t)((me_) - l_philo)) - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; -// Global objects ------------------------------------------------------------ -QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AOs - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -//............................................................................ -Philo::Philo() - : QActive((QStateHandler)&Philo::initial), - m_timeEvt(this, TIMEOUT_SIG) -{} -//............................................................................ -Q_STATE_DEF(Philo, initial) { - subscribe(EAT_SIG); - - return tran(&thinking); -} -//............................................................................ -Q_STATE_DEF(Philo, thinking) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(THINK_TIME); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&hungry); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, hungry) { - switch (e->sig) { - case Q_ENTRY_SIG: { - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoNum = PHILO_ID(this); - AO_Table->POST(pe, this); - return Q_RET_HANDLED; - } - case EAT_SIG: { - if (((TableEvt *)e)->philoNum == PHILO_ID(this)) { - return tran(&eating); - } - break; - } - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, eating) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(EAT_TIME); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoNum = PHILO_ID(this); - QF::PUBLISH(pe, this); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&thinking); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} - diff --git a/examples/emwin/demo_no_wm/sim_x.cpp b/examples/emwin/demo_no_wm/sim_x.cpp deleted file mode 100644 index 26d268156..000000000 --- a/examples/emwin/demo_no_wm/sim_x.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** -* Product: Initialization for emWin/uC/GUI, Win32 simulation VC++ -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -*****************************************************************************/ -extern "C" { - -#include "GUI.h" -#include "LCD_SIM.h" - -void SIM_X_Init() { - if (((LCD_GetDevCap(LCD_DEVCAP_XSIZE) * LCD_GetXMag()) == 320) - && ((LCD_GetDevCap(LCD_DEVCAP_YSIZE) * LCD_GetYMag()) == 240) - && (LCD_GetNumLayers() == 1)) - { - SIM_GUI_SetLCDPos(132, 46); // position of the LCD in the bitmap */ - SIM_GUI_SetTransColor(0xFF0000); // transparent color */ - SIM_GUI_SetLCDColorBlack(0, 0x000000); // "black" color */ - SIM_GUI_SetLCDColorWhite(0, 0xC0C0C0); // "white" color */ - } -} - -} // extern "C" diff --git a/examples/emwin/demo_no_wm/simulation.res b/examples/emwin/demo_no_wm/simulation.res deleted file mode 100644 index b25b693703e0409908dfe9dbbb200291d96de2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043100 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≀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
pSRGAq>l*OuHqxFh|S@0$Jc z{rd}kXzmZ4R7%#GWp2@Kn%m}1oY%gwKj#n47jV)6=km+93&k*tA2u>o~K+Vu#m`1r(-Y=8<9oNN#< zu(sLI!ml^9t67O54yX~Z0lAN>89dNh)ohS%tf&j&RiCBFNH7g|lz9iM;#kuZ3; zW(TxB|VQ!5{xf{W5Qouj8=W7tK9zES96ew*uXs zFSXsK z=}BYOjqitLY2AbY>&Ev_8`o#e=bLtK5 zWcK*nWW)mr8p{cx{#`@4Of)ve9Wu5Gq;ZL{g8HtRZlx+Xp@ zWp&!BxY$@>L%oYHh7H*MG#dip;NSvL9~I=kiw&Mlsdx$$@2ZPT4V)Pp5Ib0VTx@WH zAsid98VMU9fwCzv6{{8Kt<<4bZL|UO0}hU~Q3D;U5pdSn2K9L{0RwEncg-h#V1v>d zCQgA9PBvWXM1sUioa1&xGsT{$4o_cv>F|5*9bdENghw9HY}ht8VMF4OjZ@+_P992R z{lr0N4|~@o2g+yn7BD!lb^XEZo16pX5Y0F+oLP4+odp$eaa-XVI=Sv$XMX}{8 z0qyP3`zzC>dz?OH67+K7xS6rZOkZmr+^5sr5ejhHJU)N=;g~ND^l6{nyM1P__S<{5 zPw&xwW7n_NP8hW&ZC&cHAwz@>Z(MYdV{n5awAlE3>p(UH!okG`9;_nsl6V*5)j%<< z0XG}M_#1Q+5$S-SKzg4!8{*?32hCF_8`6Q&I!4o3vmo zG$Wb;1N;C6HXD4O1$DCFvtTw{P%1N=BN{f0xc~lyKmU2+V~-u$z8%SW>SR7abzTxOM9{t{pyfX#LAC$ENi9g%?6#0PY)65}6GFaL{Z(VU(w;7`{&4 zC3`hcWNP3H*Z>?rg|NY;D>ygBri7LtJ_d0%Aa)S_OrR9VhMK|#!9&w~?q`}+GRWK* z@Bk_hNaRC6%#Z;a#HJKdZzvhehO5f_9MTbuK?ydDeBc2LN{Np@ekdaYQG5Di{*EOx zx6B^Db?yX)J=3iyJt-bYU}DN#F+U1f?9X!Y*wHO>Cb*1IyHgge8rnH^WQ-NMr3~w` zZ*!XLgC}`tXOkKCB+wse&P4ywi186QJPikO0ul?_IGwWOL|m7n!((!X#q5uZ$r>87 zYe-DSkeIClyKGLHv|-bhjU$J}2^(I!-~!lyxe!6`TYNf$`dMP9#@PG~x-+z!MLWpnsls*4zCmWoOXxK2SR;@|3Yft{$-wq2KPMyq5{(1ZS z$r%f#qCjk$KY81{iCgC+q|Y3K0&#dx=m}Xv3g~UWOj$F!r&HTFdHmSUrL)(J?!gcW z32Vmm+`na=?7nV=IjXxkuCE=&^fYHDn9iA;Fb_=_X#PAYx>~-g#sC z9vaj4!05i&qxnFwPz|?#EDo5LpqNp$_)*mJgGN+F+7blr(lg;fL&D|O1 zw2@}QKs5r+>39fN7&MHzlTMExkUt^z*o4?439$#q$L<>+yLVjd?s2g@NB7^pVD`3* zo!huQ4Xl1jua+*Y*q{bC_?7@Pcx)(QufKOWUJZn;f!~h}qBl6HpxHnN`Y>!zdPB^! zbqNf55GnwMkZfR%Zj=Vvs=|h^zqY684#9>R=a!4WhH-%5si&qt_uS!~N++Px5pq0p z<-Faie%ZZpe&&jKyOQVbTsCXRqUqaznY?9IJcMAFv~ux=S(tbg!x2-oZkjfH)ASJ= zrwrdXIS!vTGbwGHI*bmoBU1lB++pE^3bo=+3a}v}6r;Ru{b;R+hBaTiPacIhj1CvMOB#y{R9I+>1 z=&mKd?AWz?X9AA?E3SCiFkl00cd{W64dK|JIu8I7XCGG2rWE#_^M3GZ;B2UYAU1?l z8~jd3tvBE+j;uFmHh_nK5TA&9+0TaRm0dO^tv5K?fI&&?4cgy8Cnd2dp*LtYxaa6D zdCu_&j%f6T2~Yoh#&gdlz5Mc#U8cp`l*}HPquSCyCpEY(1zKX~JPsZ%AIK6Xy{^c!emE32T-RyDZ zobd&Oq2 zjN3P3+}^2U_N-jIJ1cw7g@F^Q8JYEX~EQtMKg9_j0zXnap81! zMk~P%(SIu^3Ud?>E^=e=HeOVlBBSKUl&YO*&xA&Rcc?>#1~F8 z7fmyl%v3urnqmGj*_@YnYF=Xgyu@QaCmxxbcxZ0o!MTYCk|yj+P0rqTAZPmI$xW}i z>J9oSl`hSUxO~qIL2oaCii4}=piPazdV|M?&@Y^q>eawmQUgvlAnwDs8yM$gHxYe$ zgZegSq1a$Ug5lIoHdvnpRYM$zs1a~B8?Y(iZ_r@CrWAn<*p!&2`-@L<#2xKs!?k7N zBRHa8y7clXb?eS;&|rSkrbqW!ldYaUjYr|Y_Km0ozOeDYwhjBYu0@~7*|2Kw+T^UX zDE zd1&6$gB#cEJ9y~8>=`qfU43-}#zmJdEd$@UyR!HYp=RBShzT_sg)V5UWv)HXrgWA_ z0I!%{4TP=%CmRaoi)KjL8MA@5sclnouz?P&!iJb<>i`DvH)uR)gOc_|g9N2FBq_bY z$%cD%k0puReEzrLX3IcnfDO~?)dLI*TeLW8=?%#1yaU;}nOhI<-cEoMDr9cU-L(Zb zgM!4CwfoZ3EUf~SVs&6h!3CYOk+pRPI&jttAi-pPSdDgUHnBKuOflE5G&inNkthRwpHM^~#EN<5^0}v%&&^*x_xQ58 zdCTS=Su*F)u8f0+j~<>gZQ2KyUDk-X_DYpP0R#{9IF>aL)d`uPErSriwfap0~qLPDOZv*Z=efvO%d1%HN=EN?LCSwkc`7VP4!Q^oCD9+7sHQRK<8GxRa8MdK0~2 z?)%M_e*XEgHf?fJQf%3M>eR6V*;dHG_+y3aWBd2!?aNZM*qeDIYuAxIJC9`TfEI`M zWE|R^!T4vead>wI8IB)5$f!3dH=Il1KAG z$*Y00rv{vCh*ED5O#c%SmhLCK)tVCBO z#fJC<>yy!Oqp)TxReHA!_1Z~m$z-Z;@fYxO`4>o@X6!H8MAi6 z7lkUMZ2_i<2B*6h$fqoFk1+|4u z2?1iy!>aua1+l?7_RYx#Y)VYJXR*Q78v^>Uo_}t3jx_~3yD zmUjLzt!K}*efnffpRQF0gU9yo zCmcU;;5Q8FnEUo|@RLW6DoC6>sSE5Z56KL4K%c4H~ZP*KgynVT66FS39LGW}K5JFy@?4`az)G-!F?TBp|6z96n56qZ7HgDiHZy zgPeu6Wo}Ze3R660*En&^WDv!Hz2?E3fRBbQ?%erX!{}%jUl_)ZZ#6;EV1 zA#hx@qrpH_v%%9Fg5EMO!K;C@uLhiKh}z#^iwLaEXJ%8PM{$BMSKUjO{>d;p7)Gz#Z~vfPeVY8vLD32gfpD;z26`0$2h9dgZ#etJ zfLCI#27+p!@ND3#JBkg+1>6ZC-3*fG@HZqnH3#&DkZf@FVU6sIj;uEX*pze!RtSLt zp?%RVHlRI>YVql&gb7;{61GpCyge}yJka(J&jmHL1}X(?umkb`VbI0!MZ(#d;7fRaQnL%#>hYadCJIAP=50@MbN4QI0$@XGGhKu`@t%LYAXhK~-S zH)uBaa1iic{0$78wb)=Q4~h-(A#6%YZ?J4ih4)3r(@#mWAz;po`;1F88?@5kWCP9y z*zne^w{r+SW8L|iZ#E|-?U*@p=d4+*fyCY=OAc<@L`PDb2dD_jT90W)tTQefjoy?D z|3B8i07DbyXY|IFapM-ZYQ@K~$J~AQ=*pFcTzl=b=bz79u#|f#-HL&Ez+_6;iK12< zESpli=Zg+{#k>Ts2F}VFC@dSa<{)fvY6$^Yur_QqFrR`C55!;tlnC}WM9&7@ht;Py z#549S1RE|mZ)brWST!3kRJCr@gdY0Src7BqXHLefSv!-G2s@@v&zL$@8JaA80%iy{ z=+Q)q7@)RIoVb-RVS*hJ60lAEx5N1Hh<@cSL75sodh>`8n}!YBFnDlU@7@gESkSE5 zoO<#)eAd*W|k%6{6Kk=YA%Y&r<3EDsjAv#} zB=w9;p zC|sb~5UvAjuuZ9PwQ3v!rGdpl!!%Xa#6)z6g)?TXo;h>Flqu^cPF$amuy*X&v@v7W zj2xLde0b`xVXKD@T|Hz-N^GozRf7ht8aQy(fPrf543aWn;7TI0wtiKc14$gPYQTV$ zL4#5U4_-5LXraT9A#1F#dQfZ%N9)&bY0sVufBf<1jvbS}ZacG0o21sQ8T&ostCO1;CAwC{3IN1K$ifAsVh-L#PlBcT3zBJy2c{NZBYQV{c2;-u4 z8&Ry&*p<$h4TvVh7xo(j@~>rs*p$Mtp<>DZM9BvFMZpGyBW8Ce8>FlhS4TvS{~l{j z@$1RKyo-X#Cg{zn%@ur^JkVPQAfDzTvKt)r1Ys!3|D>5*mZ} zqM6vQcPnLZ$9qos1P>9`j?4MYqQ3E zjyM$utv7hS=%OqzylX2qHQ;0eVu6?4{r>y5wHzP;fq~w@Cm9OiZ}17x0@+Yle}jt+ z%rEKi1J zgJ)AJHqyhp(4t%ePBuhiQxbUCY>1B!r!h!+IK2Te7(s6+3>)GY`)0G@wUhvVgX+L) zln%!RGzL)`U_*neuNF2SNx@x621ue1LO7sPegiC6hv0xnb_93eqFe|p8VCv=dIN+w zHp#{junPeIpdFG8s+VdI8#taIgn~q5g9eI3baO#PG#fmdQc)Hd-nA8*8u&GAVCsuA z&>KXkGR`clO{q=+-*3=!W-vRqvMEiRf=#JW-Q)l^Ty@cckb@hf11oFI1_nhlThn)+ zD`DzlgO>Xgn)q+d1ATmngu#Oa2YaQ!VCfc)h;l*8W(YP&=PU6=BefM9l9TPJbS(*w z-oUZNEkOYg@!)~Ay#&~loO(l`*5F`+r#BQE>ET^yQLX_e8;}X27Py*+u0|r8mfnyD z8_qy)5CQ9FgPNe*H%GVXr&PO8dP6W9ZWlz{a2(-`;`6&nINusZbyj}1jxV0hP7Y--?Fu)#zMMb8G2d#n*etb^Eamv3Bj z?E>e_@b_U2r8n5V=-V#-N@nLSkPS`mxt}Adfp0C8!Ce=$P?0Dxz%e7_lwVm>N6z2^ zf@2dl1T5_9W&>B%qJ`*p^ul6vTbj}v{0nSgFPUhMle%q6u8vAh%^{Eu=owrZtp?Ag zRBWV&ccDeO27V125Cy?(Xx|>$&`$mNzWavcaW29JnzOb|$*ngO{JrP^HYD0MrFZJC z5{2Oj`B$OzyTXQl-|U}(HDo6x*ucOy23#ORodu0PF5+J2=L)sJ)*_x?$tG)Oeu?X~ z&L&6GyE~7m4;~z0FU(?EZ$RR6Q78nqO$j!P9EtSzlVQK|MY9( z-=KWamcK!>!PXn9lzB0Da6>pY;IF^}BSsZn(8v*|e76L*auADPWi1vS(&Zpl1|+#^ z<`dT>AfnHr4@iWzzw;+{kq`_6X9{^ZnqotzP9VXyDMi5sPA6>OXmSZSH6ovsY%s%# z3C#u`2YITB`n%&@pH~A#xdx(S13g={96%;m{st5ArLiC|5HLt0@d#|d^&3WSz~xYY zFWRX$Xf|kHbP3TL?kHI+G8?1=E1i@WgNNRLB&FOU5VgDx7ZJftW_TbzTOuUN3{xVP zMKntrz}B3lDdvLUkGpp^!R zbn4VjB4@;gI)&03(tQ2~&4wF<4bCq&gdF%LY(Q_2LD9%=5so7JL`*y5l7euA3FuAy zgb+le0s{gO5&E`@U`^X6wtlivBecpHc7W1=Am&8;B;-J!pqWpi1cbYs$bknYI9G(w zMdH*1O5$2bBpb)kdV?xV;ABc9?5)a1)WLg9^6jpCQb-l!}6E@UEeF*T5OGfv%6pBIJNZf<%xrdWp;i`i^#}Rofc)<{bN0NSjhp zl8X(>7kx>YvI>4F5kMmQpQMO{ExlLzyWqJk`zeh|n7wIytj zbf;WaY>1EN;2I1v$V_^Rl1L4*7rRh{O3AP?TX<0J2bRdjC5}uXISY4%0#Z&@7zZ1a zW{{M`>EMAZnhhvGJ~k-5L7mHI#gYh>Lxg1cl~Q>&rQ$6*ysIzbHSlZLfHV^}Aj&i$ zG#H2o8${Ad8++M<8N2wm#Rjw(#RjbE zmakQpm`!vAGzR1*>H@*0f`bjg+Jj<)r8*#*IjqQf(Hju2*7e&;gVGzU;|m_}V^Be# zeeeZ4QnT!W5+D_aP`2^l6WLNoN~jl7IDTQ-04TV5l+$K|Wm5{l2Fs4b@iiNWcs8XX zE*`wgE5Clw?fo(&7g5QYuW_F=`2q~=qy*x1I`ASObNXKag5+Y&Wg-sO&qz6_yz>13uM4IfS?b?13x(z0R!2{&l<6- z1bs{lf?iI6ROPTN3Oktpg$&l3$|aG^9E5WrwGr7uRQ9Fu?v&cjqDsm6)ne0w=vDQFI7$MqmRERxy69yi50L;H=7j!_);_z?FF-eA|kgDe~4GW zfQU!DikxK~4i8#mkerr8?nIn}C>xRGWJb0M8&pq%cK9bgJ?#NJe66Fd*D%zl+i!Lf_AZK$nB`WOc5UeD|6DX^hJ$G#fZe;IiL` z21N);La8_cCw1UKiDzMh#skHclJiqA8z{L&Da9DFq4nuLtfr~PtVs#kmrG`$c*J#W z2!Z7IR^_O3k%z_EWZ*cIip%l(DHUUR;$3>tsex$O5NcdBB0^fm!BmhGCmWC|NE;R< zUR-RbUb$0EJ!gj4lI(U@76AimCmW=7j}Rww&8k&VGKfguRtz;dkS?Ox5~}uSYPZ^8 z>kR6jh+V3fb7?$?m{!_@4-b-}r1b(d2`fJYvw;Frd~8bmL@%Sj3A!yd1b+0563X!f z0TwUPI5>$coKalj7{(&7fd{MTyd~b1cr{S`YT%67fLK6ESTZLZ8UlRLBE)P_=3;}) z(JgqW6D=FU=?#y;hTBR$S0Ed3Hqc>-2{VKZ2vEcyq7&;sjsQOxkg1MEYYz$!KBa*u z>14zNL-&7WDsoEw{i^e;h;RRlOMzZ!r9C*nAW=*5@^OV^(H=Mj79L>$GTLcYB9WRE z@s06{oa_RY1S$b+NQMn)f%anS4K^F>5BtCd@i#yPQESM}={O6eamQ2gYD zcg4l0212qyiw>U%k^gopkqsmU8_19X*+3K1Nd<|sBPvCpP02AwcOh*`xE!!4HGJx4 zpg>S;h;lL|y0J2{VO&fvWGGjHfVH{}Wg=K<=Id*7prM_xL4$#uNM0@m(TOBQ;Sgb} z*KF$~c%h)77U`ZOaXW8dUHfYs@r_UxJYd@5L_Q1<4e&ZR*}xUaLh&fGbuIeCKK@g2 zaM6%BzFdOR64dwxwQ!#_ zQQWPFYOak!V-!N3S{J5FF)CPmaD$OWURA{Qe52G6Ec{Dg^j#YL(HqGyAa1D0H|^#&vrvec5IAy)i^?L*5h z9YNagQ=r~ZXn#XEo06KNJLF_a&IvOB13i?mCiUv9X6HuwBk8y>WFlY?RlvF+8w_M% zAzf<>#1XZ~PGq7;b}jvbtV7nUMT)2jsw_@0$nGTi#I^jFU6A1_u#ifXQB(?m+d!&P z!NGwC%?4FY%S^Xqzk$=q zQ&ps16z^iZ8YpHp5DgnF38m4X@ z=LDzTz%<iZMYUyJ|hQ`A2FfxP~O%XgNLE8+-T8mHr_dgSJti`lE>U9MLH zMXCnEv4M80Q-(N2m84s2P+d`FK_JNDOHlt2QwTAQ1RX)X@Kdnfpgs#~`=aXx+mxJa zKxxo=gPRRy&d&_V1{wPX6;L4Py2}1YOhhfsa6~%SgY5-2XfS9#$b~6^Yc1@B5Y+8` zCFp&!-X;UTsdkt5b|1-T`&f0V=%^JewYar85=x>6~{QU*lbO-{s9|)&9X9k0k4^2tCG7*t*d4O zNhUE#P2i7JB}*-?$}Tlze=y4iqI{m`+x?v9^f~YQo_l9Bx^r*$oH@5ozkT|2Kj)n9 zx1Zf{P|7Xuz3t?a05%RX1(FH&wAz`PPri_MMDgsG=QE!C%s}C12RGk9EuXy zXKpCO;4{(4iBJTS{K;-*;xrFFL<-1)^-Tr1mfK|NHl=c^sSXeWJQ*OYTp4pS`oay= zlQISRX3-j}4qOY%50a&}5blR5}0xW?>sL*_y+hGoL#s;#~M^2B6K1G0+0<@b6zO(h3TZi5ZSB*OilHM zh8sS1__mWazrlRbNpIMRFM7-k@44YiK9?6$(%iS;1|ld8eCUlelmJi~24d4Bfhjc> zE5sgRQ9NZ1qi6{;_!wM7y&1eIlnRHF5MiMZJ%TD>(!wZPRB!b_9QBD@9 z3!z0`9diS?oEBW-LX^q5>?3U82DgLh0@@olRGSioSYtdy4P7bndTBSD%u_O|B&Q%8 za)}$dO=-VDMQ_gmlfaZ4=$tY}A3oqU=j8`I04^P7ZZK3idzPV|Afb>`28=a&1NkwE z7!o#m!wPQLIQPxI-*9HTwJE*u*}t8+p;@3Cy#aHTJ^~8p(>7WH4Fcs;2HQXJ8uZ~b2sI7!9)q!)Da|4wg;N97t>(APhs7$Gk8f^P~D)D)4KnUHYbiiPw zH+LUOV3r$z3s)L0m=VKu2r$jCpxTsx330=-pM5QJfn@^+uP|Ut^ak@q8vv%TiW^QH zX5!n*xo=DT4KKO=mohhGy#b}+=*_p_%Pva8>C=vTrZf;l3?jE`P^x2-jvseNZkY=P zXl7!d5E{wkY9`zTC1APAn-mwu)S^Zp3Yb8FxR4!&ATBs|3@*r<5!h~ls}8an!Cagh zB@o}JH&Aa=3u~Y>Y7U>ld_>eJ_C^aOxP;2Co>uczPmpZi?6LD0&6IX7T7AN!(L+LW|x2E?$C8&16PD?hr1 z8y>p<0h9*VjJnckPfCL=m1?R(-3Fz>jY2@V5E5C8h{5L!|KL6Mp&vj1nGbSY-w|Rm zHW9Fx_9I{TfMUUP`!a$Drw6WM=qu>u4^bTiPlW0K8E^`)?uFP&e6&K$G4(fa5$f*1 zUI+rJS3HAic%=RsvIQ5GLtO2Z8`G(4&G=0RwP?7zhc< zv4KJmgX}Ji-T+*HT}|LbxM$#o8Jm)gQ(A9R3SV?%Q#x_`_3z2tAe$1XE#PJ%^dl!e zLUm;(1LMSOnHZ!xU>gBs)hdv8L=5MwXDzg(g;>_O%F%0|oykCPeL;woz}b%7d~`Y14Q667zINYHK*F#9tvr=foiYd2Ilt-nnUOfv=pKe z=dq`CC8*hDpNWBZRL~;i&)mR+wQpaV-mor#10aFS4PXNAxZZyvf*^Xcq6eiY15iN( zGyqb7pu!D4%PN~>04~&yh8Q^HLZITn4Yr=rSZ_G;Alz{J=+V5^-a@_Mp4-3d&9d*y z?jPJh1TQoOC9FC?Ctyko*+Xv7Ks6#2y@6(c-R5cVxn|T@@JIw)wnMnVmr9k!(69oO z(D1=~UwU(F?|a3q#6=JA0TKaK5f;Jd!3W63Z7_*Tb#OE;3WR^i6K>!JkUzMAS!xs_ zN^7~nCYzYQL?vq<+_2K7w1yj~SqhyS4gg&ACLSOOtlQ4TT|qqup_XubCmeA#6&`I;^YohI{_{mw)ptH=s9s@H^iurGY`6 z;5+RB6Twib8{D9(htfa<#pad9>P5IFt;Nf*Pr4`&DcEoi-3CKi&1}cnfN{uhN)=huO zPnD>4AE$JH@S`_%|4LvLHvpTw<}8&!_ZZ+J;y^X#hV$puLv4tGo~r;BxKpQ=5^?~4 z0JL>_Lt0NMxM88*aN_Rg-ah39v-$YSdh$ZkzotFdPSm+pb@M)y2Ivvg6F0cdfYPAD z3xFUOni4~>!o!DNwq|4KE-Qos?p#+EAsZB>i3n-1sgRf2dT`^CvozHZGjlqy&W5a4 zaf21Rf*UvsilPwiP^E^!rZnb;b>tA-z_s*L?ccYix2#KG|4U#MHvooU1&9GQg5z{a zqYn#4@hgx8k^rI51A71=JPn`_fpb@IgBj~b+)(`u%{V2w9Ad4#h1_t{eb0N*EH|)# z(kC8z*bGWOQV8|~No7!?t~t;ckscAGAYuUfLTQjS336+k&)AVf459>^xDlHSXSP4& z-^lj;Yi`9iPJPt(M`}{O5FFNju8XV-Hx#8|F!}Klbq=$VxPiNc;329p3MuGMoTrGM zhq7et+fX?u)#cRL_lzD;cTFjP8+~70c*5D5ur2a3PuY| zX)T!trQr(~NM|ZTRvIu^;bWjZqJhvGB4Q*V)xj2xvQ@}!BXZ;j72|T4xwwRS{U~Cl zI@mYbDmNr&gC&+}Yvr>)!hLELdIQ`LdV`Z+;s%{x3)u-bGjkV1lVi;_rX$eGm+#7a3NW^SNGC?ety-MJ`= zTf7r)i1QSwHS@nzm7*xW+msFlbo5s4a|ukjfexwzppA6|5b0#I5di=ySq$7TLkKBp z%nfvdr9GIxLENxjZ)mt7`y1Bi4bOlZ^g+-;Z@A_fb2j|waeWt>g(_$Xtjbx)@=nB|{5R%9Ve5Zz7 zt0)epH#BA?gJdcXH;@@p0h+}PGd3mnMN180z*As6au7#S4wqIl)l%ASfd&sD&RfR~ z(i^%>X`drUZ{B{Fz#KQ&B6>D&*T3ch)B`)fgLe*X2QKIk3`s;V6CJq0)(r}?(%_3O z+)(`u%YD%eH*B9i{gyZUvupHC&>3# zRscuP14sfrfKDJn5W|!kz#O*O0KtG)^hZ4udZ6ST=?yW4b=Icz2cP{N=0$Jj28IL4 z5luyD9z!$X3DDEnAO)DiP`O%oET=D4Uc1t^A~${f?1f%#P#Ww@hs@=mhG`fUaV|>T zU?7>5s0H=n2GDg!{I*Skkli@IXE`8i7JU*osC5)lxZ$L6LyUcjk{-W^L)*r%a%pZ7 z%~WtAwB2|NYnzAAhfAHgI7YK!s2m8g76Xq%;7jw2I~# zGbC;x&g=$O$Y=~oazTfRphz5M%Th^n)d5`rV!%=+dSGxZWFQ(PB3M^7B>gck+Y#Kr zqJ7W+8&rd`54x)DTy0ctUGKoxn=cpwSuLOV=yVlzT13`${5f&lUs2Bm>5aK0Zt zByNy41Vi8sAvl-X@Gm=HjX!r#yYwHQst$e+$_zMKG0P34uj7WtFLKsuZcw8Kb{La` z*GrYNPnLFH^gaTH-jo9`fmv=~AV089R}#R)f-NQ(fWV#Aj!T2T!AW7*i7hC^Ii^t? zhH*-b-q83P&=|t*0(ee+(V;hFZn#I>K<_?$(dZ2nB)tLfrMoRa1bk^B=&4QIfIh+I zOO_UHVC_<42J9<7XOBTp;cRFONH_EzxQZn(_ei8>%P5>2rv}B#-AZ}=x!6%RbVpE$^!wqz- zGdJwm-@v$4&2QkF4Ig^v59b-t)Xek-|5BYOL3>hIbDW5}kNL5}oB_6D+__gR&?-Drh5}0xWFFY6sc4JDyZA=fF z&La>MK+tf56N3$eQE&r>&x5Orif-ZtEg@l6mVq059o9x~Si=ojZ+Lmwl!6;#04tzL zZ5X5kr->UfF&LyeH=sArcn3vs1A2p5-kBqf@_{2d^ae(+W@kgI9QZ_sP#q#-+2DpF zg&UaRjg1TiB6EW(gG|w2s0p_O;Av# zFnB5m9`?sfZvbiwH@J!v$OuL7t>!#PDYzlyepVxjme42-?qCr&$a4Zc@Wmmjfo+G& z0kWzR6*h9VFDqSyo){hgc#E7xU8J*UNpJ(>lt6hqH?5iBbiHbvlKC6pLWu%>g$l6G zn<$5phmFzAv2nf!PC=^J-*^J_R9)R~Mz4LBz`>Tlh#Ts7B)WoNBOt@e4n44;LX5dV zzUarW>H{obk)VwIB5v^2zo#~(S#FS7Y1ZEWB}}>DK0fTDxo?>puqjbdDhHvVH_)(o zy}`Kwpk%#00?yK@vH={95$}SmARY`#JV(h!3ErhJdXEnz;cL zfv!9dOos4FlgND%H}KO=^#(-2wK$#2L6*qm5;wRLId^V2*r?K5zaJzp;s)0n-~dpO zQSWZ(K8xNEte^l4I>^f_+8VAXH~HIbnPam%a+tC7cy zIp*~-iiWz?@u$l_{pi2yT#Z0wX!6HvtC*z15Z*4qqN_c*@k@ zfK4g%1}!$5xdB)dwvM@>tfWL!X(xNcfl$ai%MBykcMDR`0Fht_MJ(meZLFk(HYB}4 zs>3`tl&^K$iY3Sq{H2~&CI0(I+|V0>8>Tj;DL26D&hEA|ZrIua?#afTGeyyZ4MVOY z3Mikz?Tjs3oFYzsW3tnyp@*(F9AHT4P2VRHm~sPfL8qAxD9`~J(81@h;Re`&6wnf= zRDd1`fJ1Ntcmi%bq1-S#hV@Wz1LT9#7!we_Xt;qcKb51>vME_7*DI~AuHco%NDsm# z3m+hY%ndTXgdMe|_olUJlSqf6jGN?^nd)useUpe_LGazpag4=~`s0&0>1iqPEzPFrH| z9w%r6SOFJ}(g3oJ^@ci5iG?I~z7Fej?%NA8H)srNa0Ar^`=;CgfC_eL3EV)FWK#m^ z3>+OIsW;-_r-mCehBY`K6bMC{y|IEeTKnKp#wHmtoc=VPlixh`aZnys;DYdhxPc0L zimiIcrHvT;qYms%sdMn=EPjGWsNR$tD52qoVXZy0Q<>f%ZlK9ltOqZ<>`VeB1T|PB zKNG~s&6*u#q&_@V-KKOP@uW9;|43lW4K^G`1C`|U6fSvMhJu0&z>^_Z)fhk_V1bUW z+aSyWF>r&vrde2`;RgSBLwxpTC;o<6z2W)64dIIxHvp^+HwaQeRRuC&U76tqM@F#E z3?|2p=ecjO0;>=|YX)MAoSsu~t>9$Gpad%fH&8ve6ygQtkt`bmB?Z)0-N0>bM!|3Y zL)AEoU&#zJKq^RIcSWsJAq*x9y+OBA_wZ7D?Z#{_-Kot;)L+K6RD)wh5#x_h&F;eET;`pdJso6J_aWS@>V8;FZA*c-w4BoxZ5>#(-I=ruMau9$;q8!6<+qR|_= zP3gd5N^ki7kidu=ioXG0^f@R2OaO%F!m^wYxD+@5Ht-XNz!bwN2UbYdB!H;l2Gbdg z7c5{kndOG$Z?G@lG-Ft&bKhodN+Vyi^aeZxtkDfOfT4gsje#KmL^uHSv>}DD2LVGwHpaj1320fto2*J4)SHUh6+yDWX^!*0d zEjfRl49*QEPntucs6V#>2hqR{b?zJGG~8hHUIQgVC~LR@Aw=`JZR3xE#v@^o;09`< zr)qz^A-xq{0tZt9BW|c;SV0bO27p3)07V6o0R;RCTyO|9nFXm*0{KM=v4>Z{E(nI4 zIdJ+cH>CLuGu*Id%?vO$)?xj=sZA+!0}TTksT0J2iqH~6r3YLKi5slJ1lj=baTb&l zODZ)khbcXf5?Y10K{KM=ptNP&uw~o;>mWg{g2WLk7g7or#r7lV^Q-F&u!98@J;=Zq z&cFSDtO0tYZ+gQTZb)NTp`0CXLuHiuHy#O#1UFFi&J70>O?s>MlLRt1I0|{6vcB{H z5efuI1zy!O%K%1kNd74wh!|i6BD?1XUr(vg8!|V5tFqN=oDvE|aKm#}aRX*0U{veM z0%UZzjT^GY5b^p6whDqY*xJllG>H>2D@|PvK>(pK1SoafzgOp$? zc#Eq5*1-*2j()pDPi2rel)%kk!$5?2i5np8hn%D=;)bL*I5(U@Z=f7XrhEljsz7~m z2!VJc9tn$(U-cI^beqzCf{EUi11N#a4e~c=Y7{R!m;m6==?94D=7R>ZED_-+G5{k$ z3VCKXxWRlChG1>rbbbP0n>D(V-f(1UQ(DLk@1Jr5QykuX`|HFF)EE?_A5P~QOq4-} zy&{Dw%7+s)#i3YWG!dEh0OC`#5+hk7XZ^3Nh2FQT=NKQyo z+#oX%;x_2@`(aAM_BQ$ffe4l*bPI6<3Iz8FmqXDT+(AuMDVB2bI3i)PBOlm5qA@7J4J^|QHvobl z7Zm~%v6lrm6bnq!8|eH3nzU0Ws69uV3yeY}n3Yzk4g(W3?&zvC$kPBTh#OEK0C6y# z%W+ZIOH{!gE(ieDogjk(`UCXfq-I|>C2`6PFb7-94aug29O&$?;f9gBVI&Mh5>>NE z=Z1X-4ZS%BTmq}O0sN5<`Itrc&@1oRr}x^ac)d${KFKo)2^{ z;f5HeG^;n9KeK(l`Cc@rZQBZN04r%2O#w{d1{v#H%hK?z=HiYHh7bZ$NLC#*TB%VT zLSrbJgcAev-C}r>5rgXuj8K9b0D6EJxj+e^IsJXa%H>SrPRNM6(1QPg8_*I|e@>CD z383c&aC%|8VVu%Q(z%4O-B@o}&kf|yA>`l@RjurU8@f&DfMZH;{{E1_h#Ts>XwU#M zP{&`k3QX+*1i%6rI0UR94+tQ0L&SCZyxwr3j8kg3A&pZqn-Z+BP;bcohI?kYLGEa# zIMC4sS|K{H3}BsiIXI*OrmzT2H5{yX$|0V0+Gdue6(4{LR#3!EN&a~X|CmqllZ=%H zz#U=$-=#DF?gZ)?LbvOlvoHKaP-YpF4EH?%^wf=WsU9s2rGfHSaRUWjUcEuwz=O3v z-jLpkE`ft7fe|;TaJr32vGc+G>Bx`C0=!#-LR+28~bxwX@P-<|Ow$KoUqTBu_O^6oMFtPzO#F zH=sbk9HfxGh8y@*4fnQKb10w0HQYe{6ukYzExBg1NF_1e4(jclvX+UX{#JQYw0_O#B!&&MkX9G6? zV!+bHj^C(K*p$?eDK{9^dqXyI1DDQ0&9D3VbogKR61pOD*BcHdl=N2bGYL$&Au|GR zI>1G*6wKk>7Z!jFq!Z^SD8W0sppgX*=edDppNH@mJTt2|G~6JU1Gu_ooYIUh8nB*n z1MqDwhr92E9_VhODkE7dH>f4-g{pMJLv^6d(w!s%q+l?4(ddDTa*4O!a07b7Fkp%A z*gbfZW-vAhy&>p9Gu^nL7PY2)7`0Uzs*i`OOqB*rhlb=3J->3pX1O6+p&P^P)SXj9 zs5=s1v;dkD<>X-l6sWLntv$&?4@L4fh#UIcw*!SEy|MdG0wZoPJBfYq4f6)xO&czM zMy%k*l&VkwhC&$7gGEc(fFL0&-QIb<0pzk^2nJCAN`M=1n#L*lN8iTZZ`jBUVN;?z z9`mB#gQtN{MmIJkfSZk34&nxC45U&IS^~n#&_o+Z&l@lY?jsB8T{Q>8LQd4VoGxWT zt_xfp(8J)7<|7S9j+{Pv6vYSCL58qLPJBed5;4HQ&=1&6;Bo{siHf&_(h!~oZVxpl zo4nARi#f?~-1G)h@u&&EatYd{woovIb7PzvO#4%vX+m%VIcK?H>~9z^s1&vI2vz7d zrTqsGy+sFB0u48SRA38xK#!Ll6cPk=QiJAb8)YaNBCI*xS5EitiJC8&p z2x9_*af3DlVY0A8U)G!txBcKf_u=%09*p;1bE`%u(Tq?0=L!}3A zZ`x&Q80JOO9GhsGynqNAt)ivfHo?y@JsPG0BE5!fTeV@ zvrS2QL*Pv2hKau+=?zDU-muUY&HRR}H=MZtW#5ENNqU3a0CGeZvl63~sz(~kg%|+H zP#uC5oEWS<;4e*r%HT;_Qi&iTq#LFpojerFSTy5;5^vZUC%B+TY@v<a*uCB`!wn2z4Vw~XB__d1br2lW7#b$k0bDay za4;1ykcak|JKpCIND3Jv6)*Vdf5=03-lb=2riScjHox-|ji+#3D~N$~7j8RlHMqfU z!}d0mAf*Aa38jHzxjWps!VM?K{suJ%$H^QwPzY`3E>eDBhDL2jZOaX(w*DA+trIsO zKs{Ca;|=Mp=n^=X5*TrVubBZpfD*t6m_}TX2qw_Ib~JEvyMqG13fb7ppq-TlLsa=2 zoDzgL+Ec_5y~CPG!Um-KKOf0j0Nk-$-D@4QLFHKh8T2GO!1rc=y%)Roqa;+^&Xt#4(UK z>;Of@^b#6_B2#XlSOTy~1_t$v#wi_gv(k~n4DGojU-Vn={0>FoiGP>$OJ&#w))vl`)FrT9!&W%U17`$LTv;ArXx+) z7Yh9vC;JK+f@Ai8K80Yvll{jB43zG@xIx#YdVHW_GdK7h5DB6oe;~3)5QwpYxPdmqiV_Fq5D*hA3K`HnClFyHk#Z@@#9Ay#M!Td? zf)JTIK_2!bkl(CH$4s*!1KAX!CeA3foH`jOUo1jI1Wq*=jEi<*^jp%bpha)+9_lMUdlaP%+M>WXgvUFg>wnP7Z|MP)2|-DuUSaL58g^;8!9OV~ zZjg@R++gz?_=!BGG{`vUbKgjzaMTf+Nt{6S$mvbrq7~GE=D?L!_@j^VlawT~)h5_q zs>CT&L)_5yh69c)z4=$W1V-FY#y3_%@II}3=n`cxB;x2vO=VQBmfAV+c7(! zHe8%=!;Z%(toYK^ihOq}LAq?T;I%1H6 zA;jg8z-W*(I{wfMN5}%?B?B49A~h1`%4D#!O2Cq1U;X45bAJQ9`m|=oSHJPT4~rY} z)aXzhf*x2GkL|?kZf7_Y$V<0c7zpaoF!j>`JE0*d1e#D0xgCb&;68{>F}WYuqZ)Vy zW5wA(!ITf$dMM;zzHI+IHPu4{K<(fVQgBJuir8Pf8h=PH+~Bh-OdD|D1{N*Og)q1u zT*Y!*eQa}XFfJs}SZkzgO0GA+OnwW?O0@P1{)VkZ{)TQ-ig&C>x&*F93CwYW;g~^3 z>0BCyy0=i@NuUs1VLFy~thjCKu%@q6d$d=YUJ&`Ct#) z`Vb>>Sx)kMuoJ0{ZM6`ZKpn&lAU+$$r9p3i8+@4%ub$P=tNj?4fVyA;U0NIjQ9gMEanEGpTQTX!r53jF#L?>zAYZZ8lOV2HM&^@XskD!_||WD1V=QbXT4z+ zH!zZw6;f?2JpUM6bjqoya5CtDh~udvao!C&K+zHy(!;r;3ILkEKc#V)MHq2PLLvn6 zSU7(kqYy~V24v$W5ZNftcwc-TQe;$uxPiNZt}x{WbUHFv-3vFE!+{eAZg6k87h>a- zXflLRB0g|SDXIo}qZLG`J30BO+msFJZ3H*^8%0E!LVpy8U< z5ihI&fPfz2hOyqTgKH_?v`#AR5jS{stb8O# z%ookwg6AxMy}{ItBc^nS`M9FEfjb8+ArJy7_Q!sTF|1aHRopOZ~H!w zz?d7fezReRp+^NkgOU{Z8DyApgZO~n=MXV&D2r0ltrRhEE(KmLo6-z7e9JfeJy@Yx zZf|N+%G~gwcm6QA4;oU%W}~{)92_KIGoc#}f&;RoCz-TSq@$32n71jB0q_M+2X!HR zq}s0T8<7+mg@HR_fehjXsz-seh*0&0%nkmnIwyaw&WTvAxVkY1x2rfUs!gd*bO^Rc zdPBDM9=$=_K#yAl79CTJ zSFNXZ30zeY7;!_H`&JD~Nqfj304jk1qzES)KG2~E!?>Y-EiK@V$ei9V*pxPoVQp+m z4L6+l#&7&AQ=K<*gY<^X4L}E-oY}C`qzueZ~ z2JR?&10DzXz$wA}4kS`B0uc^Lrv!D8__Fc}y@3U~H>}Z}xxvOMjrE56uDRxMxIs%Qp+MN;8EHwS zm=`_e2B^%qVO6NV&?Hb2h?K)w3_-6Swh)q%fpUyxIK}pur0f*n6%-~vlpuo-J_&tu zluNs$5-Zfp)#}W$f(T;74Nw={K<9m)8<<%=aD$NevC)gZuL#C--H(I(ih z1lpz3wdarqQn>sLJXr0s){nacx&*Es31n^n6L`(NLkZ@1WED4Dz@}96hN2?O(Sv4F zRd6eR4gUOF3Ag}GzUJ1Ghi>z2uqmzK21c)HW1+oaUi6u54&U;Ie+DVAo!~!67u4a0ffp;BxkD9~rDNH#n%H(!fl{4Zid@B@n1U4NX0` zcO_(EAWnX9L$@hiJ+FVSX_vrC31n{I?XKKVOb)B`2JiwKiL4j18iNwS3UHO(1W9M{q*$d({Luedxu~XMpL{g977Vn+O{ch!>k-t#<-z=78Hii)n&Gl zMJU7iT5cHXF{*-h8FC?+8@L=#RktaveCPTPT>@8w1ZKEFx)EhE4OnuRZ#0}^Qwxwk=rbCq`ODdh*DK}K?G+Z{GaAS+80)tuvND?CT zAI%gaxUc8h-%Lp}b(m)ch5^8+=CXRBtdC-L2lR zb^Lv(4v8DKYz*s}Gg)tV0o=e`wpH99rGb6;8~8qGU2bpJ++g_b!TR`ht7+wj`Seky zS!)tGHXD?R-T*)cH=wo1gyq~|OR-jN82kj>W8Fx&f&M<{a>EEl3m(SR%S=Q(c)=oM z@7%EHo$Hyp1g-`NOt~Rm`0=YB$?B~x;0Cju%-NJ2=m4%2Hl-swu_+lh$QS(sN6$eD zY|j@r$OXMbZxA;K9D&6#8eY*O6pE}s)N410oDcIP6zkLj(8dkv({Jbv$Ql!qxPexdY{ z6OTR$)L@;+=to=#hPT+bp$t-Ds8WnmS~rGu;)^!D0dByi6ncaCqTl+R9}zdOXIsJz zREUl^Z}3sJ;)ZfN z#SNSSH=tqI4I6VqQ>9u1|69r^e}WtOIHf)R*7pi_32c_Y8g3ZB`oj^p0AR{YZNBJ6 zW8g4x1BlU}E2ooqdAR|-A-KVO(XW5~-$fh9)8A%?vEqwnV=30M+@3GR+EjP-p-JKL zhN-Y-xM3iMsyFy>WA2Y6Yur#j;V{b$fWKS?B7bfq(=W_3kv*3oS?V z)EC{@l)evcxaXeVh^f&Vr@uiD!*Y8*{QvSI{?gKXmfSdV9v9?dx1Cdh_VuQedj{+J z5_p*#ioYTBhWc61daBu!U<-%=deDRv4hu8P-MpxW2qwx2Zs>Z$o`36m1-k?`OJK?k zyzC3O!B+lf7Vt`LaJE><4PW>|(Hkz28!(<%n^O22o&z_q;at^HtW$S1#w<3*DaBAF zO@G6#LXF4hoR2QQqL51m)+a=oaJWQGIgk;Fn-n3qfdZvBFeC|6l1+`4FFLrPe!@ZL zaw6Qob;)Mj;M21+H#F=}YEk~g^)1r5Ve{M8b94z@JrbC5LtsusMiAhp3xlV}FYcZj z9(xSv-jOeQUT-jNI4gg{yT9iTL<;W@Zout~vtc1Ou-qQpK*u@b^*DY7xS_e=7>Yw< z@EcP2z?qx`J9J|o$PUB74cK;s_>cr~^Edb>qahEwf0o}0f*ZIhIcYurz3Q1^y?Y?hd~0Y{K=gIkI+H=yXTR1!Jk)^Z~;T`>n@o*PE3XetzCSR}Zi+mtrE zbN%NofvZ6RQ*H><)_V{RF}5 zz^5;%kWk)e*6diPbmyVZ+OG~ zKMyzHa*$1FJvT6nl?z~o!nEStP{3N<`M_@L%NHCMR2IO@2Pqzz6-mFe(P;)x86)xZ zPDF~>BDev4&6eAn^EVhb)TLPCbRznM0}Rn}!>Fp`3XLC-h8w!xaFrlHuV$CPyaZNp z!}z_=C}O4y0!a(Gp`uHHN}Qj3@CU>;o6;t3kkTMxnA()k7|a*F^_fq9=%YXW?!pZx zL=j*2b-&9L2d&ht>2I@B9Q5_K;08?d5SQ1uR5y{q6v1oL=KoGhn9r9kkutP4r8RfN zGzJ291?HmuwroaPZZG@|Xhm>?#$t_b>En;XC8%;_z#9R|r;w^NHgf5rQ4XhMUv%e& z`4_IIb_rZ15}4%%!2rT!#0_&}SXobrF{NzG zI#_R05;vUN+JYN?===Z0NN?Z(pGFL0J$mykv)mwG^gC{Ox%38x>(Fr?Dt$?@;D+_3 ztjH!Y5Bov@>2?g!xLaHai_jWw&~kg2it5RBD!wCN-MGP*+e^f-)}~a8(BFm|x=raS zL4aP(E`fOoY~+T3oj?M?6>D^F&>Mmq#0uUI2D^ZwL2uX&hPNI4mn}B{ zcEJtuJ;bU?jXN4{&{v}w*dqtJHPZU?-q;q~`Q0;aqv^26jUhsn z!D!=#@p60k9#$>4$60U#$^_yf8|P+j7`)@w;#?i#`N|rnWFvqnL{HWH6W3F_1iA#S z1_?~LVf4b!9RyPClp8n^cmavdo;wFt&)AfX96oi#)?p33L8?PzQxZ3P{#QO#xZ(5` zlcgW{8-FTpc&+}h*DzKatu*8wwo47b2 z_I|pFCI?+%vUkH#b5o2hJjrQ8ODeU??TH(h-+RJvZq44cn(rXKuLnu0IngyeGKfEw6vCjZ>N%subMN3}Xc!ng3-q_26}`wO7&{ zJq(Od=)yADxfY15+VpGWvD`J(Q|d+Suiq8_TkZsZ0-nna^Tnz#i$MUf+#ZH9Kp(vU zZqRaj_#~nnPJ|m!7nt8bPA$`&=%Log{#q?k7^*?6;f8Kg+VJM}pSuM1wgjf!P#~zj z_W?dN!CamM4tK;2oZ=|sdc)bXt=@3h*I{+NA#=m5FIswoal>bS2Ve9#*Bk!Y?f+J! zP{t{7@GW=#TAt#Nhbpb%2E4LD!6_Dc!!P&Fs6(Q0`3yUwhnW!fp+@ozBR?Jo=Y}(y z8f}Z{Rc^4U(WmSq)#uOGsnMo87&mZ=G}IQ`+0Fe6L-X zz#<7uxq&xbXj8GL{VTj8)oel zZu#H13@(Ql#v1PEDL4Gg;rlc-8uSF_9AsCZb7|0J{xibh8CqzuxVbHbA)JAM{#Z6+ z;D(h;D%m_nGzm?j#x6vBOb;V|7&SXpD!4&5rLH$DdjEQ+E`hx&fmPhlAPu&W1#wp$Ky#FX}C}UW4z%bTWRcXyoC9TvAH{hbc z{KChQRo6-7o3>o$!-gJ`tVlLm_}W+`w>Ey6`9sfPM^Ph52mR44WEF zVI^=&IE##sD5ngB?;pH|GSz-9?7=LRN1 zD>$l{6=c8=vt04X5FT>z?^n zGu-gDZ+PRzp-OT`QyXyu5Giv!#BgP~p`nJ!)e|ucxbF9)C=Jfr;szi)xB=Ax#3#t6 z1UI0#K|JMt)?!KjhBqC?<3j#j1l$#DT!M2uH*9|MdX6rEy)A)RZfHOw4iypB13~6* z$gGg*fxhO18-OFWd2Tp-=+t2bDcLwB`5PdHS#FR`i2?ly{MrY9PQ<`|@HcR9 z-yQ$eMsAQh8g9V3f!;tbThOU)yH#2-Z}*T`DKCDsoW2zS)eQWNJSlAyRR(9HUS1;YM)7%Bj&l@uU`D{st^U=oaV=(8Hx{NDqeKsp>YRz5U|% z+I0zRkie811U2ABL;^!FELl1LWGla2Xt_Z=A%+;Z!7#8uoOi?lB8(HQ-Z1e+Z{!9j z;ry9xzTZIPQ$O*Ed2V>^D?f{mfr~K@4&TEXceK9n!%E$Bd#PUr!}nJ?Pr zR}Xb*YN8W;&nm9A5y(xk31{UK6EKy@_@ByrYO=+GRnBW#41Wn_VOmFzuyZ?T0!%Yz*^7L!}{i>l# z_^9!QV^E4I4qA;Bd;~oW7n_Qwj=X+~3^_tvo5{&bh+iWmM?6c}nGq?4^iv@QZp<_& zG4=yDY;9rvr#p`(H29*+^tUtcM=pxH%MCM!K|3`%Rj83kKEKaz*!-^b99;relLVG? zgLM!s7<};uY#F#=Y)ukRFt!D52&lA(qa@|fL%l?9z~7KxC@w)Gq z%YiXV@B|mmD`zy^&@ za%i|gssqjj4P(X2!AF6>$61vpqxBOMAE^$bYYbSN?@HV%Mfi!6fN4#CL(r?ZK@E(v zxVumS+yIO4frm;A_BWA3V;>w{93zytq1%*JzHR-7E`h5@0<+v;2vfIs|EJtQ_rHu& znq!DH+<;Ac%ne~vI^yG$Hrtfo2HXq~1HNdu;T>=KTyVozM@*4hU;IzugK$UBa)ZoD za!11rbhN=%A@h{nMu>g64-z+wfjI8NrU*3x&Cj1Z&ke{^qop@!7%R6;4WuyLY3?p5 zreXMMgNYjwHMFuARfSW;4P1z)s*h8;dO)Dpv`b({0#j}PDbyM{#b~tdu=#qmfXHr}pI7!@~>2Jsy#77&zxYSI4BWDzY-oRP#2WBPiDb!Nv zVWH=M4>ZoVCG2Wh7mQa zC5MI^x=m@(``0sd3G7t~EawJ!qJbr_2S~vtv5Xrsz8R!({K4bL`B>-sUU6$(Gh+ic z@HNos2SHhW6@LR8<5>^A`kx0kjOI5e^;KW2DBoZ{#K_ra2ZGkZorbJ>2EMU1C)Hrp8jv_PhiZas!l6 z^ai&P0VDKE*K>n9rVYAL4)_B0?pkkXxPebNkn*3t@Iny5jKAUO*Z#Z49UY^U!mJcC z;BZIda=^4=R+k|xp#<_Q$u<-^8*{xu>@fL#soqeBv8E{w!40SmaD#vSO;a4K(&7dP zgNE}Jpu`Q8r|j>zKI48w!wuc0wCCUbUcoMbbrP842J79g3XTq6nB@i**NZ@0Yxa!M zgpzT2USLJL2cGtflXD-7KIMzB=5b2RBCN62-Z|!PZJ!l4-0<9gw~ib5?cSGsyWG)O zjl>h00XO9aT;bvdoas&Nuh?P5V=PPKYcA#nN&w$Aj1^YU;z;g`HnS4kAcwP;r+aOB z19S*Cke`V3hFX*Ix2;WjOd4+B!CLp+_20S#x&-#N1XgpyJVQ7*%yUB!gCdn1Mm=fp z2b6&uz~t&|xb5VjWK%lw;QDb&gWllWfG?VqFTL(R1UI}qVmY#E23*4p3{_&~jF=sr zpm5ZTl>UT7p@a&`sr+Tc09r&TcBhw3U2D~^05=%g>T?v9#9OTk0}l`#PkN|2Dzh|FU`$6cP@Y7r`#K|K@S)NX*;2ig8opsfg3oe z*Ym$*?sMOE`ug?!T>^Vn0=wV_fD7NldTzj`RJfsHtNy|bjEfDt^g~Hh2%#Sl$)OnhN;mA zmFEt`4YN}mG>jEz5qAiz_p_})>2w&B;08@jadyb`Fs{t_y1@@5V1~GX>?3FefXH|a-RMsZkQRy`nWYvQyfljX^MjlRmve%$1>;31~;IZ=&4%%6!x550$l=o zO#*Y=z$>pUzxpLEaNvNR<$7+=H;Ef=pl?cFoS6ofksJQbdww-@!&CA>j{o%+{SbVB zFPbfXJDRFUZ-}8v%#N1J0gIV8*x)$9;u91dU7~OUjt2}m%>`%fOPjnBaDxqFP1D~fg4?4h4mhiQio+Mi)L=B>b!jihad3n5hCWVduf6KMK3xJklE7+i zXkUMgVHHa8n>iX{Y3{Mt0fQ36;r1A^j}Q;=VPZtf4GTW{mKRgP`OE^{cp9WPyzgzl zktyI%KFIN}ebL{aU68fm22=;gg9TZAH0Q~RhNa=&9#KU!EDmQ=^s59Bag{b(W+}}m zAw1GKJ2hAkI0LZe9&j^aHCAy0ngJ<3jJ2$4qVg!0+oLHCWWbeeLzRpUYN*xVSj0p5 z#HCUOH*~#WM{i)y+$FF#B{0VgK*dV@sc`1p;2-`R^FlcqxWP>zewKlrbHmv?zUoCI zySrR0g7p zcoWf~?@Rtk+=MaB7Kt9Qb6sO_dLTXu%eVp52H(-|#0_Z}t4)nIZt!)JtSU8ddo;xX zd>8HqEr<_9331D@xnUyYET%?wZrGb|c&}BL!0sflf*UGWO#TK&2_JwLg7!+$9z-g7 z!+?;6L7)hD0ynTeMIFN$16U7lT!eLo8%}S%>)ZZerhwnUx&gXFc0u-`VewPWmJ-DTCBFpdzY-l6B57NqrLW)y`*Cxy)9X+r zXaKC2%Yg`bgSY_|;r#h?RuvDN!tLRVgVr*WKe#H_j+{+>_7r7H&hZ3R%lO} zCO2>x2*pU2Sym89(7yyX1Z3)#3jP2ez?MZ(j}3Z5`gp_I1-dgg)DME5g(Ti^*Y9UK zSm}!<)2m)EU{9jX)~Sx>y~cDWod$QTqR;2t6SG<~Ec1bKM#T^{B1hF2scmF80S zD@t{6e{=|*6UmnEkHu&18`WktRzBj!a8>Yn&>QOXHw|MoaIb;e!*%4imZ#bj1*Z@b z!i5WPLm^AA0erxaWX__1uqkz4^bX#?p0!J0uS#IT4KpBP&{LBGq5zi64a60c7~CM# zaiB9q14hUOCeJRkw_b0MK`HzV{?Rw%hHv}&|21>NN?$aYp7X5#D|18Ra)20u8!#)u z4dHSq%`iYG1mf4oh#@4R`qMOXq{LYfsXuW!7un#BR-wMPl9vRmO5n8(V}0~d>_|(7 zvFbK!7%OK9?nM&PUWkhur~vm8!k~OrMw#(mcfDb+zU;kTT>?9hK+6qt9Z<)Cf=0q9 zfTH1sN)6>N7y?#QDB~}H=7{ElB*EvjK=+_GtmlS2@y+xG{~##baMx@9D09R2<%4OQ zSq@W|gN7=x4{pG$gn3KffWs_9>jlUemYbC3un0^jUk~E+Cc@#&R$UGfdhDYzwbc2) z2;!c|9gR&1odE2PDGs_%`Fs$cTgwHt2EKaL-ip`;7BAuqHya^PWM`w1N!5~z)fu4Tm2Dzh2@nNi6;5>DUAk9vzu|fcx&b`!7 z*7N?oAPy-IzG2U={KVd`Ro2YtHl@A#viEv*3G6@ui@Cv!O2Q{1^byTNSsl^hhBzeR z++cQWL870_&H~Ue=7#V^A7K&J@I~iI(Hg)y<_7 zZon5Eqm`fpDkO#oVnA>B!B@RXW~C2(i0}NA#?XKUl3ys!gc~puNy9Mcw-WGKY?Bj?WN${Q zEzMrBlgO`c#9_dKExO*YgO{&o?Go6-5?II$f{x$@@MOvjnIQlZP=d1t&?DxDST$C0 zgKSEtj~)e+GdJj?ZzFD~i?G5CFS_yn$rSL^d@zka>$*Q_Tn-#&ZU}nNNLIcz0Z`K5 zQDbVulxQuhDMN#mI+vdFL|oZjO65%Z>4JUlVxAkY)74AN{(qc*w!$xk`-DR?k~Q>(;09C&7SCX!1KfZSMNlX>R;!wLB(6!%d75k?tWh3!)EGB7DC-8) zy)lPs#ksSAvjA?mfi6FMfIFJD6mIa@(WIjXkgYi#C4-!<{n^ZDBCbQ&mC0$h-&YeM zE-v9J1nCWw&r{Xc%vk&m_KaNudr<-{H^hLX1QwAdPy!9it}wAFWqJs}8352?<-$| z$wq;saCu~c#sF227~CL#0}s|-eBOJVx&*oemPudPlEPZho4X#V0GW+nNe;f9exNsB3+wU562!~gPBCI;f0x#7jn``yN@6vWVQ zLztE5akDst+7o*sS0G5}W?53K?zyytyQU801-`*u;>AM`s^c z&xLTG@GRht#!KPGq6?f38Tgfr4`frKSOVvgZnw7T4V@d7y?Q-Ym%yHuz#?v7wH%+{ zAXowi00;C2Qxwj)HHm$W*Z`LN*_Z-60uVau_Ce4?eD2M+SWM}`BjJb+n-ZP|IUAbE z4Ytr8+_3eTU;C*~Hr%jsjqb?z^lSgD;RX(a9?%;?b$}Z%D^VMO5)8HWXAr$oaV|UM z2EQ2_Y)VvDU3)4I&<8iOCHxzEz zba`>Z$Q^y$-O(r4xuegWJCB9|mp}!S0PdqAI8Tf|gqJVw+|cJYEPL&Gt}cN+FM%c8 z5C|ZQQnzxR8|0L>#gs-pQI)`nAPftk4%{H6!E8!L^2E1=+;Hyn)=$6V(cN&voiF?- zxrROk)ernKkZ`d+~e6@+L_1Zpcxz+zYEiRA}y! zF{8+kWXh!l?7u75V>9GCzFf-NF&hEmvLcfu{fUXc&I z^M|!DPnqqJ6CYtZH1xpA8Sj4MKWf1LJ;o6Etv?oC)v4X$vwJDM9Ncl30q(yTk0;jM5(aYw@q5QMuK z+A7q>HQd01wTB=3UbQZPE`bdaSi%ipy3FjL5?BK|4a884NOgXL>kzU-OnbAG0}9z9 ztSn^b)})hs@$Jwd*26|)kRw|58`d#m1C1Hf1bVZdZu<4!uiurw0m8WZtG`Ds2QB~| z5nsg(@%vusLTZ`knW^`E;0_O=9;a6g$o7ec9{#q!akfzm z7Wtw%=k{0rz2#;lmVbh~ASl+)p#K~axsnl~@kDPZAU&!{;qsEk4YMIe+uN9r7(|3w zi7*WH-E#&e(syU;s0*9 zVe=SPo$yu9|08q-G=`~Jsc}c6H|!nN!Kh%w5AG9QtIBW!z-=xEW=Ge>x-&Oub~M?7 zU|dzaNFH-JxK@EfyD~&&hrzyO=Q%f+-oROUsun+lJ!6+Zm%yHrz%p(qm?3Te1dJPu z2`V>8V<>vV8OA*-C#R`T>3dr+kI5=_8A8h{>y5{oeq32vBk zMEjSb&z@x%D>}rBZ~iyC=M{h64(hh7zltE0L2_Ph$PkxQUX%2-_%Lbt~6+V!-GfhD=^8Kp+|57 zao7T4kU=TWh=v}R)9{!NU?u+}ANaLKY1kPzeCabU?8vOd7adqe{Gt0FpwkT$28>?e z2)6-q&S24Ta9&df&u=aVl!NSYKyLu|VG9zW0my@#Q4V*S6tM^=qB?~35c)&q2djZ| zgZUd|Q|i9xJ@uaV%5(|rR07Mm!JGv`7!ac@m{Gk8Re_Kr`pggT9wl9`Cs`IhLOj%&tg3%^4@p+qbWBm^*89uJ8phg zn3Wi-ng_F@IxtC()mYi&a$qmj0jD(I%gzS+fYd7xu{$ApFifst^@YKEARA`Zbap5~ z?r05FD%>z#ko9qH`9+%ncl@|92g_x6fCChyKE&uH67fL=H}GKX^jYlry9Bxf_KpM= zaf2_KAq;{W=tL&HA&paVw!q~{&M8odR50Oyv~n}p9=+kgqZpKIzQP&iD{P?+Ko9@q zq4$Uw;0A57DUpo~5QA~U>81!sS3_xg5B!9z+nu#8my$ra!3g z&JBC#-R?E%61WrzEZ~MbNXanCyb9)aE=HtAZ$LS4l$v0qe}|X>tk~^O-B}Dua0C8l zvlP)WWjM^XO?AfE05`n**n5K*h~Rd1gHmxsqdJiDp4a{16!v%EZ_vp{ZoFTkmGVRf z`5V|bdIPEhmL=!`)dAcD3ZEpe!>m_&C9shjzz4y+Km!wk z5kujIUIWgW+fB|nU&UX1F8d-B~*t!;*?I>gAvA5`krF`30qhx zedh;bk*2?i8@R8azq4Jrmrglyb7e#IoEt&)Uvh+<(PkvzB}#0@-HPx`~%E6^p- zC9rD=wA@gcAP|Q2xeHR@i1tBBSlTDtP)GvkNZ1l(7&pKfgCknjBwu0=Zoub^7aFBO zBUv@q0gp8FfcC(~WH&Jfb|iAb4eYTpUH8ntoN~igPm|WCe9=??;`J|l1cHV#E8_gjJun2X3o98nFc;xxKNj5J z+}@5>!naIL^6;xdVu<2~V0~Sc3{fBxJypAYDEoF;*0K$pO!NMHjuRE!hi02IK2FvN{Wf(rKQ3`$nU#M$8AdOO0> z-1r+bDhWLRl7J61bd?AxazVolHbSX>?oES~K5*=}X90i5{sv0*utsTcgA&e$b8LH%H$)LPe#IYAzfc{rWhuBJ(*xXq>Y!C*p$8wc zK^X;RbxsT4GNw zXt^0=O$vh&wk9(um6;9aa5ns%|Kd~s$rt^90qi;QBl%!Q@i)EnjahXtr*yR}i5?og zLG*y*0R@5~t$?N+4@KWf2p%$B8i{iwvg%CFAS2R150%fI5AqIf@HJV_ZgV5CCZRW& z>fp1ZslTZXD1ZzMINz!c`~*EfCp;*iKU7oP84hc1CGf!#?U zxWSOE8WO-8m>}#+N@tG^N$4?eUHmG#P({GR5)VOEl5N%RnU!z?#QdqCkBIUbx6z4<20 z6bUIQJs&C_>9diVXSh3Fyph4ke3S_x#f=+UkF-yMLvH}?o%zj?;Gc;e1|!?kaPcAx zPaDN0=t)zOsLI5dyY9NHbHnal$bMFrz#fqR+(0J}>_#V;;FJM^fCX@1Qn#fyYF~2 z{%34NMh|!2i)HEUFS|LoA={MXa**m^v*GSMY>tOx$6by#+P4G;abYVdjQZvGF8A3Cr+H`Hl;oChWBc83G7Y+;s#!A@M1u)0mKGwurZ1@dUYlk zjO3xK1+okl!4uZyW;!$-YqulG%`ig@vz`X5Nhl3$tigxUpwX+-Z$xLFczHh9Y5dMZ zzlR+Obs?(`90omP)j{-t-oOSu;CrBvKqvEt;Zzd>nC-HVKn!OM#fKx0=fi+v%bIdF z@h01FC{76D5==mft;;tK+%Pl)#uA_|*kIOU_NgCPibzCnVAv5p26$w2U#XA{Mn22q zLNi&_gtM43%|_6k2*3X7Fa9DfhuuAq{j4s5E`hxu0ojy5127~Y#!12;OHjih&?1xa zgc)ouZ9X>&A!0~!{`{d=zLLH;N`rme&HT?s3=6GE@-+Bz8aCyP4W9Vg|Ll*~VE!(B z(NW?X@B0MRl~Xz_OTi7RR0q)m48e)uBYksgf1v?UgbB2!NJ^GsX~SNJO7Z0Or<|Cx z5!Yt-3`Vf6M8>q>M=~o(bqKEmJYg;eUs#Eo3O7I@WRFXhi0063Z(~z}S8z~ghRECi zJ?QaL2PF2>2uemI=6I9X9Oj%$;&FOJ)}IyGBBK234|AEzbLO+I#(1(Vn{dI{5pP-fnQ0J2Pg0L~4D1i=lq?CJ15pCE|oA{hf- zQ3$649a0+ntDi;;8^pXjUP@~`|A^VNHN&q{z- z^}6eh9J&KQz)aM>`xVN97|5_fX|T`uRD{ad_ly4;;b@joy&WNEI7sMkHgd;u0>J{w? zp(Kr_|taR~oQmqcqTyMpux!F!evr zx)}yyVAbx={*GId@Ir5Y^7t>WR~i8Jr>v)rg}>f<%ja=CU?74U8hXfjgSes59{8r6 zvaN+jx#8#u2$6k6~<@;ZR&)RR6wJp}@fh3NvU zySHsF2bq=ZHm?r$o7u0-%S||sLXiRw8M=sk-B_%M+mMDB_UhMa50%*WdqV;~p~)vY z+7Rd6*U1s&5>EG1tq`B2seKd|hq;Ej;&6(u-=GZTrzpzX75OPPGUyV+S?QF>pEI|K z^`eod)L-dqN^4GxL!H8*Dj9oEA8H=?OT?6X-@@$UDLS39{FSu+BGa4P=8-Waz5UiB zB+%vMW#?`7E2c8-TQ5^LLtqp@Xsc_mfD$8pvV$Q8CTX3Fh8VIn$;YjpuAYW-wobEo=SDx6{15@eDkBZU2>e*&vK>AWn7mg=Zoji<;+E2FC8hC=sC4lx@RoA zoU_zxu8@+gUUcPIWYFcth3H~-RxY8&XX=xF(zVD#WN3w_4yDzLT9z8O{5q>Sx8_mF zwy&osf0J&%dIlBPKiC;#XzxvveJ6X4**1hZZj(RVn33`8QQt<#>U* z^iTnbL*;tvuW=BB`{InYDIPro8g3|M5j@#*@WscjL*$hDpQW~5aY)%78!((Sn zX?W}XzqT9rR#4EV&oGOyUlqBkCdU zXv<-wkf1}QO!u?+Tu$e1a;pYH$T9ETTR*`qOZcL(|3D9T3v{!gcj$vN>=9jISDL+c zPwW!t61bWq;Al}m$a?m){&(OnQ_AxaQ8lV>t^ni)UR?uUj zgU^xXbnmkmL)4HjRMW+m&?V4FVDl^0oG^39OE=mh|3UNiNUN}-j59DvkFKhTY_B`IsZ4L7*|ju=zOC$U`LWE zX_gpJ8dx4fD`YS#$utHVBeiwgOCMW^=anMJS6bBwC0M~W&4NxV zWMEeMq1XS`LSi7>_bt!5Fz464;`cSk=`K@UDpu1Li1nxSU%Lb@s|22uConD=k!aI2C4SmX@5~T?9Ewi@pol;QT?Eje5#p#0(*wFKnxgBAcG(V*^xK|T15{Gl={#+e>ldi7FNiER_oG9xEYwx z@T@QSi-j;ww&yI*x;*E7cRXs22cPjkGc@U;F)mG&hHPIVj%^C*;MosZ8@X4Znh2lB zP;Zi{gxvM(4}JW@s&gZKMfuZy;<(%$9F1Pj(Sg~A z7Y5GLC2hqdAF+bv8Hn&MV_8!N(2|B?k;(*|Roh~q25JEPK@8ztAR-3?rX(W45PZ?$ z6F+)9T+n4UgKG@#f3}Z8|Hg@5`0{7{+vONe&iC&q_rlEhrN8f+emaIN&C)}t4hTvQkwz>ua!r4pbT|#$(hHOoamn*C(lpDugH-;z_VW4k;d%o@T;Lm}+@c=zwXyPX+ z9OOci5JSk&q~~n(`02oCh-WLd9X#0^vQ~ZBvgOw-zk4boQdX518FGYpK8$l$rK=jT z&yhIyU`9fWP4ic!H`(%GJ;kwT?glAC%~np0!zRMvfN8VuT)y@s9;M}9yv$mxKbW)G z@+nK>@e-By%-^jNPk(lR`}W$p8KAzub z??pvuhyh9vJ;=uZNuW2NJ-{W#5Dz_E-3-HGt2i5WK@33sQy0ShPP2XKm;U*W-hW)$ z1CI4f4=4~p3`C~fpcEOGh@(Kzc$~e+Uw!Suv9pipWlhw5O?TJTh(Zw}2jd6R9=5j7 zAF(gtc#r~tGC>Z1q96qVt_z#YpabpwX|wUNO|S>8Z0Si}9ZjzcGD1oO?b9z;K3ZS? za^-mQrx9|@CQj=-Ei+Ech0LC)#M%5xjKUR({P`4JrOChQa*-{c)ntysBNCbO={hUt znPd|U_@39GUM32Ol={ma_?w?qz1_pUyzi?Y`}9k^FJ+`_^FpmSNbUDGYv< z5fhM)_qTKoKleGk{x(E)%Rbr0Pkv`+kf_qc@RQ#HyD>_ls4yjER*=RJN(00oZqPT~ zh>IaK7w^*_`e+%kx^16>-W@Rj_`6@Ddm~$1cin&ZuCIScqgpk?8{-nw+=2{(AtI%T z1U--wk(mNfeK_%)4`P18V)e!i7tl+^LnBqfG>GkO>n}X|Xl00p8Eu6J0v&?;jq;HC z9FN(PwJfA(cl6+{I;f1IS0%kW%c9Y)lpQ)$uS-An{eG1|hUryp9DqA1xanc3&&nui z!$E@e+9g``c+aJ0aG%EK&hRur|Fmji1l~?`eO}v!0DJ{Cn~{vACQ?+txW5` z=1@RmjafoDIE`-QEHQ`@8e$MPWal$+EK6t)Y#;f_5B%n-k2A;ZSKs&Z*YD7j6u|xj zas$_R+SC5>4X^nybKhVE(E~nr{16Pr5)G`U2h2*)LoftuG@&}tALllJ*NEG0LKS|E z*zu5De%u$nxU z{}iQI_h`4lpZMtuJbkU!rL0iu*PU`HzX`c!OPH;R5#V6Wb28-E-*Yd-e)r9^vM4s< z`CR?#XGcbhC}omr^vG;qUU0qb9%dnr$?wd9PcxQc6_`=2*Yh6CvQ(F5cxola>{x44#pg8`G!V+0_UKE{;znV$fS z@BQw#Vm}8MF|kNXXmkaQSe*`9jZsPVH8+OQZ*4tt;vWC z+@RWgm2Aq}W0El0K^BE0kwgen8J7?>C^8J0A7LOK8j*IIUL8InM&`0>~O&{tf4ai@Hc^IwLw_HuEn;$QdT z?H_#6Eo`ROTX~7WwViK-~JFlMt{W2obOtnt0CmRgv zV1=o!AXf0HZCfw_P6a4ItN>N~(g*$G7ZfwmD8V8>6vJ5o}dvq*v(oN1dYnQ^c*jFN12z^U&ddC1sp4^8yVd6pc()kBYddh_7Lp_%Pvy{Qi&f6D@Q2J#jLe0STw zYF<%30lhs=GtWrTIn0e=L6$Pb^S->OtN#>GSoO9~(hWVF1FHAp3kVef(m>1xK?#^Z z&=rCe!fF%|y8qhba~36NBodUsN*JyyY!kt?K>Ba|^dsMX_?c@Jv7{43~}f-HmMOrHs;%yVOp#|Z+f&mT6g);jQCRQ8NKnmA-?4|KELbZx10wQ8<$>hfBWitskhXX z?s$8rky+N+T_S~ZqAn4Ud`0R00W<|i9DM?V_%+gJBDHb5`|I)%_Cd<^$nnc|kyPY3 zBJQ1C5#cN7E==|ziil)EP2;*Fq&K%lIYZit#9>p8Ed%T|nGterp5&s(iRVg0;ynnT z-IJfg1nvdmN00GTmm1y%P(24j{MA8b-TI!b`D^fPZ)WKZE(D3;73Xx-g6fExXb?@K z(Fg=#+H#!7j?45f{Qxr1CQ1MRvvM${1V$Xe2bmJ!04WNv0+c`;?EzLmSAZ23E|j#M z65`j_M(oN&zU;a`d(%tbh{NtUx#nut>N76eT*2S><8c)t}$1i7W4VPHY!aEmHg&c{Bt$qb2zj%Z4E3~V) zKjhxwob)*h1DOCb50yC5wQVj$*K<{5JNl%Vx`a5>eF5o}e`H(8y;+N|--LA|bPs@D zh1wM#XaA0h@*G12)HgP=sf06b%e2Xnk_DysDw#&QA@w+LmuyQx_tdd^=!^@x%>?JM zC6Ch>!$)UKp4W8=pl*I0mdE|A65#LhMfMldE=UbjMVcW|NMJ|~+1kz1V3UV!(krR} zfCJ(;8~_&KUS`8yf_|X!IDlTzKt!^NkhO%*|H`Mrc4TDW8_Obz5+ILX{_&r2U18Dk zc{>96_v|S5WyyT)wSVz9UwVvL4q7J!No56MszU@N5Rq9)dV}u|K@TSn``&p%Rw?lW zRB_~n8(<3&hB$-!XS8w5me*#s8l5KYF)t}^n!Q2s!VK?&o)A5)yL{m4X*=$l)Dx|b zW4)X?I?->Qq1ml_!Q$0)V`>~-dPIG?+_NiV`>bf`*a<2fR z@18$=ei(lk3Hrg~#~BhDxF68Z2Nl?aEdeiJ8XUl8=8*gCo1Gw=h8s;eAjn{q)d=*L z;iynTRS{4lIOUOd|LwOw@Q?Z6^A~^drTP_Cq52iIDMcl0LGM?8)ac>P!-!AxptT02 z2drWU`5UUa8x(gG=9nc9@dpnCj|C40j|fAL zd0fyF=>qZqsUOF~L=VCUB`8H54EELh37D04%pZPx7cS$2e|d{i&EgfUFZmoF)!+8+ zU+eZ6kPRW?HGT4{c^n-=)MYFkNAE$_bc!4D)bi&`w$hYY5vxhfX@C7!OWZ3#NFB9N zADl;wl*{{|Eh)_~-7alcH%ZA`pb>!na+SXPfbZ6|<9(Dm#T#ls?=w;b^q3In4)U2c zVf`%J3lL`abTpZ&1%QBBQU$;$(Ez|Dg+NRI83YsLNJ9o3=4J9U6xCIPLfgahYjbM7ffQ?bY1<|pBW zUh>lSJXfs*3SK)~6v!^XU9r0&xcWx6um13`L>h!ERCl-D0`>vu^ug$d@v_)hZ~A2q zKddgi-YH%#8S#bhym!%^=M7blev0q+f5~(5_MOkUp6%^7+`tCtYs20E0tgTU4)i;P z6`;qdBlfLk|6H??0iW54FYUkwdBcm)I1+*wrhE{~A7w28O2C>V72)IW`XKA49(wgZ zf9A69E?h3QxI$xCS5@~bpZBNVd;1S?GY~zji$Gxrekp!1W9g#)?qtL~W=OaiZw3A4QhzKV3Vw#3*cp0?u zZeR_w?f7v%`T^^(@!FVX!>6a2IdSqNhO!s}E7zrY6g`B-!%G;n6p>6(g{AE6t#5Mu z8&)^;C4b@FSX~&bXzPXu;;>b4mg8@v;s2nPi9BNj)FELxHF=zy$Z3Hkabu&?8HP*I(yiY_Jkz8+0D`? zQR5u4X8Y{%oQ#QkGM;!`6OVsZ7hG98-+O;mzjxoQ_g=p@J+Hf8_2*4Z^{rdCZdHBi z*8SG^-uh#%sua1V!r4W2ykKlzU^gTE;P> zBw0gRr+e5c_jGI(z18)q6OMxK$|(rCqQBm zN>42dyC!+S+S7b28j#$qgSHmhZ_!-b=tuu&TpPzBXgRlCqm6&{xo*rRHG`>B$t zWBJBS|M4}a|L--&460)}t!#S?uM}<2=B_#Bmsh^_k3W3bTU2?e>J)BMU&(xfr1;ig1M zijLsmcB-myKC4T>>L!yzOV+8j@=Q7l)1<4wb?4~1E1vM)v&A#_fzGKr@Pd@Sg^;lUiakAxaQ_6OD z?Mr|7{%a@f>{5A^FbJa1yNw7(t1Nld;?kisbS?y58k&LaNm=h}!H$XJHn*9Z#b=Y1 z&1kb>wn#Rv=949eIV-nN^y@mLd#A7skwY3Tdl#)12+3L;UIu3|6=;^#l1*CG7Ir)~ ziD=w*)t)S-Yy%+xj7=+^pi(|n!pmy66o%><+B6n+N!O1OG|%ob|2)Pwpc!a$-ep_v zK&*S&$GRj{{bSdr7O0NXcBGDtNRP*_Da5DMqzaGS^_knR{*&|0T(*vctjg^)xwg}c zWsG05=9kx8{^z^5?@Sd!@*wl2u^k>AzfeYt3O$y{w74`&h85QCDrIS{4 zbYg_TQ(7R2^b+O)KbJg40gFs$wbWuohT%N)_^{G)G6dq_d1`LRHdcRW{&A7~Bv+&_ z=u6pYZ#h`lW_ikT1BzvR8`3Sw!{t_mtdeb3*kde^j%}`D(lj=ijkTR2O>t${l4qLI z5?G9{IxLuRXq`-RNW)snGf8tuBeOJ~%;J5nZ9|})4hAZXQMja+2P|2qxr#3ngmr~{ zLc>TLv=?bOo%Hy&fuijBUgW1kI4N?+&_*88>;1&>S5sQmulU|HKqq_U3{7JEPa?>|IbM1!5dP8Q#(5NJ8+TC9Ut>(zR{drVg`(9x;NKr_bhYMg3-Ds-zTywdj?-va8W_ilOX zbWywq!b5FQGZbkG(W5ZfTkzBcExT~ii9gC}xs^P*a<##zNn_vqhX1v9$ES5{BoZo5 zI^L;5NGH-pC%Xi&%K;Sy8iXE)b<$$m z6{JYAAZB5mEIzczgJ1i17XzD{OM)5$TG{}76&A3$L8x2?qyculsEya4dfaMrtLUxv zSBw_p9r zVG;&azpq%y!j*2@IcI)<;*Ku{#}`FHWk{t#N6S2f`#77_So)zs2QNLY3Y&QN*a}cO zZg(c=OfIg1O&e^orLIxEW2cIbV@x3%R>2ijMm(2VVnY6L=&{OBVoT|P9v388O$bzdby>W~^LV6tK!c0aYWqn@IJ(*CFl|^ca>YgaWF3l(JPAnjH*^ z*ISRaZeHoV3u$F*;pbJOR&vb93;%A{O>=6t(}B_b9&!>ItDxv`x|v81k_23X#c1rx zVOGP$BhwEn8D2iBr&*gbqFtC;GEfzXTpJ3n5HpEk7X!Pz)9D{B6Qd`v zO5emFwF2SRulQag(bnm#1e#1Wz{BY&?_pi)sm9P#hpH<~Ftlpb6)q2o*H@Y)KPC@K zY_*O072^F!UsX?oBK2*~_uM>Wj=>~grMD?{5~`QK?CI;b|J8lF{@ugxyGMuI?*-H) zhKhped>6H_qv&HDLK{pxbktMv@T&$3cQf7%gIv*({&*fMxEJ3M_uGwfCM+zv+9=dF7|HB5m8LumU#jwB>fZ;y7qSy!uHM zV&Q)2TosB&q(WLu5_H~a1ME6owSU$zV9i0M1krql%PiYqul-ehn>M7oV>{b+tTjpl z)JY(1&{sAUQ2me!gX$Jl5vndE4>Bd1RS3i5kNanKH22G&eE4109sXB2JJo(m6F;ol zkkUEzl)t^~lJ9NbGWXuMe)%KUfA*ig^QLgUupvIB9GVU_1m|l7-Hv+ivSEij6AvAA z7Y}8nL50JVBOA9ZdDTd}Fj2gf=`^5O7ReX_Z3%d3(cEg$TFMwJt1cBSZ9&mPEZ`Vg z>_WJIU3I$5K~)T-1V!ep?Ls0@Jzo@~e3Xe)M0xfCQgf6bA9b#_|y4K%#so^LoJd;8LtJoCEq zfB5z*|LV?Lzy8Tx|LXJa`gE>`KJPnXW82sXel?ZsT4G{c29*M_CZkaBY|@SYSFO@Di8?R75pt1-19F7O}M$ zWSv~WOoZ#RriXBaXfX|iFcjU(%0zXpw-l*b*Et()L1@I&;fo$61gc`7NISkZS6iao zLho_U+Mu&oUO|pQ;_%fcX6&Rk2&M`;sV!2~f>P?$CVHKT^*rmoRi*jlZGZIQ7p3;5^Eguvu$l!anxR>o;JvKw33a!y;gj zhJx`CAyDO<#pqCaOz(%)i-Z-DwES4OTGFf}+qipK?LJpI*ebNOLS!OQDnua?CJz;D zh;!pR5%j_+y?sw_^++YbR3V(CTej=u)kk);o0_yUw2Q`TGnAp)qilPsDcc@OWvUDVHuYJ*^_RF{#0m*Dj|cGds6>doKYyzyI?U-HdO7tU$e zaL%7^SpPK*m!3X*$tiz&;miO18&8|se%3=8t~>K{cUx-=J5W3x(R0(#^}lz6;hu zrA<l!Xy{}-pe2G zt9!jZ)*OSI2Hyn>D5Ydx+Mu!TW?Mu8XoMfR=M#2AQChkr1F6tTl@l>gy&tOnawx)< zUJEK89X@TahR=%vBq| zB@=V|jZf{mZq^1pC#XT62YKkd532-w6=Ox&$2zYR_Oq+^!0+Ao-jBZZ6Nf!mHM9g{ zQ&z3WG8kz%*b(nr$>ce@cdtNDr1X} zf9`Yt{Or=ZJw5n9ASWO`msSAG-EmiLN{)AqBt|p_jhq-OB zR2{8vBdNj1Bq6&}QJHrQFac1{qB2*qvaa_^zfB+&43`0|NL!-w`0V0wt-u_vSb^KbCP4rK^&@b`317SG!r)z0$(ll>A|a{JrG2>5^s22^ z-DhKW07|K_ZZnlOs6W6m(O5%Tr?;AbFUny^8&tD@Gr9rIO%q!tb`|9spv3oI{aa(3 z9=h%F$JK6p{`&8}>?MCwzvI$rkMIpce>*{^LrXjaRv>}%PMzI-;XC9ER0X?@uxeV} z#cKBP>wVXcYQ3-Yy8PFDO6mvh!55UEiOE=0@h9?85qCjF}*!oG9bTo z;t4-lf%KMgla5}>m9Z`eKmY>A9{cR3S3U7tue(}Z&}utUHLdzuZ9Xy$s=L$6`QF2( zAAb37-oiA%YkzAI`j>Zoo6XZ_%$mp{WnsS>!T8bu5QAOL|u z6FBzRzrXm^2Y&P755@lKExM>zFSM#}yP{89kW|szphz3itA4NgKYHao>Hz!D=)>wr z*PxF`zTvFDP^ZfYFaFt!e*Ndqe_lO%1qOGRUN*R_$r%C=fWU$TUhTC1h00Izz00c4u zjcl4p2tWV=5LoR5=+|EDCEzfOD~mt?0<|YVzc$(c0SG_<0yzPELr$djmjmn|1Rwx` z1qt9A&;|%V00I!m3E&%YA`8kX2_OIg2-Kbcz5#8300bZaft&!oAtzG%%K>%}0uX?} zf&}mlXafWw009W(1n>+5iCvKmY>`1_(d^0uaav z(BF^~=~rDz4*>{3pne4K4QK-dAOHafeP5|GK6RCmVvkMS_00b6E0N;Q%KmY;|fIv;eQJ0D(mkz&D@`5P$##AdnNlH{?VXDYh&Q0SG{# z1_ba8XafWw009W(1n>Ct4LOlTiY<#n00I!G z0Remi+5iCvKmY<&0*z`EF%W*=hAzpf zv+xaQ0|X!dfqD|yb>-W3Y}u-@hTC6%sRoHeRR-F|;2Y{$CfXisA|U{Q)kEOTm%VBI z+LKPXXx-+`oA=y*|KtM?+&(&b)#+#K-f&qj5bzCX0|X!dfw~d6>9$*>4WnB}$H&Jf zCnu+8W)95F9XN1cZ0Al1MlafcZ>U?D=;f%B1_BVMH-TNd#_qds{Lx1rot}{{%<3m$ zICSXH+}xZr+t-VAz&F&Y zOe}aUKmrIrp!NhL2{SV@8VBD{ii3Q^0ktd59Xxn&?uyr4w4glT8_)&_KmY>uAs{_a z3sM_x2(3!ehPi`>4ykK;?Z`-Xjl?(9r%ZG|(#(Yb1Xcrq>8a^d8>Xh3{S9s$ruOfb zZ;*TF0;Jo#E{ib>0uX=z1XdscIR?{)si`S>2#qbqx}&X8X=*BHgYIYTvi04v;hJTfIv+MxNlGklI~EFHrPE&n$)i_4s!=J%WhSAX#Czzs(Epz z8N@>X0uX?}a1qdpF+!Wtfdf(k34nw_LwXzQTx?a6NZ1=Sx@ZHwp(fW0!&QRWS_nX3 z5ClFxF(GYG)gQDWdBh>O2J;QE%Rx`T=_N~QQ+jaM2Rm&B{S9aX1Rwx`IuIBe8`Fae zatVbtOec@O`Fk_UM;!F3rS95*Z>U3==%oC_LjVG+hk&#}Z_99Puv?XiHl?Typ}(Qf zhJ&UJ_ua6w6Q2bhjq9`+@eqIj1R$`Y2#k-7>8-1#4F_V!vs#y?56n&d*;mxQ6yKdu zh=bmnv7k2K8}JPffB*#QKtRHvpB`&4cOXen_rrTX@{tF=@P*0gX}z`EWWyeR8yyX8 zO8TNhCwZg4p$=uD)6pd!0uWd|1WX&Ir>0~JX66psCmht!q&r#F4#8J^K|KLKD;MSJVR`@wjEj4*3RsF|?C5 z;2Y{tCOREm;voQm)kEOk58Ne}5PU<_2KffPQ%|37kWQ#^NrT*jA~m=+T)S~&CqDQF zv;hJTfIuAx6xtx)aPXiy8`RUF)+GJ(u(Z5_gkf@GLLc@~%aXbrq$2VSU9h4(Baug%b8cWuBopbZd!00inl;Le+FkrJp!!89Pe zK`Fj*PZlAzEyWjgN8ONbP*an%q01*6@C|h+6P>Ojh=%|KRu6$v8zv{4sA;28@gx%z5#8300baV2LjRtJ>sx$vZ)Q`8(bSw_C-q@x_=fF-+(qi00I!G2?6;AecmSu zz??)tfy!4LtfP8P@80YFSx|gKP0B>4O9|p30D;v*z_dZ#4Dtr14e|%-Y%t%Tu=xh* z!-Cp?Z$KL$009Wpgn+bRVsb(Ppx)-PJ9Ssf zg&EQed_zsjL>K*M76c%$dI;FNFZFF3Cg4H>f*0JpQH^cE_KTL#00OIpfV4sNzPg$v59)Sy zZ76S53e8P24c!}*RG-kMv|36G;sF5&tP%p@R;4Hm<`S&GA!x(Qj0uC@zSrF}2o$~n zZGZp-AW$m;`UucB2OZ)QaPirOSv@t~i!ewV@C~&p6RYI1h~0z$1iBN@ z2i+tC;r*-AGaAb@sG(_e>!_ZEUOO_fplML%_y)8A0uX>e-3Z)z;tAVMI8m=zRlkD0 z8$)^^RnXAo-K(kI;2Y{zCeouz7y=MjwFK@sd;JZky;2Hs;mGkCBnda1eeUiJmwo!3 z*Z0B%-+(qi00I!GCjlve4SU|SS;K=@Zkrt4(TgxB4ZfkCWunK!PcjHVpxy)~Hf%6e zkTCSMr}zf60Rj+!00eRZ_=cQFU(!lq2tWV=wIqOVKpP+c0SG`KCxCCriPZ8EfSrN> z1R&5C0el16009U<00KDyd_zv8FKHz)1Rwx`S`xrFpbZd!00bbA6Tmm*L~3~nz)nE` z0ubnn0KNfjfB*y_0D+vq#eFFWi6H<12tZ&p5WqL&YPlMYI{OF#2tc4a0s0%z1_(d^ z0uaav;2Uxx-L;gt5P$##Rs(^N)v%N7BLpA-0SNR(0N;RbfB*y_0D+tU{S7&hzND4J z5P$##YDoa!fHpt?0uX>eP5|GK6RG7T06PT%2tc4O0{8~B0Rj+!00eRZ_=cQFU(!lq z2tWV=wIqOVKpP+c0SG`KCxCCriPZ8EfSrN>1R&5C0el16009U<00KDyd_zv8FKHz) z1Rwx`S`xrFpbZd!00bbA6Tmm*L~3~nz)nE`0ubnn0KNfjfB*y_0D+tUz9A>lm$Z@? z0uX>eEeYTo&;|%V00I!m2`qzexMjzVH(&OqQ!ZMkVg1^ZG``|>7imzWhRx;ACM|w+ zbady=owXEab_xOzfWQhQutdIL|Chd`%3T$`#6W|KfrMam>u4C_PqLw8V`DqV$Hwlv zZ+y@F_kVn1VtjmDGfgU#a%^mD1#)DQAOHaf)QP~reZ$n$lxlpl2xbCGV-Wrp!VtAV z$(q_QJ}zyTeBgmcAAMB1qD-dt@1LBUyy>=EY;hE#PNk52fdB+n9)U*Q%ya}dQJ4It z3cBi-45X^y;nXw~+ORYD2AKxa2FZe?VS0LcW@ct~W@dV7O4)AP`Yt@g5j;|41px>^ zASE!UHl=<0_DK)ad=yl{ezEPyCBXxx4K~@-hVjs#B%@%a!GuB5px=S`lUnTBHKwJs zNV-3SApijgKw$9%2Gyn{yP%;^g+v>w?jdMHY*SK2FCkG~ul6GI4HB4EZHVGfsKWvM zRg2TRuf16dE*=CqKmY;|fPfPily6Xdt-b+O^i_G#tn_EXpkzv~vE)JB(P}kPFSNA5 zTa!YAQZx;vGz9xFH#et9CHDOx009U<00N6AFeu-k`dz|cLnnD~$6(3g9ZF*gOF6tF z+O;7xCzTCK)~poAQit$cJP2}t00bZa0Vgmh-(aR8*M`I-<=q zi!WQ`009ULFM&b%1|#C`Av7zMra?i)>jAgPiHYgyDXaIJo?z~PVx$T| z7}Uv7{$jFbDjdV`mN~W@0uWgF1P0|Be9zUaU7|)bi7`N696W zcEN5>Y7r56244jM2tWV=5IC{~2J0JqTZ3sB4X?XUFM_oZnI@FYLM?xF|4|%5l2RU; ze--K35`X{%AOL|u5E!^`sBW|>cS(WQ{@yxN>chdgg9pFLQpCNxB z0Z8>A4R2^PE{}r(T3wIXS~5w3nFbq6C$J8E0VFX5AOL}j`$gcU!G$4uh9C^OJYO(3 zJrS*UB}o`m>8D~~VMS`#+&D_Z)-`K^ASKXWbBzQ*Z%Z{vFuP!5GYxt%MwezKy%b5h zBFCUU2G<5t1^ENj{?dT%gBD-VJ$O$;REQuD`l;7Je#Kt)m+m}a2tWV=5NJ!FKi?o> zkTXbC!NP7D)Uw}pHF`saTAg$QQdJmS6?U$DL6>3d#mC)x;t8tXwZ^uqu*gyyOcY|{ zQq%^$*-u-Jb?AbQSrC8#1f0N#hZYP>KJb7wC}rA^ng+dCyY0L1)S9H*QnSuybt;%J zm?Wt7Zw_mZA1j8nF%ZWuKJJFI&+XD|B|#{(A-<6*c02@;P^8A%Y_ws)qf7z_KmYi149SA`A)C5ZhEVY>LKS!r@|Qp;*fIPegF00bb=oj@P`4OX#Mg~7hi zps{+YB@CH1s5MFPdXynG4eDl4AA@=qOa|OHcp!*``37mj`t{=%#6f}e>u-PkrP85^ z$u^BwK?kC7NIM%$9Hb5UR*-}N>(ISGFc$(4fPe_}>Kp71B?&-P8-its-2l2()U-j5 zn>pO7X~={@GT@Tn0gDXsP-w%3-5V|&zhJ{h&pk^zVXO01ctCISE*h1JHl@Nem}F?% zwEbv<<01e72tc3{fnI%szTRxN2}N!2W~H5JFSM#=)xR3KHfU0Uk@YlGTa&CQDHREi zkvxPpr3->K?0M5>jWz7pvQ_IG{O*o00i0+=+!q^ zXM@J2HYlK}@VuLBL)xGug-{)BE0Z?p&ZX@3ByUZUODOz7*$ZtkCJaT`v|;@P5{3t_ z+@`T9gjOmsNOwsaCbiHSW2;j8E(acvPKgnQ00bb=i9oNu!CLBr8YI8MG*lXt+&Ac% z23_N)z0kckC^g%c)`l(z(+0_dDTKC1FYQS8O53G7spMKhXG5h;NzF>?a!|_{z9EH1 z7y=N0KwAR6`Uc&hq*^u6h0vO0ra_nR;SQylaEFq93g~Amo1U4`8#2;fXf-HV7qnXh z3;1N(vQ$Jy>!7A2slun!B%_x0Cv$MfMp*vbH&(N2vxmBr= zzmL~35`X{%ARq$0`UZ72s7h6JEJ-khP+jcWpthRW*`TjL2W?PTSu3nYp6m`KZ&32q zBndz|c!N??En<(fX~X2`4h>R>`>v5Bjmii3QPiZ~s0xgHb@@KG)NodCp7GvoOErNoh`IMG3pYqZ!_4F4OxSd)&3?7CJ8>y zXX$RG3pU6x{F8UTM}y=++Mu;(+F)G{GAoiLeYqhs4$=nQP^+bAR_an9m<0g{KtKfg z@eQM+E(xk(HApSij*Q4sOzqzv?@^kQ9@tM=E1=3+9nt>Co3ud>LN^UT*#+IkE0nVe z#^HzlY3~Z4RSCt4cZLJhFZ7GD=0=Hp^>yfa)mauEeb?J00Izj0=@bMYg00>&>U|K zzCl%Op$(z_4fV2qT7e|u-Phin-lXK(kkFTgX(2CFh4QjB;v_V@EA8`o2L4DEssRc=CWE!HS36I6?-n~bSU~O3t2>}Q|00Ks! zZ{Hw2P~B?skZ42kCMDIv(gux{yE=rGpshBv)cdgo$z?zRR|pG)n6=02O-ky2Hs4^@ zp}jW5yJ@2~$Tv)@DNKS9HYrM$dL85&&<09B1Rwx`?gV=E4WYk5PmRT&>Q<8n(+0&& zPlwMo#Qxr3)bt_RjI=Mi3yE0NE>7eeD|~& zrEky;tcTQ;WZOA29d2pWq<#wMJ|(olp%H)p1R&6sK(D?b)dp3;g*>$OMVmGp2(}^k z277r?rVVxvtBZl^eb<02(v>4>LwLSH_a+5ln0Rn{V&b9kdsWLzetfT_4b~Sek&+CU zzfnM26=Wg$2Ga)3@}&qs00IzzK$SorzCl%Lv<<~b@}N$L^gg9R8-g?hZJ3;xkkv?^ zeUopn54~Bv@2X%5;bLI%CKW~Gy0v^-chb@0}trjsaNw5QGnNy7A`gke(6O7XMRJ8ea_SEdaT0I7oA!K%4>w~{tPnjq^S zosfn}7_|LW5X3+L0uX?J6X?}9NEqx9hZbQdPT+|* zTSKCk5&{r_z-lAVt8WmOpbe>G@NoPDn<{0~28|t}9!u7Bx|)@$T@Ee)W)V_VXvUPL zL3gj}4y7l4@AsdWd|29`o0Q~U(iiP%jnW3KPB%%JFlaNhNs$Os zApijgK%fhOUVVeID7vG!hQ3_=nmSQ@IKduq2(Lc%^{GZyC0=b-vb&XB9#Z$G}tVgG)$Bk89tQOlC_L%tzhiZBEq009V8 z3H0F`TpOecnKr2PU-hr5V^z)irK?druEc6q>SP_vC73*0><&atx*o zG7!?6^eua~I;}_zNG1##tBp&hA?iZZhN=CMhoEV6MAM)I0SG`~Ap-sR25YQuI)<{p zAv}f_zSUfGIi%X4Yk6I*r`EylR?4h{d5ETyh{B-f-Td~XAPlihNp~no8&uJ!Yq794 zAZ<``VNgJAOS*-L&W0*9Vjutk2viC5;TyDY`!0w0vI~8z8hSH5z`y zQhGD1t3pK>!Ur4dnTE_X$Recqd)Q5bH7K=e!<2P4XiGdj0SG_<0uX3Rpby`m<!t5MsI-k%{|ac$6TOMb(WZfUhXhSPnKeGa-Uk3{I#rZ9h#3jSUb}C_3C4gV~{X}ck1cwN%6i_S%=BJ zAJ@97Jq^CntU*c5S*0-SS2*@H@YEYmK|=rn5LlQ%f4)JraI;w{s)CJ78@klmT2Spg zYFyGQG)x|(4YCef*Q}8?1nUrmK`-JqVNn0Ggu&meC+lFsAO&(IXd93`Xhmr+wB$jP z+BP~H+7crY0uX>el|bLVL0JUf(E5`$=%&(Y?pcg(V^X94Nk_i%ZmA>YuvVQF1>5x3sAs(X{<8(bdjNw;2vK`U)*8tids z?q2P5P>6>B1R#(RI2_+#S*Wt^R~T$TJ)EYlY4ttm&Lzo%X+vyQT06de{ltb1>THm8 zP=ABuVfU?fnhs^#-DOgC!Fw94K}ju9^g?$b#w-Xx00J3-!}JYVE{8FxJ^+2V?W)ty zc*}GCf#gAh?o+Zmlw=+5yJqyh8+P6vWuf29B@C_&dJIDE0i+kYUxuWI00dS!fy4I= zM+BTIZq@(l-n3~$PYb^Ai_s~~y*sEhf2tWV=H6yTW zzG2WDB@bpA)S5(3!=P!CKLj99GXfXaY=77t2tWV=5Li5cW%CWiw?pH*`E+k<@s_?g zsgb@M7ay0K)J;u`-$`%y`3ErwL;2ax@X^lj$t25P-m86IeRmAQ>osl7wg*qBckj^s)^-GOa;RFYBk5CYdVO-K!=K zic}Xu+xImc_Rg~)1Rwwb2(%?I(l+*pN0zFP|5aTtm!QWTf-0!`4?pQb(=O<7YemUM zsEJ9Q!`_&5#5a!&ApijgKp-Ws6uu!5grb)r`i7!GDcnu;zyp#8_YGzpBnc7>-Q;So z{x((cZ$YQ~Ko|lLfB*!JEP;XdH#CL8IvBjeAqF(pzUmzM8OrZ>+QZC}1kF+cw+p2_ zgwKv1IMC*0;71k>xj_H|5LmSY2J0J2VaRVoij{j5hh$`3(;Dj|3^9R%E(a|E-Nhu? zka(=x!^Vz700IygD1pKH2GfS5{#P*6^7=ESJCmk^Etu6X8;6)$-{+Bq&;x54w+KQx z5f+)9jnaTNEc_DoftDUJhX4fXN?_o=p;Z`)DG7k|!0tP;kF}X-C_FPWYp=LaO!*nN zgYF*`S!zRY4s|^$>=y(e0DS|6!30m z7X~>8yZJTx3~9s6^0H&?5P$##>Pld+zM)kZ;#AWE9F!QyCFsjNs^t|{OOb>@pQKhm zlVuxH%U@+7+0ajE^sDPpVZR^%0SGKFfx-HQLJgV{ktjo~^Gy=$DQKyJ9D}+aGGQ>^ zps`sFmj`^q@)jM|4gm<%n809tgPvkj4K5W3HGA4Nl$Zf2fqa0TaZ_RiGGRy(HiJs0 z`&{)N?;0N%b`1g$fWR^m7_4v5j;RLMLv5~fb}v+Ct^e#mkX#VNpIuR!_sPZ(opZC z!rnmu0uWeU0!wuDt=C|fLdZkt!3Eg})%7L-rDrIuL(q#L6ebEm5~ioM)Vr^}*;Iiq zxGisqVeJrrz-l0{6u!YYT8Fd0T2*Q>Ik`_dp*Es;&rx{%O%K8;tY_jBuiIO9@7|;I zk_7wUv-%|N{lHzT;i#~W5P$##mY2X1`3B!fDTGXbzTvDlZ>uXpmA-2K^dk)>9wr7h zSG@~*MXTPs=a~?I00bZafq@cOI^U4(hKYn~e0wXmJb^2O#6XcU7U4at6BF5jOhNzx z5P-m-2`sg581(*-KLj8E0SGLfz_R&<#cw(}KmY;|fWUwV;2U_ADFh$@0SHtHG^$a= zKmY;|fWWFIK%3I4KKui6qht#K2n;&`+LX`+2tWV=5XcGO8*(DUuJ&v{1Rwx`#S_3c zpbZd!00bbA6Tmm*L>8~N8~N8~N8~NePJsS~ zoX8QEUowOM1RyYU1n>=L0|X!d0SM#-Mutw!*kA}i00IygGy!}=u9kx)PW}*p00dS( z0s0%z1_(d^0uaav;2UxxD__sqLI^+r0)r-iZ$KL$009UCt4LOk&CEaWc1Rwx`Wg&oXKpP+c0SG`K zCxCCri7bmmvr-5^00JwD0KNfjfB*y_0D+tUz9A>FqNJORfdB*`uq*`d4QK-dAOHaf z009WBC<6Efv;hJTfB*z?0{DiU$cmC~HUCt4LOk^5_UEf0uX?}fC%6l&;|%V00I!m3E&%YA_Ed(vV{NyATUG(@C|4K z1Rwwb2;>Ct4LOk^5_UEf0uX?}fC%6l&;|%V00I!m3E&%YA_Ed(vV{NyATUG(@C|4K z1Rwwb2;>Ct4LOk^5_UEf0uX?}fC%6l&;|%V00I!m3E&%YA_Ed(vV{NyATUG(@C|4K z1Rwwb2;>Ct4LOk^5_UEf0uX?}fC%6l&;|%V00I!m30yoN%^_O|KmY;|7+wPShFmR& z_gJ#!5P$##juZj<8_)&_KmY;|$O+&Zaw11cb;$<;5P-n&5*QiYO=rs?009UP-Y&`kollmKG*d}O2A*BEM7ox(b-`^)TCBMy$HQSVn|9*Perl&tO z|BR*BJpc5bP1`nY+PvrKu+XRGcR#Z4r<&fhX>9)P&3on_(a)wgZJM9|xu(X8>CK)$*-f6s@L?c4OJ zdqm{tkL-R#KjU%v{7<(C$*k(rLWZ5PS*PDJg@?up9lI-VoXz>2U@7IG zr}N;c^7oBzJf-2;Fp7WYzwvDR`|PvD->39<{@HIl^^}G<((Lr7c_AhY@vl#7GNjb> z{Ilr-F|4g#)bDC7eX{<~&#%${_s6_ajv->QaeCwO#;(Tu8t;koe^b+MY~0cqYka72 zx0XID{)@9T+N+drR*HM{_wL4XmGY{_+Z*eZ!}*%~f}_gy9jo>2j0>gfd$RFg_lC$d zan2t%cErD%l-JE#|5zg|@tnq68`o&P*C_7&jk{v#J&g}4&FwMuQH`U*ZZ$sEcuV8F z#&M0Kw5Gj{ZH+7A+%P&i&VOs;g^e4vg`rH{-*{W&YHj6v8h19{p`6~YTsOt3vAB-A zmH*A!pIzDpqtwjjR~uVnK1VC3`y1o&-&u_hh)&qPyY=@@cn>iTfX9o;zj. -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -extern "C" { - #include "GUI.h" - #include "LCD_SIM.h" - #include "DIALOG.h" -} - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Table : public QActive { -private: - uint8_t m_fork[N_PHILO]; - uint8_t m_isHungry[N_PHILO]; - -public: - Table(); - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(ready); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; - -#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO)) -#define LEFT(n_) ((uint8_t)(((n_) + 1) % N_PHILO)) -enum m_forkState { FREE, USED }; - -// Local objects ------------------------------------------------------------- -static Table l_table; // local Table object - -#ifdef Q_SPY -enum QSUserRecords { - PHILO_STAT = QS_USER, - TABLE_STAT -}; -#endif - -// Public-scope objects ------------------------------------------------------ -QActive * const AO_Table = &l_table; // "opaque" AO pointer - - -// GUI definition ============================================================ -enum YCoord { - PHILO_0_Y = 0, - PHILO_1_Y = 20, - PHILO_2_Y = 40, - PHILO_3_Y = 60, - PHILO_4_Y = 80, - TABLE_Y = 100, - STATE_X = 100 -}; - -static int l_xOrg = 80; -static int l_yOrg = 60; -static char const l_thinking[] = "thinking"; -static char const *l_philoStat[N_PHILO] = { - l_thinking, l_thinking, l_thinking, l_thinking, l_thinking -}; -static int const l_philoY[N_PHILO] = { - 0, 20, 40, 60, 80 -}; -static char const *l_tableState = " "; -static int const l_tableY = 100; - -//............................................................................ -static void displyPhilStat(uint8_t n, char const *stat) { - GUI_SetBkColor(GUI_GRAY); - GUI_SetColor(GUI_BLACK); - GUI_SetFont(&GUI_Font13_ASCII); - - l_philoStat[n] = stat; - GUI_DispStringAt(stat, l_xOrg + STATE_X, l_yOrg + l_philoY[n]); - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -static void displyTableStat(char const *stat) { - GUI_SetBkColor(GUI_GRAY); - GUI_SetColor(GUI_BLACK); - GUI_SetFont(&GUI_Font13_ASCII); - - l_tableState = stat; - GUI_DispStringAt(stat, l_xOrg + STATE_X, l_yOrg + l_tableY); - - QS_BEGIN_ID(TABLE_STAT, AO_Table->getPrio()) // app-specific record begin - QS_STR(stat); // Philosopher status - QS_END() -} - -//............................................................................ -static void renderDppScreen(void) { - GUI_SetBkColor(GUI_GRAY); - GUI_Clear(); - GUI_SetColor(GUI_BLACK); - GUI_SetFont(&GUI_Font24_ASCII); - GUI_DispStringHCenterAt("Dining Philosophers - Demo", 160, 5); - GUI_SetFont(&GUI_Font13_ASCII); - - GUI_DispStringAt("Philosopher 0", l_xOrg, l_yOrg + l_philoY[0]); - GUI_DispStringAt("Philosopher 1", l_xOrg, l_yOrg + l_philoY[1]); - GUI_DispStringAt("Philosopher 2", l_xOrg, l_yOrg + l_philoY[2]); - GUI_DispStringAt("Philosopher 3", l_xOrg, l_yOrg + l_philoY[3]); - GUI_DispStringAt("Philosopher 4", l_xOrg, l_yOrg + l_philoY[4]); - GUI_DispStringAt("Table", l_xOrg, l_yOrg + l_tableY); - - displyPhilStat(0, l_philoStat[0]); - displyPhilStat(1, l_philoStat[1]); - displyPhilStat(2, l_philoStat[2]); - displyPhilStat(3, l_philoStat[3]); - displyPhilStat(4, l_philoStat[4]); -} -//............................................................................ -static void moveDppScreen(int dx, int dy) { - l_xOrg += dx; - l_yOrg += dy; - - renderDppScreen(); -} - -//............................................................................ -Table::Table() : QActive((QStateHandler)&Table::initial) { - uint8_t n; - for (n = 0; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = 0; - } -} -//............................................................................ -Q_STATE_DEF(Table, initial) { - - GUI_Init(); // initialize the embedded GUI - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - - return tran(&ready); -} -//............................................................................ -Q_STATE_DEF(Table, ready) { - switch (e->sig) { - case Q_ENTRY_SIG: { - renderDppScreen(); - return Q_RET_HANDLED; - } - case Q_INIT_SIG: { - return tran(&serving); - } - - // ... hardkey events ... - case KEY_LEFT_REL_SIG: { // hardkey LEFT released - moveDppScreen(-5, 0); - return Q_RET_HANDLED; - } - case KEY_RIGHT_REL_SIG: { // hardkey RIGHT released - moveDppScreen(5, 0); - return Q_RET_HANDLED; - } - case KEY_DOWN_REL_SIG: { // hardkey DOWN released - moveDppScreen(0, 5); - return Q_RET_HANDLED; - } - case KEY_UP_REL_SIG: { // hardkey UP released - moveDppScreen(0, -5); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Table, serving) { - uint8_t n, m; - TableEvt *pe; - - switch (e->sig) { - case Q_ENTRY_SIG: { - displyTableStat("serving"); - for (n = 0; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = m_fork[n] = USED; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QF::PUBLISH(pe, me); - m_isHungry[n] = 0; - displyPhilStat(n, "eating "); - } - } - return Q_RET_HANDLED; - } - case HUNGRY_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO && !m_isHungry[n]); - displyPhilStat(n, "hungry "); - m = LEFT(n); - if (m_fork[m] == FREE && m_fork[n] == FREE) { - m_fork[m] = m_fork[n] = USED; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QF::PUBLISH(pe, me); - displyPhilStat(n, "eating "); - } - else { - m_isHungry[n] = 1; - } - return Q_RET_HANDLED; - } - case DONE_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO); - displyPhilStat(n, "thinking"); - m_fork[LEFT(n)] = m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - if (m_isHungry[m] && m_fork[m] == FREE) { - m_fork[n] = m_fork[m] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, me); - displyPhilStat(m, "eating "); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); - if (m_isHungry[m] && m_fork[n] == FREE) { - m_fork[m] = m_fork[n] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, me); - displyPhilStat(m, "eating "); - } - return Q_RET_HANDLED; - } - case PAUSE_SIG: // "Toggle" button pressed - case KEY_CENTER_PRESS_SIG: { // hardkey CENTER pressed - return tran(&paused); - } - } - return super(&ready); -} -//............................................................................ -Q_STATE_DEF(Table, paused) { - uint8_t n; - - switch (e->sig) { - case Q_ENTRY_SIG: { - displyTableStat("paused"); - return Q_RET_HANDLED; - } - case HUNGRY_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO && !m_isHungry[n]); - displyPhilStat(n, "hungry "); - m_isHungry[n] = 1; - return Q_RET_HANDLED; - } - case DONE_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO); - displyPhilStat(n, "thinking"); - m_fork[LEFT(n)] = m_fork[n] = FREE; - return Q_RET_HANDLED; - } - case PAUSE_SIG: // "Toggle" button pressed - case KEY_CENTER_REL_SIG: { // hardkey CENTER released - return tran(&serving); - } - } - return super(&ready); -} diff --git a/examples/emwin/demo_no_wm/winmain.cpp b/examples/emwin/demo_no_wm/winmain.cpp deleted file mode 100644 index 063b9544b..000000000 --- a/examples/emwin/demo_no_wm/winmain.cpp +++ /dev/null @@ -1,42 +0,0 @@ -//============================================================================ -// Product: WinMain for emWin/uC/GUI, Win32 simulation VC++ 6.0 -// Last updated for version 5.8.2 -// Last updated on 2017-01-15 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include -#include "GUI_SIM_Win32.h" - -//............................................................................ -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - return SIM_GUI_App(hInstance, lpCmdLine); -} diff --git a/examples/emwin/demo_with_wm/Config/GUIConf.c b/examples/emwin/demo_with_wm/Config/GUIConf.c deleted file mode 100644 index 80eb99232..000000000 --- a/examples/emwin/demo_with_wm/Config/GUIConf.c +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : GUIConf.c -Purpose : Display controller initialization ----------------------------END-OF-HEADER------------------------------ -*/ - -#include "GUI.h" - -/********************************************************************* -* -* Defines -* -********************************************************************** -*/ -// -// Define the available number of bytes available for the GUI -// -#define GUI_NUMBYTES 0x280000 - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* GUI_X_Config -* -* Purpose: -* Called during the initialization process in order to set up the -* available memory for the GUI. -*/ -void GUI_X_Config(void) { - // - // 32 bit aligned memory area - // - static U32 aMemory[GUI_NUMBYTES / 4]; - // - // Assign memory to emWin - // - GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); -} - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_with_wm/Config/GUIConf.h b/examples/emwin/demo_with_wm/Config/GUIConf.h deleted file mode 100644 index af51cc9c5..000000000 --- a/examples/emwin/demo_with_wm/Config/GUIConf.h +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : GUIConf.h -Purpose : Configuration of available features and default values ----------------------------------------------------------------------- -*/ - -#ifndef GUICONF_H -#define GUICONF_H - -/********************************************************************* -* -* Multi layer/display support -*/ -#define GUI_NUM_LAYERS 16 // Maximum number of available layers - -/********************************************************************* -* -* Multi tasking support -*/ -#define GUI_OS (1) // Compile with multitasking support - -/********************************************************************* -* -* Configuration of available packages -*/ -#define GUI_SUPPORT_TOUCH (1) // Support a touch screen (req. win-manager) -#define GUI_SUPPORT_MOUSE (1) // Support a mouse -#define GUI_WINSUPPORT (1) // Window manager package available -#define GUI_SUPPORT_MEMDEV (1) // Memory devices available - -/********************************************************************* -* -* Configuration of window manager -*/ -#define WM_SUPPORT_NOTIFY_VIS_CHANGED (1) // Enable sending of WM_NOTIFY_VIS_CHANGED messages - -/********************************************************************* -* -* Default font -*/ -#define GUI_DEFAULT_FONT &GUI_Font6x8 - -#endif /* Avoid multiple inclusion */ - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_with_wm/Config/LCDConf.c b/examples/emwin/demo_with_wm/Config/LCDConf.c deleted file mode 100644 index 7e6de9978..000000000 --- a/examples/emwin/demo_with_wm/Config/LCDConf.c +++ /dev/null @@ -1,199 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : LCDConf.c -Purpose : Display controller configuration (single layer) ----------------------------END-OF-HEADER------------------------------ -*/ - -#include "GUI.h" - -/********************************************************************* -* -* Layer configuration (to be modified) -* -********************************************************************** -*/ -// -// Physical display size -// -#define XSIZE_PHYS 320 -#define YSIZE_PHYS 240 - -// -// Color conversion -// -#if GUI_USE_ARGB - #define COLOR_CONVERSION GUICC_M8888I -#else - #define COLOR_CONVERSION GUICC_8888 -#endif - -// -// Display driver -// -#define DISPLAY_DRIVER GUIDRV_WIN32 - -/********************************************************************* -* -* Configuration checking -* -********************************************************************** -*/ -#ifndef VXSIZE_PHYS - #define VXSIZE_PHYS XSIZE_PHYS -#endif -#ifndef VYSIZE_PHYS - #define VYSIZE_PHYS YSIZE_PHYS -#endif -#ifndef VRAM_ADDR - #define VRAM_ADDR 0 -#endif - -#ifndef XSIZE_PHYS - #error Physical X size of display is not defined! -#endif -#ifndef YSIZE_PHYS - #error Physical Y size of display is not defined! -#endif -#ifndef COLOR_CONVERSION - #error Color conversion not defined! -#endif -#ifndef DISPLAY_DRIVER - #error No display driver defined! -#endif - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* LCD_X_Config -* -* Purpose: -* Called during the initialization process in order to set up the -* display driver configuration. -* -*/ -void LCD_X_Config(void) { - // - // Set display driver and color conversion for 1st layer - // - GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0); - // - // Display driver configuration - // - LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS); - LCD_SetVSizeEx (0, VXSIZE_PHYS, VYSIZE_PHYS); - LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR); - // - // Set user palette data (only required if no fixed palette is used) - // - #if defined(PALETTE) - LCD_SetLUTEx(0, PALETTE); - #endif -} - -/********************************************************************* -* -* LCD_X_DisplayDriver -* -* Purpose: -* This function is called by the display driver for several purposes. -* To support the according task the routine needs to be adapted to -* the display controller. Please note that the commands marked with -* 'optional' are not cogently required and should only be adapted if -* the display controller supports these features. -* -* Parameter: -* LayerIndex - Index of layer to be configured -* Cmd - Please refer to the details in the switch statement below -* pData - Pointer to a LCD_X_DATA structure -* -* Return Value: -* < -1 - Error -* -1 - Command not handled -* 0 - Ok -*/ -int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) { - int r; - - switch (Cmd) { - // - // Required - // - case LCD_X_INITCONTROLLER: { - // - // Called during the initialization process in order to set up the - // display controller and put it into operation. If the display - // controller is not initialized by any external routine this needs - // to be adapted by the customer... - // - // ... - return 0; - } - case LCD_X_SETVRAMADDR: { - // - // Required for setting the address of the video RAM for drivers - // with memory mapped video RAM which is passed in the 'pVRAM' element of p - // - LCD_X_SETVRAMADDR_INFO * p; - p = (LCD_X_SETVRAMADDR_INFO *)pData; - //... - return 0; - } - case LCD_X_SETORG: { - // - // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p - // - LCD_X_SETORG_INFO * p; - p = (LCD_X_SETORG_INFO *)pData; - //... - return 0; - } - case LCD_X_SETLUTENTRY: { - // - // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p - // - LCD_X_SETLUTENTRY_INFO * p; - p = (LCD_X_SETLUTENTRY_INFO *)pData; - //... - return 0; - } - case LCD_X_ON: { - // - // Required if the display controller should support switching on and off - // - return 0; - } - case LCD_X_OFF: { - // - // Required if the display controller should support switching on and off - // - // ... - return 0; - } - default: - r = -1; - } - return r; -} - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_with_wm/Config/LCDConf.h b/examples/emwin/demo_with_wm/Config/LCDConf.h deleted file mode 100644 index 4d791da51..000000000 --- a/examples/emwin/demo_with_wm/Config/LCDConf.h +++ /dev/null @@ -1,28 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : LCDConf.h -Purpose : Display driver configuration file ----------------------------------------------------------------------- -*/ - -#ifndef LCDCONF_H -#define LCDCONF_H - -#endif /* LCDCONF_H */ - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_with_wm/Config/SIMConf.c b/examples/emwin/demo_with_wm/Config/SIMConf.c deleted file mode 100644 index badc4638c..000000000 --- a/examples/emwin/demo_with_wm/Config/SIMConf.c +++ /dev/null @@ -1,55 +0,0 @@ -/********************************************************************* -* SEGGER Microcontroller GmbH * -* Solutions for real time microcontroller applications * -********************************************************************** -* * -* (c) 1996 - 2022 SEGGER Microcontroller GmbH * -* * -* Internet: www.segger.com Support: support@segger.com * -* * -********************************************************************** - -** emWin V6.28 - Graphical user interface for embedded applications ** -emWin is protected by international copyright laws. Knowledge of the -source code may not be used to write a similar product. This file may -only be used in accordance with a license and should not be re- -distributed in any way. We appreciate your understanding and fairness. ----------------------------------------------------------------------- -File : SIMConf.c -Purpose : Windows Simulator configuration ----------------------------END-OF-HEADER------------------------------ -*/ - -#ifdef WIN32 - -#include "LCD_SIM.h" - -/********************************************************************* -* -* Public code -* -********************************************************************** -*/ -/********************************************************************* -* -* SIM_X_Config -* -* Purpose: -* Called during the initialization process in order to configure -* the simulator. -*/ -void SIM_X_Config() { - SIM_GUI_SetTransColor(0xff0000); // Define the transparent color - SIM_GUI_UseCustomBitmaps(); // custom bitmaps should be used - SIM_GUI_SetLCDPos(132, 45); // position of the LCD in the bitmap - SIM_GUI_SetCompositeTouch(0); -} - -#else - -void SIMConf_C(void); // Avoid empty object files -void SIMConf_C(void) {} - -#endif - -/*************************** End of file ****************************/ diff --git a/examples/emwin/demo_with_wm/bsp.cpp b/examples/emwin/demo_with_wm/bsp.cpp deleted file mode 100644 index 0324ab7af..000000000 --- a/examples/emwin/demo_with_wm/bsp.cpp +++ /dev/null @@ -1,138 +0,0 @@ -//============================================================================ -// Product: BSP for emWin/uC/GUI, Win32 simulation, NO Window Manager -// Last updated for version 7.3.0 -// Last updated on 2023-07-20 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -extern "C" { - #include "GUI.h" - #include "LCD_SIM.h" - #include "DIALOG.h" -} - -#include "safe_std.h" // portable "safe" / facilities -#include -#include - -Q_DEFINE_THIS_FILE - -// local variables ----------------------------------------------------------- -#ifdef Q_SPY - static uint8_t l_running; - static SOCKET l_sock = INVALID_SOCKET; - - static uint8_t const l_clock_tick = 0U; - static uint8_t const l_simHardKey = 0U; - static uint8_t const l_MOUSE_StoreState = 0U; -#endif - -//............................................................................ -static void simHardKey(int keyIndex, int keyState) { - static const QEvt keyEvt[] = { - QP::QEvt(KEY_UP_REL_SIG), // hardkey UP released - QP::QEvt(KEY_UP_PRESS_SIG), // hardkey UP pressed - QP::QEvt(KEY_RIGHT_REL_SIG), // hardkey RIGHT released - QP::QEvt(KEY_RIGHT_PRESS_SIG), // hardkey RIGHT pressed - QP::QEvt(KEY_CENTER_REL_SIG), // hardkey CENTER released - QP::QEvt(KEY_CENTER_PRESS_SIG),// hardkey CENTER pressed - QP::QEvt(KEY_LEFT_REL_SIG), // hardkey LEFT released - QP::QEvt(KEY_LEFT_PRESS_SIG), // hardkey LEFT pressed - QP::QEvt(KEY_DOWN_REL_SIG), // hardkey DOWN released - QP::QEvt(KEY_DOWN_PRESS_SIG), // hardkey DOWN pressed - QP::QEvt(KEY_POWER_REL_SIG), // hardkey POWER released - QP::QEvt(KEY_POWER_PRESS_SIG) // hardkey POWER pressed - }; - - // do not overrun the array - Q_REQUIRE((keyIndex * 2) + keyState < Q_DIM(keyEvt)); - - // post the hardkey event to the Table active object (GUI manager) - AO_Table->POST(&keyEvt[(keyIndex * 2) + keyState], &l_simHardKey); - - if ((keyIndex == 5) && (keyState == 0)) { // hardkey POWER released? - QF::stop(); // terminate the simulation - } -} -//............................................................................ -extern "C" void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState) { - MouseEvt *pe = Q_NEW(MouseEvt, MOUSE_CHANGE_SIG); - pe->x = pState->x; - pe->y = pState->y; - pe->Pressed = pState->Pressed; - pe->Layer = pState->Layer; - AO_Table->POST(pe, &l_MOUSE_StoreState); -} - -//............................................................................ -void BSP_init(void) { - int n; - - GUI_Init(); // initialize the embedded GUI - - n = SIM_HARDKEY_GetNum(); - for (n = n - 1; n >= 0; --n) { - SIM_HARDKEY_SetCallback(n, &simHardKey); - } - - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate -} -//............................................................................ -void QF::onStartup(void) { -} -//............................................................................ -void QF::onCleanup(void) { -#if Q_SPY - l_running = (uint8_t)0; -#endif -} -//............................................................................ -void QF::onClockTick(void) { - QTimeEvt::TICK(&l_clock_tick); // perform the QF clock tick processing -} - -extern "C" { -//............................................................................ -Q_NORETURN Q_onError(char const * const file, int_t const loc) { - char str[256]; - SNPRINTF_S(str, sizeof(str), "%s:%d", file, loc); - MessageBox(NULL, str, "Assertion Failure", MB_TASKMODAL | MB_OK); - QF::stop(); // terminate the QF, causes termination of the MainTask() -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" diff --git a/examples/emwin/demo_with_wm/bsp.hpp b/examples/emwin/demo_with_wm/bsp.hpp deleted file mode 100644 index c74a1ea13..000000000 --- a/examples/emwin/demo_with_wm/bsp.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// Product: BSP for emWin/uC/GUI, Win32 simulation, NO Window Manager -// Last updated for version 5.8.2 -// Last updated on 2017-01-15 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -#define BSP_TICKS_PER_SEC 100 - -void BSP_init(void); - -#endif // BSP_HPP diff --git a/examples/emwin/demo_with_wm/demo_with_wm.sln b/examples/emwin/demo_with_wm/demo_with_wm.sln deleted file mode 100644 index 5ac5191ba..000000000 --- a/examples/emwin/demo_with_wm/demo_with_wm.sln +++ /dev/null @@ -1,24 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29709.97 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_with_wm", "demo_with_wm.vcxproj", "{5A1F2953-14F0-4676-8E36-1C759C4AE2A1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Debug|Win32.Build.0 = Debug|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Release|Win32.ActiveCfg = Release|Win32 - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0B2739F7-EC74-4A06-AA74-9C33F52AD9BA} - EndGlobalSection -EndGlobal diff --git a/examples/emwin/demo_with_wm/demo_with_wm.vcxproj b/examples/emwin/demo_with_wm/demo_with_wm.vcxproj deleted file mode 100644 index fa3629a78..000000000 --- a/examples/emwin/demo_with_wm/demo_with_wm.vcxproj +++ /dev/null @@ -1,269 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - QSpy - Win32 - - - - {5A1F2953-14F0-4676-8E36-1C759C4AE2A1} - 10.0 - - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>11.0.60610.1 - - - .\Release\ - .\Release\ - false - - - .\Debug\ - .\Debug\ - false - - - .\QSpy\ - .\QSpy\ - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/demo_with_wm.tlb - - - - MaxSpeed - OnlyExplicitInline - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - .\Release/demo_with_wm.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;%(AdditionalDependencies) - .\Release/demo_with_wm.exe - true - %(AdditionalLibraryDirectories) - false - .\Release/demo_with_wm.pdb - true - .\Release/demo_with_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\Release/demo_with_wm.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/demo_with_wm.tlb - - - - Disabled - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - Default - MultiThreadedDebug - .\Debug/demo_with_wm.pch - .\Debug/ - .\Debug/ - .\Debug/ - Level3 - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;%(AdditionalDependencies) - .\Debug/demo_with_wm.exe - true - %(AdditionalLibraryDirectories) - false - true - .\Debug/demo_with_wm.pdb - true - .\Debug/demo_with_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\Debug/demo_with_wm.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\QSpy/demo_with_wm.tlb - - - - Disabled - ..\..\..\include;..\..\..\ports\win32-qv;.\Config;..\..\..\3rd_party\emWin\GUI\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;Q_SPY;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreaded - .\QSpy/demo_with_wm.pch - .\QSpy/ - .\QSpy/ - .\QSpy/ - Level3 - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - legacy_stdio_definitions.lib;ws2_32.lib;winmm.lib;libcmt.lib;ws2_32.lib;%(AdditionalDependencies) - .\QSpy/demo_with_wm.exe - true - %(AdditionalLibraryDirectories) - false - true - .\QSpy/demo_with_wm.pdb - true - .\QSpy/demo_with_wm.map - Windows - false - - MachineX86 - false - LIBC.lib;LIBCMTD.lib - - - true - .\QSpy/demo_with_wm.bsc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/emwin/demo_with_wm/demo_with_wm.vcxproj.filters b/examples/emwin/demo_with_wm/demo_with_wm.vcxproj.filters deleted file mode 100644 index dd6a401e0..000000000 --- a/examples/emwin/demo_with_wm/demo_with_wm.vcxproj.filters +++ /dev/null @@ -1,139 +0,0 @@ - - - - - {39b51785-bb27-4d42-b439-073a1a9a910b} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {016d9e72-83bc-45de-a3be-7a1ddadcf0d0} - h;hpp;hxx;hm;inl - - - {e2b2644d-3a90-49b2-907a-2c90edbd53d5} - ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe - - - {edb4bdd4-7822-4812-b677-b21cb00121b0} - *.lib - - - {2f8471b1-5e79-4b02-bb56-c37c483f0c9e} - - - {12be5770-2052-40b6-b2df-6810909b2e27} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - emWin - - - emWin - - - emWin - - - Source Files - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP_port - - - - - emWin - - - emWin - - - Header Files - - - Header Files - - - QP_port - - - QP_port - - - QP_port - - - - - Resource Files - - - - - emWin - - - emWin - - - - - QP_port - - - \ No newline at end of file diff --git a/examples/emwin/demo_with_wm/dpp.hpp b/examples/emwin/demo_with_wm/dpp.hpp deleted file mode 100644 index 02074a864..000000000 --- a/examples/emwin/demo_with_wm/dpp.hpp +++ /dev/null @@ -1,80 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef DPP_HPP -#define DPP_HPP - -using namespace QP; - -enum DPPSignals { - HUNGRY_SIG = Q_USER_SIG, // sent when Philosopher becomes hungry - DONE_SIG, // sent by Philosopher when done eating - EAT_SIG, // sent by Table to let a philosopher eat - PAUSE_SIG, // sent by the user to pause the feast - MAX_PUB_SIG, // the last published signal - - MOUSE_CHANGE_SIG, // mouse change (move or click) event - - KEY_UP_REL_SIG, // hardkey UP released - KEY_UP_PRESS_SIG, // hardkey UP pressed - KEY_LEFT_REL_SIG, // hardkey LEFT released - KEY_LEFT_PRESS_SIG, // hardkey LEFT pressed - KEY_CENTER_REL_SIG, // hardkey CENTER released - KEY_CENTER_PRESS_SIG, // hardkey CENTER pressed - KEY_RIGHT_REL_SIG, // hardkey RIGHT released - KEY_RIGHT_PRESS_SIG, // hardkey RIGHT pressed - KEY_DOWN_REL_SIG, // hardkey DOWN released - KEY_DOWN_PRESS_SIG, // hardkey DOWN pressed - KEY_POWER_REL_SIG, // hardkey POWER released - KEY_POWER_PRESS_SIG, // hardkey POWER pressed - - MAX_SIG // the last signal -}; - -struct TableEvt : public QEvt { - uint8_t philoNum; // philosopher number -}; - -struct MouseEvt : public QEvt { - // payload: GUI_PID_STATE - int x, y; - uint8_t Pressed; - uint8_t Layer; -}; - -enum { N_PHILO = 5 }; // number of philosophers - -extern QActive * const AO_Philo[N_PHILO]; // "opaque" pointers to Philo AO -extern QActive * const AO_Table; // "opaque" pointer to Table AO - -#endif // DPP_HPP diff --git a/examples/emwin/demo_with_wm/main.cpp b/examples/emwin/demo_with_wm/main.cpp deleted file mode 100644 index 535317381..000000000 --- a/examples/emwin/demo_with_wm/main.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//============================================================================ -// Product: main task for emWin/uC/GUI, Win32 simulation -// Last updated for version 7.3.0 -// Last updated on 2023-07-20 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -// GUI includes -Q_DEFINE_THIS_FILE - -//............................................................................ -extern "C" void MainTask(void) { - QF::init(); // initialize the framework and the underlying RT kernel - BSP_init(); // initialize the BSP - - // initialize event pools... - static union SmallEvents { - void* min_size; - TableEvt te; - MouseEvt me; - // other event types to go into this pool - } l_smlPoolSto[2 * N_PHILO]; // storage for the small event pool - QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // initialize publish-subscribe - static QSubscrList l_subscrSto[MAX_PUB_SIG]; - QActive::psInit(l_subscrSto, Q_DIM(l_subscrSto)); - - // start the active objects... - static QEvt const *l_philoQueueSto[N_PHILO][10]; - for (uint8_t n = 0; n < N_PHILO; ++n) { - AO_Philo[n]->start(n + 1U, - l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]), - nullptr, 1024, nullptr); - } - - static QEvt const *l_tableQueueSto[N_PHILO]; - AO_Table->start(N_PHILO + 1U, - l_tableQueueSto, Q_DIM(l_tableQueueSto), - nullptr, 1024, nullptr); - - QF::run(); // run the QF application -} - diff --git a/examples/emwin/demo_with_wm/philo.cpp b/examples/emwin/demo_with_wm/philo.cpp deleted file mode 100644 index 6c106cc85..000000000 --- a/examples/emwin/demo_with_wm/philo.cpp +++ /dev/null @@ -1,154 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Philo : public QActive { -private: - QTimeEvt m_timeEvt; // to timeout thinking or eating - -public: - Philo(); - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -#define THINK_TIME 7 -#define EAT_TIME 5 - -// helper macro to provide the ID of Philo "me_" -#define PHILO_ID(me_) ((uint8_t)((me_) - l_philo)) - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; -// Global objects ------------------------------------------------------------ -QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AOs - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -//............................................................................ -Philo::Philo() - : QActive((QStateHandler)&Philo::initial), - m_timeEvt(this, TIMEOUT_SIG) -{} -//............................................................................ -Q_STATE_DEF(Philo, initial) { - subscribe(EAT_SIG); - - return tran(&thinking); -} -//............................................................................ -Q_STATE_DEF(Philo, thinking) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(THINK_TIME); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&hungry); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, hungry) { - switch (e->sig) { - case Q_ENTRY_SIG: { - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoNum = PHILO_ID(this); - AO_Table->POST(pe, this); - return Q_RET_HANDLED; - } - case EAT_SIG: { - if (((TableEvt *)e)->philoNum == PHILO_ID(this)) { - return tran(&eating); - } - break; - } - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, eating) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(EAT_TIME); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoNum = PHILO_ID(this); - QF::PUBLISH(pe, this); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&thinking); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} - diff --git a/examples/emwin/demo_with_wm/sim_x.cpp b/examples/emwin/demo_with_wm/sim_x.cpp deleted file mode 100644 index 26d268156..000000000 --- a/examples/emwin/demo_with_wm/sim_x.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** -* Product: Initialization for emWin/uC/GUI, Win32 simulation VC++ -// Last updated for version 6.8.0 -// Last updated on 2020-01-22 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -*****************************************************************************/ -extern "C" { - -#include "GUI.h" -#include "LCD_SIM.h" - -void SIM_X_Init() { - if (((LCD_GetDevCap(LCD_DEVCAP_XSIZE) * LCD_GetXMag()) == 320) - && ((LCD_GetDevCap(LCD_DEVCAP_YSIZE) * LCD_GetYMag()) == 240) - && (LCD_GetNumLayers() == 1)) - { - SIM_GUI_SetLCDPos(132, 46); // position of the LCD in the bitmap */ - SIM_GUI_SetTransColor(0xFF0000); // transparent color */ - SIM_GUI_SetLCDColorBlack(0, 0x000000); // "black" color */ - SIM_GUI_SetLCDColorWhite(0, 0xC0C0C0); // "white" color */ - } -} - -} // extern "C" diff --git a/examples/emwin/demo_with_wm/simulation.res b/examples/emwin/demo_with_wm/simulation.res deleted file mode 100644 index b25b693703e0409908dfe9dbbb200291d96de2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043100 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≀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
pSRGAq>l*OuHqxFh|S@0$Jc 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. -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -extern "C" { - #include "GUI.h" - #include "LCD_SIM.h" - #include "DIALOG.h" - #include "WM.h" // emWin Windows Manager -} - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Table : public QActive { -private: - uint8_t m_fork[N_PHILO]; - uint8_t m_isHungry[N_PHILO]; - -public: - Table(); - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(ready); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; - -#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO)) -#define LEFT(n_) ((uint8_t)(((n_) + 1) % N_PHILO)) -enum m_forkState { FREE, USED }; - -// Local objects ------------------------------------------------------------- -static Table l_table; // local Table object - -// Public-scope objects ------------------------------------------------------ -QActive * const AO_Table = &l_table; // "opaque" AO pointer - - -// GUI definition ============================================================ -static WM_HWIN l_hDlg; -static WM_CALLBACK *l_cb_WM_HBKWIN; - -static const GUI_WIDGET_CREATE_INFO l_dialog[] = { - { &FRAMEWIN_CreateIndirect, "Dining Philosopher Problem", - 0, 30, 30, 260, 180, FRAMEWIN_CF_MOVEABLE }, - { &TEXT_CreateIndirect, "Philosopher 0", - GUI_ID_TEXT9, 50, 10, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "Philosopher 1", - GUI_ID_TEXT9, 50, 30, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "Philosopher 2", - GUI_ID_TEXT9, 50, 50, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "Philosopher 3", - GUI_ID_TEXT9, 50, 70, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "Philosopher 4", - GUI_ID_TEXT9, 50, 90, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "Table", - GUI_ID_TEXT9, 50, 110, 0, 0, TEXT_CF_LEFT }, - - { &TEXT_CreateIndirect, "thinking", - GUI_ID_TEXT0, 130, 10, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "thinking", - GUI_ID_TEXT1, 130, 30, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "thinking", - GUI_ID_TEXT2, 130, 50, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "thinking", - GUI_ID_TEXT3, 130, 70, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "thinking", - GUI_ID_TEXT4, 130, 90, 0, 0, TEXT_CF_LEFT }, - { &TEXT_CreateIndirect, "serving", - GUI_ID_TEXT5, 130, 110, 0, 0, TEXT_CF_LEFT }, - - { &BUTTON_CreateIndirect,"PAUSE", - GUI_ID_BUTTON0, 160, 130, 80, 30 } -}; - -//............................................................................ -static void onMainWndGUI(WM_MESSAGE* pMsg) { - switch (pMsg->MsgId) { - case WM_PAINT: { - GUI_SetBkColor(GUI_GRAY); - GUI_Clear(); - GUI_SetColor(GUI_BLACK); - GUI_SetFont(&GUI_Font24_ASCII); - GUI_DispStringHCenterAt("Dining Philosophers - Demo", 160, 5); - break; - } - default: { - WM_DefaultProc(pMsg); - break; - } - } -} -//............................................................................ -static void onDialogGUI(WM_MESSAGE * pMsg) { - switch (pMsg->MsgId) { - case WM_INIT_DIALOG: { - break; - } - case WM_NOTIFY_PARENT: { - switch (pMsg->Data.v) { - case WM_NOTIFICATION_RELEASED: { // react only if released - switch (WM_GetId(pMsg->hWinSrc)) { - case GUI_ID_BUTTON0: { - // static PAUSE event for the Table AO - static QEvt const pauseEvt = { PAUSE_SIG, 0 }; - AO_Table->POST(&pauseEvt, &l_onDialogGUI); - break; - } - } - break; - } - } - break; - } - default: { - WM_DefaultProc(pMsg); - break; - } - } -} -//............................................................................ -static void displyPhilStat(uint8_t n, char const *stat) { - TEXT_SetText(WM_GetDialogItem(l_hDlg, GUI_ID_TEXT0 + n), stat); - WM_Exec(); // update the screen and invoke WM callbacks - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -static void displyTableStat(char const *stat) { - TEXT_SetText(WM_GetDialogItem(l_hDlg, GUI_ID_TEXT5), stat); - WM_Exec(); // update the screen and invoke WM callbacks - - QS_BEGIN_ID(TABLE_STAT, AO_Table->getPrio()) // app-specific record begin - QS_STR(stat); // Philosopher status - QS_END() -} - -//............................................................................ -Table::Table() : QActive((QStateHandler)&Table::initial) { - uint8_t n; - for (n = 0; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = 0; - } -} -//............................................................................ -Q_STATE_DEF(Table, initial) { - - GUI_Init(); // initialize the embedded GUI - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - - return tran(&ready); -} -//............................................................................ -Q_STATE_DEF(Table, ready) { - switch (e->sig) { - case Q_ENTRY_SIG: { - l_cb_WM_HBKWIN = WM_SetCallback(WM_HBKWIN, &onMainWndGUI); - // create the diaglog box and return right away... - l_hDlg = GUI_CreateDialogBox(l_dialog, GUI_COUNTOF(l_dialog), - &onDialogGUI, 0, 0, 0); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - GUI_EndDialog(l_hDlg, 0); - WM_SetCallback(WM_HBKWIN, l_cb_WM_HBKWIN); - return Q_RET_HANDLED; - } - case Q_INIT_SIG: { - return tran(&serving); - } - - case MOUSE_CHANGE_SIG: { // mouse change (move or click) event - GUI_PID_STATE mouse; - mouse.x = Q_EVT_CAST(MouseEvt)->x; - mouse.y = Q_EVT_CAST(MouseEvt)->y; - mouse.Pressed = Q_EVT_CAST(MouseEvt)->Pressed; - mouse.Layer = Q_EVT_CAST(MouseEvt)->Layer; - GUI_PID_StoreState(&mouse); // update the state of the Mouse PID - - WM_Exec(); // update the screen and invoke WM callbacks - return Q_RET_HANDLED; - } - - // ... hardkey events ... - case KEY_LEFT_REL_SIG: { // hardkey LEFT released - WM_MoveWindow(l_hDlg, -5, 0); - WM_Exec(); // update the screen and invoke WM callbacks - return Q_RET_HANDLED; - } - case KEY_RIGHT_REL_SIG: { // hardkey RIGHT released - WM_MoveWindow(l_hDlg, 5, 0); - WM_Exec(); // update the screen and invoke WM callbacks - return Q_RET_HANDLED; - } - case KEY_DOWN_REL_SIG: { // hardkey DOWN released - WM_MoveWindow(l_hDlg, 0, 5); - WM_Exec(); // update the screen and invoke WM callbacks - return Q_RET_HANDLED; - } - case KEY_UP_REL_SIG: { // hardkey UP released - WM_MoveWindow(l_hDlg, 0, -5); - WM_Exec(); // update the screen and invoke WM callbacks - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Table, serving) { - uint8_t n, m; - TableEvt *pe; - - switch (e->sig) { - case Q_ENTRY_SIG: { - displyTableStat("serving"); - for (n = 0; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = m_fork[n] = USED; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QF::PUBLISH(pe, me); - m_isHungry[n] = 0; - displyPhilStat(n, "eating "); - } - } - return Q_RET_HANDLED; - } - case HUNGRY_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO && !m_isHungry[n]); - displyPhilStat(n, "hungry "); - m = LEFT(n); - if (m_fork[m] == FREE && m_fork[n] == FREE) { - m_fork[m] = m_fork[n] = USED; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QF::PUBLISH(pe, me); - displyPhilStat(n, "eating "); - } - else { - m_isHungry[n] = 1; - } - return Q_RET_HANDLED; - } - case DONE_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO); - displyPhilStat(n, "thinking"); - m_fork[LEFT(n)] = m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - if (m_isHungry[m] && m_fork[m] == FREE) { - m_fork[n] = m_fork[m] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, me); - displyPhilStat(m, "eating "); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); - if (m_isHungry[m] && m_fork[n] == FREE) { - m_fork[m] = m_fork[n] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, me); - displyPhilStat(m, "eating "); - } - return Q_RET_HANDLED; - } - case PAUSE_SIG: // "Toggle" button pressed - case KEY_CENTER_PRESS_SIG: { // hardkey CENTER pressed - return tran(&paused); - } - } - return super(&ready); -} -//............................................................................ -Q_STATE_DEF(Table, paused) { - uint8_t n; - - switch (e->sig) { - case Q_ENTRY_SIG: { - displyTableStat("paused"); - return Q_RET_HANDLED; - } - case HUNGRY_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO && !m_isHungry[n]); - displyPhilStat(n, "hungry "); - m_isHungry[n] = 1; - return Q_RET_HANDLED; - } - case DONE_SIG: { - n = ((TableEvt *)e)->philoNum; - Q_ASSERT(n < N_PHILO); - displyPhilStat(n, "thinking"); - m_fork[LEFT(n)] = m_fork[n] = FREE; - return Q_RET_HANDLED; - } - case PAUSE_SIG: // "Toggle" button pressed - case KEY_CENTER_REL_SIG: { // hardkey CENTER released - return tran(&serving); - } - } - return super(&ready); -} diff --git a/examples/emwin/demo_with_wm/winmain.cpp b/examples/emwin/demo_with_wm/winmain.cpp deleted file mode 100644 index 063b9544b..000000000 --- a/examples/emwin/demo_with_wm/winmain.cpp +++ /dev/null @@ -1,42 +0,0 @@ -//============================================================================ -// Product: WinMain for emWin/uC/GUI, Win32 simulation VC++ 6.0 -// Last updated for version 5.8.2 -// Last updated on 2017-01-15 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include -#include "GUI_SIM_Win32.h" - -//............................................................................ -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) -{ - return SIM_GUI_App(hInstance, lpCmdLine); -} diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h deleted file mode 100644 index 9ae0fc5d1..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/FreeRTOSConfig.h +++ /dev/null @@ -1,116 +0,0 @@ -// Modified by Quantum Leaps -// -// -// FreeRTOS Kernel V10.0.1 -// Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// http://www.FreeRTOS.org -// http://aws.amazon.com/freertos -// -// 1 tab == 4 spaces! -// - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -//----------------------------------------------------------- -// Application specific definitions. -// -// These definitions should be adjusted for your particular hardware and -// application requirements. -// -// THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE -// FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. -// -// See http://www.freertos.org/a00110.html. -// ---------------------------------------------------------- - -#define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 1 -#define configCPU_CLOCK_HZ ( SystemCoreClock ) -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 0 ) ) -#define configMAX_TASK_NAME_LEN ( 8 ) -#define configUSE_TRACE_FACILITY 0 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 0 -#define configUSE_CO_ROUTINES 0 -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configCHECK_FOR_STACK_OVERFLOW 2 -#define configUSE_QUEUE_SETS 0 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_MALLOC_FAILED_HOOK 0 - -#define configMAX_PRIORITIES ( 32UL ) -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) -#define configQUEUE_REGISTRY_SIZE 10 -#define configSUPPORT_DYNAMIC_ALLOCATION 0 -#define configSUPPORT_STATIC_ALLOCATION 1 - -// Timer related defines. -#define configUSE_TIMERS 0 -#define configTIMER_TASK_PRIORITY 2 -#define configTIMER_QUEUE_LENGTH 20 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) - -// Set the following definitions to 1 to include the API function, or zero -// to exclude the API function. - -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 0 -#define INCLUDE_vTaskDelayUntil 0 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 -#define INCLUDE_xTaskGetIdleTaskHandle 0 -#define INCLUDE_xSemaphoreGetMutexHolder 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xTimerPendFunctionCall 0 - -#define configKERNEL_INTERRUPT_PRIORITY ( 7 << 5 ) // Priority 7, or 255 as only the top three bits are implemented. This is the lowest priority. -// !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! -// See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. -#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << 5 ) // Priority 5, or 160 as only the top three bits are implemented. - -// Use the Cortex-M3 optimised task selection rather than the generic C code -// version. -#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 - -// Prevent the inclusion of items the assembler will not understand in assembly files. -#ifndef __IAR_SYSTEMS_ASM__ - #define configASSERT( x ) if( ( x ) == 0 ) assert_failed( __FILE__, __LINE__ ); - - void assert_failed(char const * const module, int const id); - extern uint32_t SystemCoreClock; -#endif - -// Map the FreeRTOS port interrupt handlers to their CMSIS standard names. -#define vPortSVCHandler SVC_Handler -#define xPortPendSVHandler PendSV_Handler -#define xPortSysTickHandler SysTick_Handler - -#endif // FREERTOS_CONFIG_H diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/README.md b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/README.md deleted file mode 100644 index 7346acd18..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/README.md +++ /dev/null @@ -1,5 +0,0 @@ -![EK-TM4C123GXL](../../../../doxygen/images/bd_EK-TM4C123GXL.jpg) - -Documentation for this example is available in the QP/C Manual at: - -- https://www.state-machine.com/qpcpp/freertos_dpp_ek-tm4c123gxl.html diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx deleted file mode 100644 index 0190a72bf..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx +++ /dev/null @@ -1,1047 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 0 - 1 - OSTCBPrioTbl - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\FreeRTOSConfig.h - FreeRTOSConfig.h - 0 - 0 - - - 1 - 5 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\table.cpp - table.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 9 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - 2 - 14 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 15 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\freertos\qf_port.cpp - qf_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - - FreeRTOS - 1 - 0 - 0 - 0 - - 6 - 31 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - list.c - 0 - 0 - - - 6 - 32 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - queue.c - 0 - 0 - - - 6 - 33 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - tasks.c - 0 - 0 - - - - - FreeRTOS_port - 1 - 0 - 0 - 0 - - 7 - 34 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F\port.c - port.c - 0 - 0 - - - -
diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx deleted file mode 100644 index 3198603b3..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx +++ /dev/null @@ -1,1898 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp.bin .\dbg\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F;..\..\..\..\..\3rd_party\ek-tm4c123gxl;..\..\..\..\..\3rd_party\CMSIS\Include - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F\port.c - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp.bin .\rel\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F;..\..\..\..\..\3rd_party\ek-tm4c123gxl;..\..\..\..\..\3rd_party\CMSIS\Include - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F\port.c - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp.bin .\spy\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY,QP_CONFIG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F;..\..\..\..\..\3rd_party\ek-tm4c123gxl;..\..\..\..\..\3rd_party\CMSIS\Include - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM4F\port.c - - - - - - - - - - - - - -
diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp deleted file mode 100644 index 6ab7a49b8..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp +++ /dev/null @@ -1,583 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, FreeRTOS kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -// "RTOS-aware" interrupt priorities for FreeRTOS on ARM Cortex-M, NOTE1 -constexpr std::uint32_t RTOS_AWARE_ISR_CMSIS_PRI - {configMAX_SYSCALL_INTERRUPT_PRIORITY >> (8-__NVIC_PRIO_BITS)}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_TickHook = { 0U }; - QP::QSpyId const l_GPIOPortA_IRQHandler = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -// NOTE: only the "FromISR" FreeRTOS API variants are allowed in the ISRs! - -void GPIOPortA_IRQHandler(void); // prototype -void GPIOPortA_IRQHandler(void) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - // for testing... - APP::AO_Table->POST_FROM_ISR( - Q_NEW_FROM_ISR(QP::QEvt, APP::MAX_PUB_SIG), - &xHigherPriorityTaskWoken, - &l_GPIOPortA_IRQHandler); - - // the usual end of FreeRTOS ISR... - portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); -} -//............................................................................ -#ifdef Q_SPY - -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the FreeRTOS or QP and is not disabled. Such ISRs don't need to call -// portEND_SWITCHING_ISR(() at the end, but they also cannot call any -// FreeRTOS or QP APIs. -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - uint32_t b = UART0->DR; - QP::QS::rxPut(b); - } -} - -#endif // Q_SPY - -// Application hooks used in this project ==================================== -// NOTE: only the "FromISR" API variants are allowed in vApplicationTickHook - -void vApplicationTickHook(void) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - // process time events at rate 0 - QP::QTimeEvt::TICK_X_FROM_ISR(0U, &xHigherPriorityTaskWoken, &l_TickHook); - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH_FROM_ISR(&pauseEvt, - &xHigherPriorityTaskWoken, - &l_TickHook); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH_FROM_ISR(&serveEvt, - &xHigherPriorityTaskWoken, - &l_TickHook); - } - } - - // notify FreeRTOS to perform context switch from ISR, if needed - portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); -} -//............................................................................ -void vApplicationIdleHook(void) { - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QP::QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - uint8_t const *block; - - QF_INT_DISABLE(); - block = QP::QS::getBlock(&fifo); // try to get next block to transmit - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} -//............................................................................ -void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) { - (void)xTask; - (void)pcTaskName; - Q_ERROR(); -} -//............................................................................ -// configSUPPORT_STATIC_ALLOCATION is set to 1, so the application must -// provide an implementation of vApplicationGetIdleTaskMemory() to provide -// the memory that is used by the Idle task. -void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, - StackType_t **ppxIdleTaskStackBuffer, - uint32_t *pulIdleTaskStackSize ) -{ - // If the buffers to be provided to the Idle task are declared inside - // this function then they must be declared static - otherwise they will - // be allocated on the stack and so not exists after this function exits. - // - static StaticTask_t xIdleTaskTCB; - static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; - - // Pass out a pointer to the StaticTask_t structure in which the - // Idle task's state will be stored. - *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; - - // Pass out the array that will be used as the Idle task's stack. - *ppxIdleTaskStackBuffer = uxIdleTaskStack; - - // Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. - // Note that, as the array is necessarily of type StackType_t, - // configMINIMAL_STACK_SIZE is specified in words, not bytes. - // - *pulIdleTaskStackSize = Q_DIM(uxIdleTaskStack); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: VFP (hardware Floating Point) unit is configured by FreeRTOS - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_TickHook); - QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static StackType_t philoStack[APP::N_PHILO][configMINIMAL_STACK_SIZE]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QP prio. of the AO - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStack[n], // stack storage - sizeof(philoStack[n])); // stack size [bytes] - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static StackType_t tableStack[configMINIMAL_STACK_SIZE]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStack, // stack storage - sizeof(tableStack)); // stack size [bytes] -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - vTaskSuspendAll(); // lock FreeRTOS scheduler - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - xTaskResumeAll(); // unlock the FreeRTOS scheduler - - return (rnd >> 8); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - //SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); // done in FreeRTOS - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIOA_IRQn, RTOS_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, RTOS_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIOA_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - std::uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TXF has data to transmit - while ((UART0->FR & UART_FR_TXFE) == 0U) { - } - // place the byte in the UART DR register - UART0->DR = b; - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY constant from the -// FreeRTOS configuration file specifies the highest ISR priority that -// is disabled by the QF framework. The value is suitable for the -// NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY level (i.e., -// with the numerical values of priorities equal or higher than -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY) are allowed to call any -// QP/FreeRTOS services. These ISRs are "kernel-aware". -// -// Conversely, any ISRs prioritized above the -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY priority level (i.e., with -// the numerical values of priorities less than -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY) are never disabled and are -// not aware of the kernel. Such "kernel-unaware" ISRs cannot call any -// QP/FreeRTOS services. The only mechanism by which a "kernel-unaware" ISR -// can communicate with the QF framework is by triggering a "kernel-aware" -// ISR, which can post/publish events. -// -// For more information, see article "Running the RTOS on a ARM Cortex-M Core" -// http://www.freertos.org/RTOS-Cortex-M3-M4.html -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index ba101c8be..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {configTICK_RATE_HZ}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile deleted file mode 100644 index 14accab2c..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile +++ /dev/null @@ -1,320 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, FreeRTOS-Kernel, GNU-ARM -# Last Updated for Version: 7.2.2 -# Date of the Last Update: 2023-03-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# location of the FREERTOS (if not provided in an environment var.) -ifeq ($(FREERTOS),) -FREERTOS := $(QPCPP)/3rd_party/FreeRTOS-Kernel -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/freertos - -# list of all source directories used by this project -VPATH = \ - .. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(FREERTOS) \ - $(FREERTOS)/portable/GCC/ARM_CM4F \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(FREERTOS)/include \ - -I$(FREERTOS)/portable/GCC/ARM_CM4F \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -RTOS_SRCS := \ - tasks.c \ - queue.c \ - list.c \ - port.c - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) -C_SRCS += $(RTOS_SRCS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt deleted file mode 100644 index 64b4d187a..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gcc\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld deleted file mode 100644 index a2e7e5003..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld +++ /dev/null @@ -1,135 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for EK-TM4C123GXL, GNU-ARM -* Last Updated for Version: 5.4.0 -* Date of the Last Update: 2015-04-20 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Web : http://www.state-machine.com -* Email: info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 512; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd deleted file mode 100644 index ac11f1532..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp deleted file mode 100644 index db509ae2b..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp +++ /dev/null @@ -1,3385 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\FreeRTOSConfig.h - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - FreeRTOS - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM4F\port.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM4F\portasm.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM4F\portmacro.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qf_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww deleted file mode 100644 index 461ce6e06..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp.ewp - - - - - diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/main.cpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/philo.cpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp deleted file mode 100644 index d6dc3542c..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/qp_config.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -#define QF_MAX_ACTIVE configMAX_PRIORITIES - -#endif // QP_CONFIG_HPP_ diff --git a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/table.cpp b/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/freertos/arm-cm/dpp_ek-tm4c123gxl/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h b/examples/freertos/arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h deleted file mode 100644 index f0d415c32..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/FreeRTOSConfig.h +++ /dev/null @@ -1,135 +0,0 @@ -// Modified by Quantum Leaps -// -// -// FreeRTOS Kernel V10.0.1 -// Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// http://www.FreeRTOS.org -// http://aws.amazon.com/freertos -// -// 1 tab == 4 spaces! -// - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -//----------------------------------------------------------- -// Application specific definitions. -// -// These definitions should be adjusted for your particular hardware and -// application requirements. -// -// THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE -// FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. -// -// See http://www.freertos.org/a00110.html. -// ---------------------------------------------------------- - -#define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 1 -#define configCPU_CLOCK_HZ ( SystemCoreClock ) -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 0 ) ) -#define configMAX_TASK_NAME_LEN ( 8 ) -#define configUSE_TRACE_FACILITY 0 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 0 -#define configUSE_CO_ROUTINES 0 -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configCHECK_FOR_STACK_OVERFLOW 2 -#define configUSE_QUEUE_SETS 0 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_MALLOC_FAILED_HOOK 0 - -#define configMAX_PRIORITIES ( 32UL ) -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) -#define configQUEUE_REGISTRY_SIZE 10 -#define configSUPPORT_DYNAMIC_ALLOCATION 0 -#define configSUPPORT_STATIC_ALLOCATION 1 - -// Timer related defines. -#define configUSE_TIMERS 0 -#define configTIMER_TASK_PRIORITY 2 -#define configTIMER_QUEUE_LENGTH 20 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) - -// Set the following definitions to 1 to include the API function, or zero -// to exclude the API function. - -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 0 -#define INCLUDE_vTaskDelayUntil 0 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 -#define INCLUDE_xTaskGetIdleTaskHandle 0 -#define INCLUDE_xSemaphoreGetMutexHolder 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xTimerPendFunctionCall 0 - -// Cortex-M specific definitions. -#ifdef __NVIC_PRIO_BITS - // __BVIC_PRIO_BITS will be specified when CMSIS is being used. - #define configPRIO_BITS __NVIC_PRIO_BITS -#else - #define configPRIO_BITS 4 // 15 priority levels -#endif - -// The lowest interrupt priority that can be used in a call to a "set priority" -// function. -#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 - -// The highest interrupt priority that can be used by any interrupt service -// routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL -// INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER -// PRIORITY THAN THIS! (higher priorities are lower numeric values. -#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 4 - -// Interrupt priorities used by the kernel port layer itself. These are generic -// to all Cortex-M ports, and do not rely on any particular library functions. -#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -// !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! -// See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. -#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) - -// Definitions that map the FreeRTOS port interrupt handlers to their CMSIS -// standard names. -#define xPortPendSVHandler PendSV_Handler -#define vPortSVCHandler SVC_Handler -#define xPortSysTickHandler SysTick_Handler - -// Prevent the inclusion of items the assembler will not understand in assembly files. -#ifndef __IAR_SYSTEMS_ASM__ - - extern uint32_t SystemCoreClock; - - // Normal assert() semantics without relying on the provision of an assert.h header file. - void assert_failed(char const * const module, int const id); - #define configASSERT( x ) if( ( x ) == 0 ) assert_failed( __FILE__, __LINE__ ); -#endif // __IAR_SYSTEMS_ASM__ - -#endif // FREERTOS_CONFIG_H diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvoptx b/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvoptx deleted file mode 100644 index a96c8c6d3..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvoptx +++ /dev/null @@ -1,1180 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dbg-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O207 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 6 - - - - - - - - - - - STLink\ST-LINKIII-KEIL_SWO.dll - - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - ST-LINKIII-KEIL_SWO - -U0675FF504955857567065746 -O8399 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32H7x_2048.FLM -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM) - - - 0 - DLGUARM - (105=-1,-1,-1,-1,0) - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 0 - 0 - 2 - 10000000 - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\stm32h7xx_hal_conf.h - stm32h7xx_hal_conf.h - 0 - 0 - - - 1 - 2 - 1 - 0 - 0 - 0 - ..\stm32h7xx_hal_msp.c - stm32h7xx_hal_msp.c - 0 - 0 - - - 1 - 3 - 5 - 0 - 0 - 0 - ..\FreeRTOSConfig.h - FreeRTOSConfig.h - 0 - 0 - - - 1 - 4 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 6 - 5 - 0 - 0 - 0 - ..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 9 - 8 - 0 - 0 - 0 - ..\table.cpp - table.cpp - 0 - 0 - - - - - nucleo-h743zi - 0 - 0 - 0 - 0 - - 2 - 10 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - startup_stm32h743xx.s - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - stm32h7xx_nucleo_144.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - system_stm32h7xx.c - 0 - 0 - - - - - STM32H7xx_HAL_Driver - 0 - 0 - 0 - 0 - - 3 - 13 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - stm32h7xx_hal_uart.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - stm32h7xx_hal.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - stm32h7xx_hal_cortex.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - stm32h7xx_hal_dma.c - 0 - 0 - - - 3 - 17 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - stm32h7xx_hal_gpio.c - 0 - 0 - - - 3 - 18 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - stm32h7xx_hal_pwr.c - 0 - 0 - - - 3 - 19 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - stm32h7xx_hal_rcc.c - 0 - 0 - - - 3 - 20 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - stm32h7xx_hal_rcc_ex.c - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 4 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 4 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 4 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 4 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 4 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 4 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 4 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 4 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 4 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - 4 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\freertos\qf_port.cpp - qf_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 6 - 33 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 6 - 34 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 6 - 35 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 6 - 36 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 6 - 37 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - - FreeRTOS - 1 - 0 - 0 - 0 - - 7 - 38 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - list.c - 0 - 0 - - - 7 - 39 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - queue.c - 0 - 0 - - - 7 - 40 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - tasks.c - 0 - 0 - - - - - FreeRTOS_port - 1 - 0 - 0 - 0 - - 8 - 41 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\port.c - port.c - 0 - 0 - - - 8 - 42 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\portmacro.h - portmacro.h - 0 - 0 - - - -
diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvprojx b/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvprojx deleted file mode 100644 index c11b6e31b..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/armclang/dpp.uvprojx +++ /dev/null @@ -1,2114 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\dbg\qstamp.o del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp.bin .\dbg\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - QP_CONFIG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - stm32h7xx_hal_conf.h - 5 - ..\stm32h7xx_hal_conf.h - - - stm32h7xx_hal_msp.c - 1 - ..\stm32h7xx_hal_msp.c - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\port.c - - - portmacro.h - 5 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\portmacro.h - - - - - - - dbg-rel - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp - 1 - 0 - 0 - 0 - 1 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\rel\qstamp.o del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp.bin .\rel\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG,QP_CONFIG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - stm32h7xx_hal_conf.h - 5 - ..\stm32h7xx_hal_conf.h - - - stm32h7xx_hal_msp.c - 1 - ..\stm32h7xx_hal_msp.c - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\port.c - - - portmacro.h - 5 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\portmacro.h - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6190000::V6.19::ARMCLANG - 1 - - - STM32H743ZITx - STMicroelectronics - Keil.STM32H7xx_DFP.3.1.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00200000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H743ZITx$CMSIS\Flash\STM32H7x_2048.FLM)) - 0 - $$Device:STM32H743ZITx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h - - - - - - - - - - $$Device:STM32H743ZITx$CMSIS\SVD\STM32H7x3.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "if exist .\spy\qstamp.o del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp.bin .\spy\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP -MPU - DCM.DLL - -pCM7 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM7 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4096 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M7" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 3 - 0 - 0 - 0 - 1 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 4 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x200000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x200000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x24000000 - 0x80000 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 0 - 0 - - -Wno-padded - Q_SPY,QP_CONFIG,STM32H743xx,USE_HAL_DRIVER,USE_STM32H7XX_NUCLEO_144 - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\freertos;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\include;..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST/STM32H7xx\Include;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144;..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - stm32h7xx_hal_conf.h - 5 - ..\stm32h7xx_hal_conf.h - - - stm32h7xx_hal_msp.c - 1 - ..\stm32h7xx_hal_msp.c - - - FreeRTOSConfig.h - 5 - ..\FreeRTOSConfig.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - nucleo-h743zi - - - startup_stm32h743xx.s - 2 - ..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\arm\startup_stm32h743xx.s - - - stm32h7xx_nucleo_144.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - system_stm32h7xx.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - - STM32H7xx_HAL_Driver - - - stm32h7xx_hal_uart.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - stm32h7xx_hal.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - stm32h7xx_hal_cortex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - stm32h7xx_hal_dma.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c - - - stm32h7xx_hal_gpio.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - stm32h7xx_hal_pwr.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - stm32h7xx_hal_rcc.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - stm32h7xx_hal_rcc_ex.c - 1 - ..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\freertos\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 3 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - FreeRTOS - - - list.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - queue.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - tasks.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - - FreeRTOS_port - - - port.c - 1 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\port.c - - - portmacro.h - 5 - ..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\GCC\ARM_CM7\r0p1\portmacro.h - - - - - - - - - - - - - - - - - dpp - 1 - - - - -
diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.cpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.cpp deleted file mode 100644 index fb18299e3..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.cpp +++ /dev/null @@ -1,571 +0,0 @@ -//============================================================================ -// Product: DPP example, NUCLEO-H743ZI board, FreeRTOS kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -// STM32CubeH7 include files -//#include "stm32h7xx_it.h" - -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// "RTOS-aware" interrupt priorities for FreeRTOS on ARM Cortex-M, NOTE1 -constexpr std::uint32_t RTOS_AWARE_ISR_CMSIS_PRI - {configMAX_SYSCALL_INTERRUPT_PRIORITY >> (8-__NVIC_PRIO_BITS)}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_TickHook = { 0U }; - QP::QSpyId const l_EXTI0_IRQHandler = { 0U }; - - static UART_HandleTypeDef l_uartHandle; - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up LED - BSP_LED_On(LED1); - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== -// NOTE: only the "FromISR" API variants are allowed in the ISRs! - -void EXTI0_IRQHandler(void); // prototype -void EXTI0_IRQHandler(void) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - // for testing... - APP::AO_Table->POST_FROM_ISR( - Q_NEW_FROM_ISR(QP::QEvt, APP::MAX_PUB_SIG), - &xHigherPriorityTaskWoken, - &l_EXTI0_IRQHandler); - - // the usual end of FreeRTOS ISR... - portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); -} -//............................................................................ -#ifdef Q_SPY - -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the FreeRTOS or QP and is not disabled. Such ISRs don't need to call -// portEND_SWITCHING_ISR(() at the end, but they also cannot call any -// FreeRTOS or QP APIs. -void USART3_IRQHandler(void); // prototype -void USART3_IRQHandler(void) { - // is RX register NOT empty? - if ((l_uartHandle.Instance->ISR & USART_ISR_RXNE_RXFNE) != 0U) { - std::uint32_t b = l_uartHandle.Instance->RDR; - QP::QS::rxPut(b); - l_uartHandle.Instance->ISR &= ~USART_ISR_RXNE_RXFNE; // clear int. - } -} -#endif // Q_SPY - -// Application hooks used in this project ==================================== -// NOTE: only the "FromISR" API variants are allowed in vApplicationTickHook - -void vApplicationTickHook(void) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - // process time events at rate 0 - QP::QTimeEvt::TICK_X_FROM_ISR(0U, &xHigherPriorityTaskWoken, &l_TickHook); - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = BSP_PB_GetState(BUTTON_KEY); // read the Key button - std::uint32_t tmp = buttons.depressed; // save debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if (tmp != 0U) { // debounced Key button state changed? - if (current != 0U) { // is PB0 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH_FROM_ISR(&pauseEvt, - &xHigherPriorityTaskWoken, - &l_TickHook); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH_FROM_ISR(&serveEvt, - &xHigherPriorityTaskWoken, - &l_TickHook); - } - } - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - // notify FreeRTOS to perform context switch from ISR, if needed - portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); -} - -//............................................................................ -void vApplicationIdleHook(void) { - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - BSP_LED_On (LED3); - BSP_LED_Off(LED3); - QF_INT_ENABLE(); - - // Some floating point code is to exercise the VFP... - double volatile x = 1.73205; - x = x * 1.73205; - -#ifdef Q_SPY - QF_INT_DISABLE(); - QP::QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) != 0U) { // TXE empty? - QF_INT_DISABLE(); - uint16_t b = QP::QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - l_uartHandle.Instance->TDR = b; // put into TDR - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - // !!!CAUTION!!! - // The WFI instruction stops the CPU clock, which unfortunately disables - // the JTAG port, so the ST-Link debugger can no longer connect to the - // board. For that reason, the call to __WFI() has to be used with CAUTION. - // - // NOTE: If you find your board "frozen" like this, strap BOOT0 to VDD and - // reset the board, then connect with ST-Link Utilities and erase the part. - // The trick with BOOT(0) is it gets the part to run the System Loader - // instead of your broken code. When done disconnect BOOT0, and start over. - // - //__WFI(); // Wait-For-Interrupt -#endif -} -//............................................................................ -void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) { - (void)xTask; - (void)pcTaskName; - Q_ERROR(); -} -//............................................................................ -// configSUPPORT_STATIC_ALLOCATION is set to 1, so the application must -// provide an implementation of vApplicationGetIdleTaskMemory() to provide -// the memory that is used by the Idle task. -void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, - StackType_t **ppxIdleTaskStackBuffer, - uint32_t *pulIdleTaskStackSize ) -{ - // If the buffers to be provided to the Idle task are declared inside - // this function then they must be declared static - otherwise they will - // be allocated on the stack and so not exists after this function exits. - // - static StaticTask_t xIdleTaskTCB; - static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; - - // Pass out a pointer to the StaticTask_t structure in which the - // Idle task's state will be stored. - *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; - - // Pass out the array that will be used as the Idle task's stack. - *ppxIdleTaskStackBuffer = uxIdleTaskStack; - - // Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. - // Note that, as the array is necessarily of type StackType_t, - // configMINIMAL_STACK_SIZE is specified in words, not bytes. - // - *pulIdleTaskStackSize = Q_DIM(uxIdleTaskStack); -} - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: VFP (hardware Floating Point) unit is configured by FreeRTOS - - // enable clock for to the peripherals used by this application... - SCB_EnableICache(); // enable I-Cache - SCB_EnableDCache(); // enable D-Cache - - // configure Flash prefetch and Instr. cache through ART accelerator -#if (ART_ACCLERATOR_ENABLE != 0) - __HAL_FLASH_ART_ENABLE(); -#endif // ART_ACCLERATOR_ENABLE - - // Configure the LEDs - BSP_LED_Init(LED1); - BSP_LED_Init(LED2); - BSP_LED_Init(LED3); - - // configure the User Button in GPIO Mode - BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_TickHook); - QS_OBJ_DICTIONARY(&l_EXTI0_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static StackType_t philoStack[APP::N_PHILO][configMINIMAL_STACK_SIZE]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - Q_PRIO(n + 3U, 3U), // QP prio., FreeRTOS prio. - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStack[n], // stack storage - sizeof(philoStack[n])); // stack size [bytes] - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static StackType_t tableStack[configMINIMAL_STACK_SIZE]; - APP::AO_Table->start( - Q_PRIO(APP::N_PHILO + 7U, 7U), // QP prio., FreeRTOS prio. - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStack, // stack storage - sizeof(tableStack)); // stack size [bytes] -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - BSP_LED_On(LED1); - } - else { - BSP_LED_Off(LED1); - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused != 0U) { - BSP_LED_On(LED2); - } - else { - BSP_LED_Off(LED2); - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - double volatile x = 3.1415926; - x = x + 2.7182818; - - vTaskSuspendAll(); // lock FreeRTOS scheduler - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - xTaskResumeAll(); // unlock the FreeRTOS scheduler - - return (rnd >> 8); -} -//............................................................................ -void ledOn() { - BSP_LED_On(LED3); -} -//............................................................................ -void ledOff() { - BSP_LED_Off(LED3); -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - //SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); // done in FreeRTOS - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(USART3_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(EXTI0_IRQn, RTOS_AWARE_ISR_CMSIS_PRI + 0U); - NVIC_SetPriority(SysTick_IRQn, RTOS_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(EXTI0_IRQn); - -#ifdef Q_SPY - NVIC_EnableIRQ(USART3_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - l_uartHandle.Instance = USART3; - l_uartHandle.Init.BaudRate = 115200; - l_uartHandle.Init.WordLength = UART_WORDLENGTH_8B; - l_uartHandle.Init.StopBits = UART_STOPBITS_1; - l_uartHandle.Init.Parity = UART_PARITY_NONE; - l_uartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - l_uartHandle.Init.Mode = UART_MODE_TX_RX; - l_uartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&l_uartHandle) != HAL_OK) { - return 0U; // return failure - } - - // Set UART to receive 1 byte at a time via interrupt - HAL_UART_Receive_IT(&l_uartHandle, (uint8_t *)qsRxBuf, 1); - // NOTE: wait till QF::onStartup() to enable UART interrupt in NVIC - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TX FIFO has data to transmit - while ((l_uartHandle.Instance->ISR & UART_FLAG_TXE) == 0U) { - } - // place the byte in the UART TDR register - l_uartHandle.Instance->TDR = b; - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY constant from the -// FreeRTOS configuration file specifies the highest ISR priority that -// is disabled by the QF framework. The value is suitable for the -// NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY level (i.e., -// with the numerical values of priorities equal or higher than -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY) are allowed to call any -// QP/FreeRTOS services. These ISRs are "kernel-aware". -// -// Conversely, any ISRs prioritized above the -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY priority level (i.e., with -// the numerical values of priorities less than -// configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY) are never disabled and are -// not aware of the kernel. Such "kernel-unaware" ISRs cannot call any -// QP/FreeRTOS services. The only mechanism by which a "kernel-unaware" ISR -// can communicate with the QF framework is by triggering a "kernel-aware" -// ISR, which can post/publish events. -// -// For more information, see article "Running the RTOS on a ARM Cortex-M Core" -// http://www.freertos.org/RTOS-Cortex-M3-M4.html -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.hpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.hpp deleted file mode 100644 index ba101c8be..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/bsp.hpp +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {configTICK_RATE_HZ}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.hpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm b/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile b/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile deleted file mode 100644 index 05e8358ea..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/Makefile +++ /dev/null @@ -1,336 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI, FreeRTOS-Kernel, GNU-ARM -# Last Updated for Version: 7.2.2 -# Date of the Last Update: 2023-03-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# location of the FREERTOS (if not provided in an environment var.) -ifeq ($(FREERTOS),) -FREERTOS := $(QPCPP)/3rd_party/FreeRTOS-Kernel -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/freertos - -# list of all source directories used by this project -VPATH = \ - .. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(FREERTOS) \ - $(FREERTOS)/portable/GCC/ARM_CM7/r0p1 \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = \ - -I.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(FREERTOS)/include \ - -I$(FREERTOS)/portable/GCC/ARM_CM4F \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -RTOS_SRCS := \ - tasks.c \ - queue.c \ - list.c \ - port.c - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_CONFIG \ - -DSTM32H743xx \ - -DUSE_HAL_DRIVER \ - -DUSE_STM32H7XX_NUCLEO_144 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) -C_SRCS += $(RTOS_SRCS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/README.txt b/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/README.txt deleted file mode 100644 index 8f2566533..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/README.txt +++ /dev/null @@ -1,84 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4/M7 projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Programming the NUCLEO Board -============================ -The NUCLEO boards appear as a USB-flash drive in the file system. -Programming of the board is done by simply copying the binary into -thy flash drive letter. - -For example, assuming that the NUCLEO board appears as drive E:, -you program it with the following command: - -copy dbg\dpp.bin E: - - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GCC linker -script (.ld file), which provides a template of the recommended GCC linker -script for QP applications. - - -Startup Code -============ -The startup code for the STM32H743xx MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\nucleo-h743zi\gnu\startup_stm32h43xx.c - -The file startup_stm32h43xx.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld b/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld deleted file mode 100644 index 8b0e23630..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/gnu/dpp.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for STM32H743xx, GNU-ARM linker -* Last Updated for Version: 6.0.4 -* Date of the Last Update: 2018-01-30 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of STM32F746NG */ - ROM (rx) : ORIGIN = 0x08000000, LENGTH = 2048K - RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd b/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd deleted file mode 100644 index ba7c2c02b..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp deleted file mode 100644 index 1ce36830e..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.ewp +++ /dev/null @@ -1,3424 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\FreeRTOSConfig.h - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - FreeRTOS - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\list.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM7\r0p1\port.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM7\r0p1\portasm.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\portable\IAR\ARM_CM7\r0p1\portmacro.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\queue.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\FreeRTOS-Kernel\tasks.c - - - - nucleo-h743zi - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\nucleo-h743zi\iar\startup_stm32h743xx.s - - - $PROJ_DIR$\..\stm32h7xx_hal_conf.h - - - $PROJ_DIR$\..\stm32h7xx_hal_msp.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\BSP\STM32H7xx_Nucleo_144\stm32h7xx_nucleo_144.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qf_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\freertos\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - STM32H7xx_HAL_Driver - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\STM32CubeH7\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c - - - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww b/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww deleted file mode 100644 index 461ce6e06..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp.ewp - - - - - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf b/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf deleted file mode 100644 index 8d3950ccd..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/iar/dpp.icf +++ /dev/null @@ -1,84 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32h7xx.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_FLASH1_start__ = 0x08000000; -define symbol __ICFEDIT_region_FLASH1_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_FLASH2_start__ = 0x08100000; -define symbol __ICFEDIT_region_FLASH2_end__ = 0x081FFFFF; -define symbol __ICFEDIT_region_NORPSR_start__ = 0x0; -define symbol __ICFEDIT_region_NORPSR_end__ = 0x0; -define symbol __ICFEDIT_region_NAND_start__ = 0x0; -define symbol __ICFEDIT_region_NAND_end__ = 0x0; -define symbol __ICFEDIT_region_QSPI_start__ = 0x0; -define symbol __ICFEDIT_region_QSPI_end__ = 0x0; -define symbol __ICFEDIT_region_ITCMR_start__ = 0x00000000; -define symbol __ICFEDIT_region_ITCMR_end__ = 0x0000FFFF; -define symbol __ICFEDIT_region_DTCMR_start__ = 0x20000000; -define symbol __ICFEDIT_region_DTCMR_end__ = 0x2001FFFF; -define symbol __ICFEDIT_region_AXISR_start__ = 0x24000000; -define symbol __ICFEDIT_region_AXISR_end__ = 0x2407FFFF; -define symbol __ICFEDIT_region_SRAM1_start__ = 0x30000000; -define symbol __ICFEDIT_region_SRAM1_end__ = 0x3001FFFF; -define symbol __ICFEDIT_region_SRAM2_start__ = 0x30020000; -define symbol __ICFEDIT_region_SRAM2_end__ = 0x3003FFFF; -define symbol __ICFEDIT_region_SRAM3_start__ = 0x30040000; -define symbol __ICFEDIT_region_SRAM3_end__ = 0x30047FFF; -define symbol __ICFEDIT_region_SRAM4_start__ = 0x38000000; -define symbol __ICFEDIT_region_SRAM4_end__ = 0x3800FFFF; -define symbol __ICFEDIT_region_BKPR_start__ = 0x38800000; -define symbol __ICFEDIT_region_BKPR_end__ = 0x38800FFF; -define symbol __ICFEDIT_region_SDR1_start__ = 0x0; -define symbol __ICFEDIT_region_SDR1_end__ = 0x0; -define symbol __ICFEDIT_region_SDR2_start__ = 0x0; -define symbol __ICFEDIT_region_SDR2_end__ = 0x0; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_proc_stack__ = 0; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region FLASH_region = mem:[from __ICFEDIT_region_FLASH1_start__ to __ICFEDIT_region_FLASH1_end__] - | mem:[from __ICFEDIT_region_FLASH2_start__ to __ICFEDIT_region_FLASH2_end__]; -define region NORPSR_region = mem:[from __ICFEDIT_region_NORPSR_start__ to __ICFEDIT_region_NORPSR_end__]; -define region NAND_region = mem:[from __ICFEDIT_region_NAND_start__ to __ICFEDIT_region_NAND_end__ ]; -define region QSPI_region = mem:[from __ICFEDIT_region_QSPI_start__ to __ICFEDIT_region_QSPI_end__ ]; -define region ITCMR_region = mem:[from __ICFEDIT_region_ITCMR_start__ to __ICFEDIT_region_ITCMR_end__ ]; -define region DTCMR_region = mem:[from __ICFEDIT_region_DTCMR_start__ to __ICFEDIT_region_DTCMR_end__ ]; -define region AXISR_region = mem:[from __ICFEDIT_region_AXISR_start__ to __ICFEDIT_region_AXISR_end__ ]; -define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] - | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ] - | mem:[from __ICFEDIT_region_SRAM3_start__ to __ICFEDIT_region_SRAM3_end__ ] - | mem:[from __ICFEDIT_region_SRAM4_start__ to __ICFEDIT_region_SRAM4_end__ ]; -define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; -define region SDR_region = mem:[from __ICFEDIT_region_SDR1_start__ to __ICFEDIT_region_SDR1_end__ ] - | mem:[from __ICFEDIT_region_SDR2_start__ to __ICFEDIT_region_SDR2_end__ ]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) -{ - // Required in a multi-threaded application - initialize by copy with packing = none { section __DLIB_PERTHREAD }; -} - -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in FLASH_region { readonly }; -place in QSPI_region { readonly section application_specific_ro }; -//place in NORPSR_region { }; -//place in NAND_region { }; -place in ITCMR_region { section .textrw }; -place in DTCMR_region { section .dtcm_ram, block CSTACK, block PROC_STACK }; -place in SRAM_region { section .axi_sram, block HEAP }; -place in AXISR_region { readwrite }; -place in BKPR_region { section .backup_sram }; -place in SDR_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/main.cpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/philo.cpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/qp_config.hpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/qp_config.hpp deleted file mode 100644 index d6dc3542c..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/qp_config.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -#define QF_MAX_ACTIVE configMAX_PRIORITIES - -#endif // QP_CONFIG_HPP_ diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h b/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h deleted file mode 100644 index b8d883b84..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_conf.h +++ /dev/null @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file Demonstrations/Inc/stm32h7xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32h7xx_hal_conf.h. - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32H7xx_HAL_CONF_H -#define __STM32H7xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -/* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_COMP_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -#define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -#define HAL_EXTI_MODULE_ENABLED -/* #define HAL_FDCAN_MODULE_ENABLED */ -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -/* #define HAL_HASH_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_HRTIM_MODULE_ENABLED */ -/* #define HAL_HSEM_MODULE_ENABLED */ -/* #define HAL_I2C_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_JPEG_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_MDIOS_MODULE_ENABLED */ -/* #define HAL_MDMA_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_OPAMP_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -#define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_RAMECC_MODULE_ENABLED */ -#define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SWPMI_MODULE_ENABLED */ -/* #define HAL_TIM_MODULE_ENABLED */ -#define HAL_UART_MODULE_ENABLED -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal oscillator (CSI) default value. - * This value is the default CSI value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ -#endif /* LSE_VALUE */ - - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0F) /*!< tick interrupt priority */ -#define USE_RTOS 0 -/* #define USE_SD_TRANSCEIVER 1U */ /*!< use uSD Transceiver */ - -/* ########################### Ethernet Configuration ######################### */ -#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ -#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ - -#define ETH_MAC_ADDR0 ((uint8_t)0x02) -#define ETH_MAC_ADDR1 ((uint8_t)0x00) -#define ETH_MAC_ADDR2 ((uint8_t)0x00) -#define ETH_MAC_ADDR3 ((uint8_t)0x00) -#define ETH_MAC_ADDR4 ((uint8_t)0x00) -#define ETH_MAC_ADDR5 ((uint8_t)0x00) - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1 */ - - -/* ################## SPI peripheral configuration ########################## */ -/** - * @brief Used to activate CRC feature inside HAL SPI Driver - * Activated (1U): CRC code is compiled within HAL SPI driver - * Deactivated (0U): CRC code excluded from HAL SPI driver - */ - -#define USE_SPI_CRC 1U - - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32h7xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32h7xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32h7xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_MDMA_MODULE_ENABLED - #include "stm32h7xx_hal_mdma.h" -#endif /* HAL_MDMA_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32h7xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32h7xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32h7xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32h7xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32h7xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32h7xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32h7xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32h7xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED - #include "stm32h7xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32h7xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED - #include "stm32h7xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32h7xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32h7xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32h7xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32h7xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED - #include "stm32h7xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_HSEM_MODULE_ENABLED - #include "stm32h7xx_hal_hsem.h" -#endif /* HAL_HSEM_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32h7xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32h7xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32h7xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32h7xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32h7xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_JPEG_MODULE_ENABLED - #include "stm32h7xx_hal_jpeg.h" -#endif /* HAL_JPEG_MODULE_ENABLED */ - -#ifdef HAL_MDIOS_MODULE_ENABLED - #include "stm32h7xx_hal_mdios.h" -#endif /* HAL_MDIOS_MODULE_ENABLED */ - - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32h7xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32h7xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED -#include "stm32h7xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32h7xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32h7xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32h7xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RAMECC_MODULE_ENABLED - #include "stm32h7xx_hal_ramecc.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32h7xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32h7xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32h7xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32h7xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32h7xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32h7xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32h7xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_SWPMI_MODULE_ENABLED - #include "stm32h7xx_hal_swpmi.h" -#endif /* HAL_SWPMI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32h7xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32h7xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32h7xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32h7xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32h7xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED - #include "stm32h7xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32h7xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32h7xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32h7xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32H7xx_HAL_CONF_H */ - - diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c b/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c deleted file mode 100644 index 4b5cb97c0..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/stm32h7xx_hal_msp.c +++ /dev/null @@ -1,194 +0,0 @@ -/** - ****************************************************************************** - * @file UART/UART_WakeUpFromStopUsingFIFO/Src/stm32h7xx_hal_msp.c - * @author MCD Application Team - * @version V1.2.0 - * @date 29-December-2017 - * @brief HAL MSP module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2017 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -//#include "main.h" -#include "stm32h7xx_hal.h" -#include "stm32h7xx_nucleo_144.h" - -/** @addtogroup STM32H7xx_HAL_Examples - * @{ - */ - -/** @defgroup HAL_MSP - * @brief HAL MSP module. - * @{ - */ - -/* User can use this section to tailor USARTx/UARTx instance used and associated - resources */ -/* Definition for USARTx clock resources */ -#define USARTx USART3 -#define USARTx_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE() -#define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() - -#define USARTx_FORCE_RESET() __HAL_RCC_USART3_FORCE_RESET() -#define USARTx_RELEASE_RESET() __HAL_RCC_USART3_RELEASE_RESET() - -/* Definition for USARTx Pins */ -#define USARTx_TX_PIN GPIO_PIN_8 -#define USARTx_TX_GPIO_PORT GPIOD -#define USARTx_TX_AF GPIO_AF7_USART3 -#define USARTx_RX_PIN GPIO_PIN_9 -#define USARTx_RX_GPIO_PORT GPIOD -#define USARTx_RX_AF GPIO_AF7_USART3 - -/** @addtogroup STM32F7xx_HAL_Examples - * @{ - */ - -/** @defgroup UART_TwoBoards_ComPolling - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_MSP_Private_Functions - * @{ - */ - -/* NOTE: -* STM32Cube's initialization calls the weakly defined HAL_InitTick(), which -* by default configures and starts the Systick interrupt. This is TOO EARLY, -* because the system os NOT ready yet to handle interrupts. -* To avoid problems, a dummy definition for HAL_InitTick() is provided -* in the file stm32l5xx_hal_msp.c. The SystTick is configured and -* started later in QF_onStartup(). -*/ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - (void)TickPriority; /* unused parameter */ - return HAL_OK; -} - -/** - * @brief UART MSP Initialization - * This function configures the hardware resources used in this example: - * - Peripheral's clock enable - * - Peripheral's GPIO Configuration - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspInit(UART_HandleTypeDef *huart) { - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable GPIO TX/RX clock */ - USARTx_TX_GPIO_CLK_ENABLE(); - USARTx_RX_GPIO_CLK_ENABLE(); - - /* Enable USARTx clock */ - USARTx_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* UART TX GPIO pin configuration */ - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = USARTx_TX_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = USARTx_TX_AF; - HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct); - - /* UART RX GPIO pin configuration */ - GPIO_InitStruct.Pin = USARTx_RX_PIN; - GPIO_InitStruct.Alternate = USARTx_RX_AF; - HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct); - - /*##-3- Configure the NVIC for UART ########################################*/ - /* NVIC for USART */ - /* this is delayed till QF_onStartup() */ -} - -/** - * @brief UART MSP De-Initialization - * This function frees the hardware resources used in this example: - * - Disable the Peripheral's clock - * - Revert GPIO and NVIC configuration to their default state - * @param huart: UART handle pointer - * @retval None - */ -void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) -{ - /*##-1- Reset peripherals ##################################################*/ - USARTx_FORCE_RESET(); - USARTx_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure USART Tx as alternate function */ - HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN); - /* Configure USART Rx as alternate function */ - HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN); - - /*##-3- Disable the NVIC for UART ##########################################*/ - /* this is delayed till QF_onCleanup() */ -} - -/* dummy legacy callbacks for STM32CubeH7 */ -void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { - (void)huart; /* unused parameter */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/examples/freertos/arm-cm/dpp_nucleo-h743zi/table.cpp b/examples/freertos/arm-cm/dpp_nucleo-h743zi/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/freertos/arm-cm/dpp_nucleo-h743zi/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/README.txt b/examples/lwip/arm-cm/lwip_ek-lm3s6965/README.txt deleted file mode 100644 index 10b4728fc..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/README.txt +++ /dev/null @@ -1,232 +0,0 @@ -About this example -================== -This example application demonstrates the lightweight TCP/IP stack called lwIP -(version 1.4.1) running on top of the QP state machine framework, which are -both briefly described below. - -The example provides an HTTP server with simple Server Side Include (SSI) and -Common Gateway Interface (CGI) facility capability, so that dynamic web pages -can be served and the pages can send data or commands to the target. Internal -file system for web pages and a utility (qfsgen) for generating the -HTML-files and images is also provided. - -The example also demonstrates UDP. A UDP test application for a Windows or -Linux hosts is provided (qudp). - - -Building the QP-lwIP Example ----------------------------- -The sub-directories "arm", "gnu", and "iar" contain ready-to-use projects -Makefile for the GNU-ARM, and the IAR EWARM workspace, respectively. Please -run the make utility on the Makefile, or open the IAR workspace in IAR EWARM -IDE. - -*** -NOTE: The build process supports three build configurations: Debug, Release, -and Spy. Please refer to the Makefile or the IAR project to select the -desired build configuration. -*** - -*** -NOTE: This example pushes the limits of the free evaluation versions of the -development tools. The example will barely fit in the 64KB codesize limit -of the IAR EWARM KickStart (with the highest levels of optimization for -size), but unfortunately the Spy configuration will no longer link due to -exceeding the code size limit. Unfortunately also, the example won't compile -with the free evaluation MDK-ARM uVision, because it exceeds the 32KB limit -of this toolset. -*** - -*** -NOTE: -The QP-lwIP example code assume that you are using the EK-LM3S6965 board -Revision C or higher (please check the back of your board). At board Revision -C Luminary Micro changed the graphical OLED display from OSRAM to RITEK. -The provided RITEK driver won't work for the boards with the OSRAM display. -*** - - -Downloading the Code to the EK-LM3S6965 Board ---------------------------------------------- -The "gnu" sub-folder contains the flash.bat file to download the binary image -to the board. This batch file requires installation of the free LMFlash utility -from Texas Instruments. - -The IAR project in the "iar" sub-folder allows you to download and debug -the code on the board from the EWARM IDE. - - -Running the QP-lwIP Example ---------------------------- -Connect the EK-LM3S6965 board to the wired Ethernet and power it up by -plugging in the USB cable. Immediately after the power-up, you should see -the startup screen on the OLED-display. The status of the Dining Philosophers -should be changing. - -The example is currently configured to use DHCP to obtain the IP address, -so it assumes the presence of a DHCP server, such as a typical Ethernet -router. The IP address acquired from the DHCP will be displayed at the top -of the screen. You should type this IP address at your browser, for example: - -http://192.168.1.77 - -This should open an example website served by the EK-LM3S6965 board. This -website contains a few menu item for testing SSI, CGI, and UDP. Please -refer to the instructions on the website to test these features. - -NOTE: By modifying the lwipopts.h header file, the application can also be -configured to obtain the IP address via AUTOIP (as described in RFC 3927), -or to use a static IP address. - - -QS Software Tracing Instrumentation ------------------------------------ -This example provides the "Spy" build configuration, which outputs the QS -(Quantum Spy) software tracing data through UART0 of the EK-LM3S6965 board, -which is connected to the virtual COM port of the mbed USB connection. - -The output is generated at 115200 baud rate. - -Here is an example invocation of the QSPY host application to receive -the QS data from EK-LM3S6965: - -qspy -cCOM12 - -The actual COM port number might be different on your Windows machine. -Please check the Device Manager to find the COM port number. - - -About QP-lwIP Integration -========================= -The QP-lwIP integration has been carefully designed for hard real-time -control-type applications, in which the TCP/IP stack is used to monitor and -configure the device as well as to provide remote user interface (e.g., by -means of a web browser). In particular, The lwIP stack, which is not -preemptive, is strictly encapsulated inside a dedicated active object -(LwIP-Manager), so interrupt locking is unnecessary, which critical for low -interrupt latency. Also, the Ethernet interrupt service routine (ISR) runs -very fast without performing any lengthy copy operations. This means that -hard-real-time processing can be done at the task level, especially when you -use a preemptive QK™ kernel for executing your QP™ application. - -The QP-lwIP integration has been also carefully designed for portability. All -hardware-specific code is clearly separated in the Ethernet/lwIP device driver -with the clean interface to the rest of the application. - -Please refer to the Quantum Leaps Application Note: "QP and lwIP TCP/IP Stack" -for more information. The Application Note in PDF is provided in the QP-lwIP -example code. - - -Customizing the Website ------------------------ -The sub-directory "website" contains the website that you want to embed in -your microcontroller to be served by your lwIP Web-Server. You need to -put the files and directories of your website in there. - -To be useful in the microcontroller, the content of the "webstie" directory -needs to be converted to the "fsdata.h" header file. The provided batch -file "website.bat" re-generates the website after you change any file in it. -The batch file calls internally the qfsgen.exe utility, which is described -below. - - -qfsgen Utility to Generate Websites ------------------------------------ -Quantum Leaps provides a cross-platform, command-line utility, called -"qfsgen", which converts all the files in a given folder (your website) into -a C header file that contains a bunch of constant byte arrays representing -your files and directories. This generated file (fsdata.h) is subsequently -included in the fs.c ROM-Based File System implementation. - -The "qfsgen" utility (both compiled executable and source code) is -provided in the Qtools collection, available for download from: - -https://sourceforge.net/projects/qpc/files/Qtools - -*** -NOTE: The qfsgen utility is a simple executable (versions are available -for Windows and Linux), which does not require any interpreters to run -(such as Python, etc.) -*** - -You use the qfsgen utility from command-prompt. First, change current -directory to examples\lwip\arm-cm\lwip_ek-lm3s6965 and from there -execute: - -qfsgen website -h - -This will recursively generate the file-system corresponding to the -directory website with HTTP headers (-h option). - - -Utilities to Test UDP ---------------------- -Quantum Leaps provides a utility "qudp" to send and receive UDP packets -for testing. The "qudp" utility (both compiled executable and source code) -is provided in the Qtools collection, available for download from: - -https://sourceforge.net/projects/qpc/files/Qtools - - - -About QP Active Object Frameworks -================================= -QP is a family of very lightweight, open source, active-object (actor) -frameworks for embedded microcontrollers. QP enables developing well- -structured embedded applications as a set of concurrently executing -hierarchical state machines (UML statecharts). The QP frameworks support -manual coding of UML state machines in C or C++ as well as fully -automatic code generation by means of the free graphical QM modeling tool. - -Current versions of QP are: QP/C and QP/C++, which require about 4KB of code -and a few hundred bytes of RAM, and the ultra-lightweight QP-nano, which -requires only 1-2KB of code and just several bytes of RAM. - -QP can work with or without a traditional OS/RTOS. In the standalone -configuration, QP can completely replace a traditional RTOS. QP includes a -simple non-preemptive scheduler and a fully preemptive kernel (QK). The QP/C -and QP/C++ frameworks can also work with a traditional OS/RTOS to take -advantage of existing device drivers, communication stacks, and other -middleware. - -All versions of QP are described in detail in the book Practical UML -Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded -Systems by Dr. Miro Samek, (ISBN: 978-0750687065). QP has a strong user -community and has been applied worldwide by some of the largest companies in -their respective industries, such as: consumer electronics, telecommunications -equipment, industrial automation, transportation systems, medical devices, -national defense, and many more. - -QP is licensed under the GPL version 3 open source license as well as under -commercial closed-source licenses, which are expressly designed for users, who -wish to retain the proprietary character of their code. More information about -QP can be found at the QP homepage at http://www.state-machine.com. - - -About lwIP TCP/IP Stack -======================= -lwIP is an open source implementation of the TCP/IP protocol suite that was -originally written by Adam Dunkels of the Swedish Institute of Computer -Science (SICS) but now is being actively developed by a team of developers -distributed world-wide. Since it's release, lwIP has spurred a lot of interest -and has been ported to several platforms and operating systems. lwIP can be -used either with or without an underlying RTOS. - -The focus of the lwIP TCP/IP implementation is to reduce the RAM usage while -still having a full scale TCP. This makes lwIP suitable for use in embedded -systems with tens of kilobytes of free RAM and room for around 40 kilobytes -of code ROM. - -lwIP is licensed under the BSD open source license. More information about -lwIP can be found at the lwIP homepage at http://www.sics.se/~adam/lwip/. - -The lwIP version 1.4.1 (the latest as of this writing) is included in the -qpc\3rd_party\lwip directory. Please refer to this directory for more -information about licensing lwIP and the source. - - -Contact information -=================== -Web: www.state-machine.com -Email: info@state-machine.com diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/bsp.hpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/bsp.hpp deleted file mode 100644 index 41f53d4f8..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/bsp.hpp +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -// Product: BSP for DPP application with lwIP on EV-LM3S9665 board -// Last Updated for Version: 4.4.00 -// Date of the Last Update: Apr 19, 2012 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// Quantum Leaps Web sites: http://www.quantum-leaps.com -// https://state-machine.com -// e-mail: info@quantum-leaps.com -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -#define BSP_TICKS_PER_SEC 100U - -void BSP_init(void); - - // RITEK 128x96x4 OLED used in Rev C-D boards -#define RITEK_OLED - // OSRAM 128x64x4 OLED used in REV A-B boards -//#define OSRAM_OLED - -extern "C" { - -void ISR_SysTick(void); -void ISR_Ethernet(void); -void ISR_Nmi(void); -void ISR_Fault(void); -void ISR_DefaultHandler(void); - -} - -#endif // BSP_HPP diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/dpp.hpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/dpp.hpp deleted file mode 100644 index bf5022ce8..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/dpp.hpp +++ /dev/null @@ -1,74 +0,0 @@ -//============================================================================ -// Product: DPP example with lwIP -// Last updated for version 6.6.0 -// Last updated on 2019-07-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef DPP_HPP -#define DPP_HPP - -using namespace QP; - -enum DPPSignals { - EAT_SIG = Q_USER_SIG, // published by Table to let a philosopher eat - DONE_SIG, // published by Philosopher when done eating - BTN_DOWN_SIG, // published by ISR_SysTick when user button is pressed - BTN_UP_SIG, // published by ISR_SysTick when user button is released - - DISPLAY_IPADDR_SIG, // published by lwIPMgr to display IP address - DISPLAY_CGI_SIG, // published by lwIPMgr to display CGI text - DISPLAY_UDP_SIG, // published by lwIPMgr to display UDP text - MAX_PUB_SIG, // the last published signal - - HUNGRY_SIG, // posted directly to Table from hungry Philosopher - SEND_UDP_SIG, // posted directly to lwIPMgr to send text via UDP - LWIP_DRIVER_GROUP, // LwIP driver signal group - LWIP_DRIVER_END = LWIP_DRIVER_GROUP + 10, // reserve 10 signals - LWIP_SLOW_TICK_SIG, // slow tick signal for LwIP manager - MAX_SIG // the last signal -}; - -struct TableEvt : public QEvt { - uint8_t philoNum; // philosopher number -}; - -#define MAX_TEXT_LEN 16 -struct TextEvt : public QEvt { - char text[MAX_TEXT_LEN]; // text to deliver -}; - -// number of philosophers -#define N_PHILO 5U - -extern QActive * const AO_Philo[N_PHILO]; // "opaque" pointers to Philo AO -extern QActive * const AO_Table; // "opaque" pointer to Table AO -extern QActive * const AO_LwIPMgr; // "opaque" pointer to LwIPMgr AO - -#endif // DPP_HPP diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/fsdata.h b/examples/lwip/arm-cm/lwip_ek-lm3s6965/fsdata.h deleted file mode 100644 index ecb3de018..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/fsdata.h +++ /dev/null @@ -1,7491 +0,0 @@ -/* This file has been generatedwith the qfsgen utility. */ - -/* /404.htm */ -static unsigned char const data_404_htm[] = { - /* name: */ - 0x2F, 0x34, 0x30, 0x34, 0x2E, 0x68, 0x74, 0x6D, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, - 0x30, 0x34, 0x20, 0x46, 0x69, 0x6C, 0x65, 0x20, 0x6E, 0x6F, - 0x74, 0x20, 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x0D, 0x0A, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, - 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, - 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, - 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, - 0x6D, 0x6C, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0A, 0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x0A, 0x3C, - 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x0A, 0x3C, 0x63, 0x65, 0x6E, - 0x74, 0x65, 0x72, 0x3E, 0x0A, 0x3C, 0x68, 0x31, 0x3E, 0x34, - 0x30, 0x34, 0x20, 0x2D, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, - 0x6E, 0x6F, 0x74, 0x20, 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x3C, - 0x2F, 0x68, 0x31, 0x3E, 0x0A, 0x3C, 0x70, 0x20, 0x63, 0x6C, - 0x61, 0x73, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x74, 0x65, 0x22, - 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3A, 0x38, 0x30, 0x25, 0x3B, 0x22, 0x3E, - 0x57, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6F, 0x72, - 0x72, 0x79, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, - 0x67, 0x65, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x74, 0x72, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x6F, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x69, 0x73, - 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6C, - 0x61, 0x62, 0x6C, 0x65, 0x2E, 0x20, 0x50, 0x6C, 0x65, 0x61, - 0x73, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x42, 0x61, 0x63, 0x6B, 0x20, 0x62, 0x75, 0x74, 0x74, - 0x6F, 0x6E, 0x20, 0x6F, 0x66, 0x20, 0x79, 0x6F, 0x75, 0x72, - 0x20, 0x62, 0x6F, 0x77, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6F, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x20, 0x74, 0x6F, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x6F, 0x75, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x78, - 0x74, 0x2E, 0x20, 0x57, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6F, - 0x6C, 0x6F, 0x67, 0x69, 0x7A, 0x65, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6E, 0x63, 0x6F, 0x6E, - 0x76, 0x65, 0x6E, 0x69, 0x65, 0x6E, 0x63, 0x65, 0x2E, 0x20, - 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, - 0x6F, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, - 0x72, 0x6F, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x3C, 0x61, 0x20, - 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, - 0x74, 0x6F, 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, - 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, - 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x71, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, - 0x6C, 0x65, 0x61, 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, - 0x2F, 0x61, 0x3E, 0x2E, 0x0A, 0x3C, 0x2F, 0x70, 0x3E, 0x0A, - 0x3C, 0x2F, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3E, 0x0A, - 0x3C, 0x2F, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, - 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x0A -}; - -struct fsdata_file const file_404_htm[] = { - { - (struct fsdata_file *)0, - data_404_htm, - data_404_htm + 9, - sizeof(data_404_htm) - 9 - } -}; - -/* /bg_footer.gif */ -static unsigned char const data_bg_footer_gif[] = { - /* name: */ - 0x2F, 0x62, 0x67, 0x5F, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, - 0x2E, 0x67, 0x69, 0x66, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0xD4, 0x03, 0x08, 0x00, - 0xD5, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFB, 0xFB, 0xFB, 0xFC, - 0xFC, 0xFC, 0xF7, 0xF7, 0xF7, 0xF1, 0xF1, 0xF1, 0xF9, 0xF9, - 0xF9, 0xD9, 0xD9, 0xD9, 0xF8, 0xF8, 0xF8, 0xF2, 0xF2, 0xF2, - 0xE9, 0xE9, 0xE9, 0xE1, 0xE1, 0xE1, 0xF4, 0xF4, 0xF4, 0xEA, - 0xEA, 0xEA, 0xF5, 0xF5, 0xF5, 0xF3, 0xF3, 0xF3, 0xED, 0xED, - 0xED, 0xEB, 0xEB, 0xEB, 0xE2, 0xE2, 0xE2, 0xEC, 0xEC, 0xEC, - 0xDA, 0xDA, 0xDA, 0xE3, 0xE3, 0xE3, 0xE7, 0xE7, 0xE7, 0xE4, - 0xE4, 0xE4, 0xEF, 0xEF, 0xEF, 0xEE, 0xEE, 0xEE, 0xE5, 0xE5, - 0xE5, 0xDD, 0xDD, 0xDD, 0xDE, 0xDE, 0xDE, 0xDB, 0xDB, 0xDB, - 0xE6, 0xE6, 0xE6, 0xDC, 0xDC, 0xDC, 0xDF, 0xDF, 0xDF, 0xD8, - 0xD8, 0xD8, 0xE0, 0xE0, 0xE0, 0xE8, 0xE8, 0xE8, 0xF0, 0xF0, - 0xF0, 0xF6, 0xF6, 0xF6, 0xFA, 0xFA, 0xFA, 0xFD, 0xFD, 0xFD, - 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0xD4, 0x03, - 0x08, 0x00, 0x00, 0x06, 0xFF, 0x40, 0x41, 0x20, 0x50, 0x2A, - 0x15, 0x0E, 0x03, 0x52, 0x63, 0xE1, 0x40, 0x10, 0x46, 0x97, - 0x87, 0x04, 0xC2, 0x48, 0x54, 0x3A, 0x19, 0x0B, 0x25, 0xA2, - 0x08, 0x7D, 0x36, 0x1B, 0x8D, 0xC6, 0xC3, 0xE1, 0x4C, 0xCE, - 0x13, 0x83, 0x7A, 0xAD, 0x06, 0xB9, 0xDF, 0xF0, 0xB8, 0x7C, - 0x4E, 0xAF, 0xDB, 0xEF, 0xF8, 0xBC, 0x7E, 0xCF, 0xEF, 0xFB, - 0xFF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, - 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, - 0x93, 0x94, 0x95, 0x80, 0x6C, 0x6C, 0x68, 0x13, 0x65, 0x1E, - 0x62, 0x60, 0x1F, 0x21, 0x0A, 0x11, 0x14, 0x16, 0x19, 0x1D, - 0x15, 0x09, 0x0C, 0x10, 0x12, 0x0F, 0x17, 0x23, 0x04, 0x08, - 0x0E, 0x0B, 0x0D, 0x24, 0x03, 0x07, 0x05, 0x45, 0x43, 0x02, - 0x02, 0x26, 0xBB, 0x43, 0x45, 0x47, 0x03, 0x49, 0x4B, 0x4D, - 0x4F, 0x17, 0x18, 0x52, 0x54, 0x09, 0x22, 0x15, 0x57, 0x19, - 0x59, 0x5A, 0x5B, 0x11, 0x5C, 0x0A, 0xD5, 0x5D, 0x21, 0xD8, - 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, - 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, - 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, - 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0xF5, - 0xAC, 0x55, 0x9B, 0x36, 0x8A, 0x54, 0x29, 0x53, 0xCD, 0x44, - 0xA4, 0x5A, 0xF5, 0x00, 0x83, 0x2B, 0x58, 0xB2, 0x68, 0x09, - 0xBB, 0x95, 0x2B, 0xC0, 0x2E, 0x13, 0x18, 0x31, 0xFA, 0x22, - 0x62, 0x24, 0xD8, 0x30, 0x62, 0x08, 0x9C, 0x8C, 0x80, 0x82, - 0x01, 0x99, 0x94, 0x29, 0x54, 0x18, 0xA8, 0x4C, 0xC0, 0x92, - 0xA5, 0x88, 0x97, 0x30, 0x63, 0xCA, 0x9C, 0x49, 0xB3, 0xA6, - 0xCD, 0x9B, 0x38, 0x73, 0xEA, 0xDC, 0xC9, 0xB3, 0xA7, 0xCF, - 0xFF, 0x9F, 0x40, 0x83, 0x0A, 0x1D, 0x4A, 0xB4, 0xA8, 0xD1, - 0xA3, 0x48, 0x93, 0x2A, 0x5D, 0xCA, 0xB4, 0xA9, 0xD3, 0xA7, - 0x50, 0xA3, 0x4A, 0x9D, 0x4A, 0xB5, 0xAA, 0xD5, 0xA7, 0x2D, - 0x59, 0xAA, 0x54, 0x09, 0x61, 0x15, 0xAB, 0x86, 0x0E, 0x47, - 0xC2, 0x8A, 0x35, 0x4B, 0xA2, 0xAD, 0x02, 0xB8, 0x4A, 0xE8, - 0xE2, 0x95, 0xF1, 0x44, 0x46, 0x8D, 0x1B, 0x8B, 0x74, 0x44, - 0x22, 0x8C, 0x84, 0x92, 0x25, 0x0B, 0x98, 0x34, 0x09, 0x49, - 0xA0, 0xAF, 0xDF, 0x91, 0x80, 0x03, 0x0B, 0x1E, 0x4C, 0xB8, - 0xB0, 0xE1, 0xC3, 0x88, 0x13, 0x2B, 0x5E, 0xCC, 0xB8, 0xB1, - 0xE3, 0xC7, 0x90, 0x23, 0x4B, 0x9E, 0x4C, 0xB9, 0xB2, 0xE5, - 0xCB, 0x98, 0x33, 0x6B, 0xDE, 0xCC, 0xB9, 0xB3, 0xE7, 0xCF, - 0xA0, 0x43, 0x8B, 0x1E, 0x4D, 0xBA, 0xB4, 0xE9, 0xD3, 0xAF, - 0xFC, 0xF6, 0x0D, 0x19, 0x4B, 0x56, 0xDE, 0x06, 0xB4, 0x6A, - 0x4D, 0x44, 0x2B, 0x77, 0x2D, 0xDB, 0xB6, 0x27, 0x72, 0xEB, - 0x7E, 0x0B, 0x57, 0xC8, 0x10, 0x8E, 0xC0, 0xD0, 0x1E, 0x18, - 0x4E, 0x57, 0x98, 0xF1, 0xBA, 0x76, 0x93, 0x2B, 0x5F, 0xCE, - 0xBC, 0xB9, 0xF3, 0xE7, 0xD0, 0xA3, 0x4B, 0x9F, 0x4E, 0xBD, - 0xBA, 0xF5, 0xEB, 0xD8, 0xB3, 0x6B, 0xDF, 0xCE, 0xBD, 0xBB, - 0xF7, 0xEF, 0xE0, 0xC3, 0x8B, 0x1F, 0x4F, 0xBE, 0xBC, 0xF9, - 0xF3, 0xE8, 0xD3, 0xAB, 0x5F, 0xCF, 0xBE, 0xBD, 0xFB, 0xF7, - 0xF0, 0x8F, 0xCB, 0x27, 0x7E, 0x8B, 0x76, 0xED, 0xDF, 0xBB, - 0x6E, 0xE3, 0xD6, 0x7D, 0x02, 0x00, 0x00, 0xFE, 0x00, 0xF2, - 0x96, 0x51, 0x7E, 0xF9, 0xFD, 0x66, 0xE0, 0x2F, 0x72, 0x25, - 0xA8, 0xE0, 0x82, 0x0C, 0x36, 0xE8, 0xE0, 0x83, 0x10, 0x46, - 0x28, 0xE1, 0x84, 0x14, 0x56, 0x68, 0xE1, 0x85, 0x18, 0x66, - 0xA8, 0xE1, 0x86, 0x1C, 0x76, 0xE8, 0x93, 0xE1, 0x87, 0x20, - 0x86, 0x28, 0xE2, 0x88, 0x24, 0x96, 0x68, 0xE2, 0x89, 0x28, - 0xA6, 0xA8, 0xE2, 0x8A, 0x2C, 0xB6, 0xE8, 0xE2, 0x8B, 0x0F, - 0x1E, 0x68, 0x20, 0x81, 0x17, 0x09, 0x68, 0x02, 0x80, 0xFC, - 0xF9, 0xA7, 0xE3, 0x8E, 0xFE, 0xE1, 0xE8, 0x63, 0x6E, 0x36, - 0x06, 0x29, 0xE4, 0x90, 0x44, 0x16, 0x69, 0xE4, 0x91, 0x48, - 0x26, 0xA9, 0xE4, 0x92, 0x4C, 0x36, 0xE9, 0xE4, 0x93, 0x50, - 0x46, 0x29, 0xE5, 0x94, 0x54, 0x56, 0x69, 0xE5, 0x95, 0x58, - 0x66, 0xA9, 0xE5, 0x96, 0x5C, 0x76, 0xE9, 0xE5, 0x97, 0x60, - 0x86, 0x29, 0xE6, 0x98, 0x64, 0x06, 0xF9, 0x23, 0x8E, 0x3C, - 0xA6, 0xA9, 0xE6, 0x9A, 0x3D, 0x9E, 0xE9, 0xE6, 0x9B, 0x70, - 0xC6, 0x29, 0xE7, 0x9C, 0x74, 0xD6, 0x69, 0xE7, 0x9D, 0x78, - 0xE6, 0xA9, 0xE7, 0x9E, 0x7C, 0xF6, 0xE9, 0xE7, 0x9F, 0x80, - 0x06, 0x2A, 0xE8, 0xA0, 0x84, 0x16, 0x6A, 0xE8, 0xA1, 0x88, - 0x26, 0xAA, 0xE8, 0xA2, 0x8C, 0x36, 0xEA, 0xE8, 0xA3, 0x84, - 0xB2, 0x29, 0x69, 0x10, 0x00, 0x3B -}; - -struct fsdata_file const file_bg_footer_gif[] = { - { - file_404_htm, - data_bg_footer_gif, - data_bg_footer_gif + 15, - sizeof(data_bg_footer_gif) - 15 - } -}; - -/* /cgi_demo.htm */ -static unsigned char const data_cgi_demo_htm[] = { - /* name: */ - 0x2F, 0x63, 0x67, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, - 0x68, 0x74, 0x6D, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0A, 0x3C, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0A, 0x3C, - 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x3C, 0x4D, 0x45, 0x54, - 0x41, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2D, 0x45, 0x51, 0x55, - 0x49, 0x56, 0x3D, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, - 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x3D, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3B, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x3D, 0x49, 0x53, 0x4F, 0x2D, 0x38, - 0x38, 0x36, 0x39, 0x2D, 0x31, 0x22, 0x3E, 0x0A, 0x3C, 0x54, - 0x49, 0x54, 0x4C, 0x45, 0x3E, 0x51, 0x50, 0x2F, 0x6C, 0x77, - 0x49, 0x50, 0x2D, 0x2D, 0x43, 0x47, 0x49, 0x20, 0x44, 0x65, - 0x6D, 0x6F, 0x3C, 0x2F, 0x54, 0x49, 0x54, 0x4C, 0x45, 0x3E, - 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3D, 0x22, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2E, 0x63, - 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x74, - 0x65, 0x78, 0x74, 0x2F, 0x63, 0x73, 0x73, 0x20, 0x72, 0x65, - 0x6C, 0x3D, 0x53, 0x74, 0x79, 0x6C, 0x65, 0x73, 0x68, 0x65, - 0x65, 0x74, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, - 0x72, 0x65, 0x6C, 0x3D, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x22, - 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x69, 0x6D, 0x67, - 0x2F, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x69, - 0x63, 0x6F, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, - 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x69, 0x63, - 0x6F, 0x6E, 0x22, 0x20, 0x2F, 0x3E, 0x0A, 0x3C, 0x2F, 0x48, - 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x0A, 0x3C, 0x42, 0x4F, 0x44, - 0x59, 0x3E, 0x0A, 0x3C, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x20, - 0x63, 0x65, 0x6C, 0x6C, 0x53, 0x70, 0x61, 0x63, 0x69, 0x6E, - 0x67, 0x3D, 0x30, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x50, 0x61, - 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, - 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, - 0x3D, 0x6D, 0x61, 0x73, 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, - 0x6E, 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x3E, 0x3C, 0x41, - 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x3C, 0x49, 0x4D, - 0x47, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, - 0x63, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, - 0x6F, 0x5F, 0x71, 0x6C, 0x2E, 0x6A, 0x70, 0x67, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x74, 0x6C, - 0x65, 0x3D, 0x22, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, - 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, - 0x6E, 0x6E, 0x6F, 0x76, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, - 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, 0x51, - 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, - 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, 0x6E, 0x6F, 0x76, - 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6D, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6E, 0x67, 0x2D, 0x62, 0x6F, 0x74, 0x74, 0x6F, - 0x6D, 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x3C, 0x2F, - 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, - 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, - 0x30, 0x25, 0x22, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x6E, 0x6F, - 0x77, 0x72, 0x61, 0x70, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x42, 0x3E, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, - 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x2C, 0x20, 0x4C, 0x4C, - 0x43, 0x3C, 0x2F, 0x42, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, 0x3A, - 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, 0x3E, - 0x3C, 0x62, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x77, 0x77, - 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, - 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, - 0x2F, 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, - 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x6D, 0x65, 0x6E, 0x75, 0x22, 0x20, 0x63, 0x6F, 0x6C, - 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x22, 0x33, 0x22, 0x20, 0x6E, - 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, 0x67, - 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x62, 0x67, 0x63, - 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x30, 0x30, 0x30, - 0x30, 0x39, 0x39, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x3D, 0x22, 0x32, 0x35, 0x22, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x42, 0x49, 0x47, 0x3E, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, - 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x48, 0x4F, 0x4D, 0x45, 0x3C, 0x2F, 0x41, 0x3E, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, - 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x73, 0x73, 0x69, 0x5F, - 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x53, 0x53, 0x49, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, - 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x3C, 0x42, 0x3E, 0x43, 0x47, 0x49, 0x20, 0x44, 0x45, - 0x4D, 0x4F, 0x3C, 0x2F, 0x42, 0x3E, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x75, 0x64, 0x70, 0x5F, 0x64, 0x65, 0x6D, - 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x55, 0x44, 0x50, - 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x3C, - 0x2F, 0x42, 0x49, 0x47, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, - 0x54, 0x52, 0x3E, 0x0A, 0x3C, 0x2F, 0x54, 0x41, 0x42, 0x4C, - 0x45, 0x3E, 0x0A, 0x0A, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x20, - 0x42, 0x45, 0x47, 0x49, 0x4E, 0x5F, 0x43, 0x4F, 0x4E, 0x54, - 0x45, 0x4E, 0x54, 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x3C, 0x41, - 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x41, 0x62, 0x6F, - 0x75, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x3C, - 0x48, 0x31, 0x3E, 0x41, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x43, - 0x47, 0x49, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, - 0x3C, 0x2F, 0x48, 0x31, 0x3E, 0x0A, 0x0A, 0x3C, 0x41, 0x20, - 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x22, - 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, - 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x49, 0x4D, - 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, 0x6D, 0x67, - 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, 0x6C, 0x77, 0x69, 0x70, - 0x5F, 0x71, 0x70, 0x2E, 0x6A, 0x70, 0x67, 0x22, 0x20, 0x41, - 0x4C, 0x54, 0x3D, 0x22, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, - 0x50, 0x22, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, - 0x6C, 0x65, 0x66, 0x74, 0x22, 0x20, 0x68, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x3D, 0x22, 0x31, 0x30, 0x22, 0x20, 0x76, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x35, 0x22, 0x3E, 0x3C, - 0x2F, 0x41, 0x3E, 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x68, - 0x65, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, - 0x6F, 0x6D, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, - 0x49, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6E, - 0x20, 0x65, 0x78, 0x74, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x20, - 0x74, 0x6F, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, - 0x20, 0x72, 0x75, 0x64, 0x69, 0x6D, 0x65, 0x6E, 0x74, 0x61, - 0x72, 0x79, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x43, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x49, 0x6E, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x28, 0x43, 0x47, 0x49, - 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x66, 0x61, 0x63, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x2E, - 0x20, 0x54, 0x6F, 0x20, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x47, 0x49, 0x20, 0x73, - 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x69, 0x6E, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2C, 0x20, 0x79, - 0x6F, 0x75, 0x20, 0x6E, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6F, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x20, 0x3C, 0x43, - 0x4F, 0x44, 0x45, 0x3E, 0x49, 0x4E, 0x43, 0x4C, 0x55, 0x44, - 0x45, 0x5F, 0x48, 0x54, 0x54, 0x50, 0x44, 0x5F, 0x43, 0x47, - 0x49, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, 0x69, - 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x6C, 0x77, 0x69, 0x70, 0x6F, 0x70, 0x74, 0x73, - 0x2E, 0x68, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6C, - 0x65, 0x2E, 0x20, 0x59, 0x6F, 0x75, 0x20, 0x6D, 0x75, 0x73, - 0x74, 0x20, 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x70, 0x72, 0x6F, - 0x76, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, - 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x20, 0x62, 0x65, 0x74, - 0x77, 0x65, 0x65, 0x6E, 0x20, 0x43, 0x47, 0x49, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x29, 0x20, 0x61, 0x6E, - 0x64, 0x20, 0x43, 0x47, 0x49, 0x20, 0x63, 0x61, 0x6C, 0x6C, - 0x62, 0x61, 0x63, 0x6B, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, - 0x20, 0x62, 0x79, 0x20, 0x63, 0x61, 0x6C, 0x6C, 0x69, 0x6E, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x68, 0x74, 0x74, 0x70, 0x5F, 0x73, 0x65, 0x74, - 0x5F, 0x63, 0x67, 0x69, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, - 0x65, 0x72, 0x73, 0x28, 0x29, 0x3C, 0x2F, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x0A, 0x3C, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, - 0x70, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, - 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, 0x66, - 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, - 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x49, - 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, 0x6D, - 0x67, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, - 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x6A, 0x70, 0x67, - 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x41, 0x70, 0x70, - 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, - 0x6F, 0x74, 0x65, 0x20, 0x28, 0x31, 0x2E, 0x34, 0x4D, 0x42, - 0x20, 0x50, 0x44, 0x46, 0x29, 0x22, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, - 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, - 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, - 0x3C, 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x43, 0x47, 0x49, - 0x20, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, - 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, - 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x77, 0x6F, 0x72, - 0x6B, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, - 0x6C, 0x79, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x45, 0x54, - 0x20, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x2C, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, - 0x65, 0x73, 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x61, 0x72, - 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, - 0x52, 0x49, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x61, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, - 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x66, 0x6F, 0x6C, 0x6C, - 0x6F, 0x77, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2E, 0x20, 0x41, - 0x74, 0x74, 0x65, 0x6D, 0x70, 0x74, 0x73, 0x20, 0x74, 0x6F, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, - 0x4F, 0x53, 0x54, 0x20, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, - 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x72, 0x65, 0x73, 0x75, - 0x6C, 0x74, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x62, 0x65, - 0x69, 0x6E, 0x67, 0x20, 0x69, 0x67, 0x6E, 0x6F, 0x72, 0x65, - 0x64, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, 0x50, - 0x3E, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x20, 0x43, - 0x47, 0x49, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x2D, 0x48, - 0x54, 0x54, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, - 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x73, 0x63, 0x61, 0x6E, 0x20, - 0x61, 0x6C, 0x6C, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6E, - 0x67, 0x73, 0x29, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x63, 0x61, - 0x6C, 0x6C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x72, - 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x64, 0x69, 0x6E, 0x67, - 0x20, 0x43, 0x47, 0x49, 0x20, 0x63, 0x61, 0x6C, 0x6C, 0x62, - 0x61, 0x63, 0x6B, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x2C, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6D, 0x61, 0x74, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, - 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x2E, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, - 0x77, 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, 0x50, 0x3C, 0x2F, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, - 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x47, 0x49, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, - 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6E, - 0x64, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x70, 0x61, 0x73, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x6D, 0x20, 0x74, 0x6F, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x43, 0x47, 0x49, 0x20, 0x63, 0x61, - 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x20, 0x66, 0x75, 0x6E, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x6E, - 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x43, - 0x47, 0x49, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, - 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x20, 0x31, 0x36, - 0x2C, 0x20, 0x62, 0x75, 0x74, 0x20, 0x79, 0x6F, 0x75, 0x20, - 0x63, 0x61, 0x6E, 0x20, 0x72, 0x65, 0x2D, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6C, - 0x69, 0x6D, 0x69, 0x74, 0x20, 0x62, 0x79, 0x20, 0x63, 0x68, - 0x61, 0x6E, 0x67, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x20, 0x3C, 0x43, 0x4F, - 0x44, 0x45, 0x3E, 0x4D, 0x41, 0x58, 0x5F, 0x43, 0x47, 0x49, - 0x5F, 0x50, 0x41, 0x52, 0x41, 0x4D, 0x53, 0x3C, 0x2F, 0x43, - 0x4F, 0x44, 0x45, 0x3E, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x68, 0x74, - 0x74, 0x70, 0x2E, 0x68, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, - 0x3E, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, - 0x69, 0x6C, 0x65, 0x2E, 0x0A, 0x3C, 0x50, 0x3E, 0x0A, 0x3C, - 0x50, 0x3E, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, - 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x41, 0x70, 0x70, 0x6C, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, 0x6F, - 0x74, 0x65, 0x3A, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, - 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, - 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x2F, 0x41, 0x4E, 0x5F, - 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, - 0x50, 0x2E, 0x70, 0x64, 0x66, 0x22, 0x20, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, - 0x6B, 0x22, 0x3E, 0x22, 0x51, 0x50, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x54, 0x43, 0x50, 0x2F, - 0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6B, 0x22, 0x3C, - 0x2F, 0x41, 0x3E, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6D, 0x6F, - 0x72, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x69, 0x6E, 0x20, - 0x50, 0x44, 0x46, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, 0x50, - 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x63, - 0x6F, 0x64, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, - 0x0A, 0x3C, 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, - 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x3E, 0x3C, - 0x2F, 0x41, 0x3E, 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x43, 0x47, - 0x49, 0x20, 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x3C, - 0x2F, 0x48, 0x31, 0x3E, 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x54, - 0x68, 0x65, 0x20, 0x66, 0x6F, 0x6C, 0x6C, 0x6F, 0x77, 0x69, - 0x6E, 0x67, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x64, 0x65, - 0x6D, 0x6F, 0x6E, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x73, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, - 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x73, 0x20, 0x74, 0x6F, - 0x20, 0x79, 0x6F, 0x75, 0x72, 0x20, 0x65, 0x6D, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, - 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, - 0x6F, 0x72, 0x6D, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, - 0x6E, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, - 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x2C, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6C, 0x6C, 0x6F, 0x77, - 0x73, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x74, 0x6F, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x73, 0x6F, 0x6D, 0x65, 0x20, 0x74, - 0x65, 0x78, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x62, 0x65, 0x20, - 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x65, 0x64, 0x20, - 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x72, - 0x65, 0x65, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6F, - 0x61, 0x72, 0x64, 0x2E, 0x20, 0x59, 0x6F, 0x75, 0x20, 0x73, - 0x65, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, - 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x53, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x3C, 0x2F, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x62, 0x75, 0x74, 0x74, - 0x6F, 0x6E, 0x2E, 0x20, 0x49, 0x6E, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x2C, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, - 0x77, 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, 0x50, 0x3C, 0x2F, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x20, - 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x77, 0x69, - 0x6C, 0x6C, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x74, - 0x68, 0x61, 0x6E, 0x6B, 0x5F, 0x79, 0x6F, 0x75, 0x2E, 0x68, - 0x74, 0x6D, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, - 0x70, 0x61, 0x67, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, - 0x0A, 0x0A, 0x3C, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x6E, 0x61, - 0x6D, 0x65, 0x3D, 0x22, 0x43, 0x47, 0x49, 0x20, 0x45, 0x78, - 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x20, 0x6D, 0x65, 0x74, - 0x68, 0x6F, 0x64, 0x3D, 0x22, 0x47, 0x45, 0x54, 0x22, 0x20, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x64, 0x69, - 0x73, 0x70, 0x6C, 0x61, 0x79, 0x2E, 0x63, 0x67, 0x69, 0x22, - 0x3E, 0x0A, 0x3C, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, - 0x75, 0x6D, 0x6D, 0x61, 0x72, 0x79, 0x3D, 0x22, 0x63, 0x67, - 0x69, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, - 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x39, 0x35, - 0x25, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x73, 0x70, 0x61, - 0x63, 0x69, 0x6E, 0x67, 0x3D, 0x34, 0x20, 0x63, 0x65, 0x6C, - 0x6C, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x31, - 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x63, 0x65, - 0x6E, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x74, 0x72, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x64, - 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x22, - 0x32, 0x22, 0x20, 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, - 0x3D, 0x22, 0x23, 0x66, 0x66, 0x66, 0x66, 0x36, 0x36, 0x22, - 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x63, 0x65, - 0x6E, 0x74, 0x65, 0x72, 0x22, 0x3E, 0x3C, 0x62, 0x3E, 0x43, - 0x47, 0x49, 0x20, 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, - 0x3C, 0x2F, 0x62, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x74, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x74, - 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x74, 0x72, 0x20, 0x62, - 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x65, - 0x30, 0x65, 0x30, 0x65, 0x30, 0x22, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x64, 0x20, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x35, 0x30, 0x70, - 0x78, 0x22, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6E, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3A, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x74, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, - 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x3C, 0x69, 0x6E, 0x70, - 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, - 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x73, 0x69, 0x7A, - 0x65, 0x3D, 0x22, 0x31, 0x30, 0x22, 0x20, 0x6D, 0x61, 0x78, - 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, - 0x22, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x69, 0x6E, - 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, - 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, 0x22, 0x20, 0x6E, 0x61, - 0x6D, 0x65, 0x3D, 0x22, 0x73, 0x75, 0x62, 0x6D, 0x69, 0x74, - 0x22, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x3D, 0x22, 0x53, - 0x75, 0x62, 0x6D, 0x69, 0x74, 0x22, 0x20, 0x3E, 0x3C, 0x62, - 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x74, - 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x74, 0x72, 0x3E, - 0x0A, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0A, - 0x3C, 0x2F, 0x66, 0x6F, 0x72, 0x6D, 0x3E, 0x0A, 0x3C, 0x62, - 0x72, 0x20, 0x2F, 0x3E, 0x0A, 0x0A, 0x3C, 0x64, 0x69, 0x76, - 0x20, 0x69, 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, - 0x72, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x3E, 0x26, 0x63, 0x6F, - 0x70, 0x79, 0x3B, 0x20, 0x32, 0x30, 0x30, 0x32, 0x2D, 0x32, - 0x30, 0x31, 0x31, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, - 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, - 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, - 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x31, 0x30, 0x33, 0x20, - 0x43, 0x6F, 0x62, 0x62, 0x6C, 0x65, 0x20, 0x52, 0x69, 0x64, - 0x67, 0x65, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x2C, 0x20, - 0x43, 0x68, 0x61, 0x70, 0x65, 0x6C, 0x20, 0x48, 0x69, 0x6C, - 0x6C, 0x2C, 0x20, 0x4E, 0x43, 0x20, 0x32, 0x37, 0x35, 0x31, - 0x36, 0x2C, 0x20, 0x55, 0x53, 0x41, 0x3C, 0x62, 0x72, 0x20, - 0x2F, 0x3E, 0x0A, 0x54, 0x6F, 0x6C, 0x6C, 0x2D, 0x66, 0x72, - 0x65, 0x65, 0x3A, 0x20, 0x38, 0x36, 0x36, 0x2E, 0x34, 0x35, - 0x30, 0x2E, 0x4C, 0x45, 0x41, 0x50, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x3A, - 0x20, 0x39, 0x31, 0x39, 0x2E, 0x33, 0x36, 0x30, 0x2E, 0x35, - 0x36, 0x36, 0x38, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x46, 0x61, 0x78, 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, 0x38, - 0x36, 0x39, 0x2E, 0x32, 0x39, 0x39, 0x38, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x61, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, 0x3A, - 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, 0x73, 0x2E, 0x63, - 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, - 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, - 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x61, 0x3E, - 0x3C, 0x2F, 0x70, 0x3E, 0x0A, 0x3C, 0x2F, 0x64, 0x69, 0x76, - 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, 0x22, 0x20, 0x2D, - 0x2D, 0x3E, 0x0A, 0x0A, 0x0A, 0x3C, 0x2F, 0x42, 0x4F, 0x44, - 0x59, 0x3E, 0x0A, 0x3C, 0x2F, 0x48, 0x54, 0x4D, 0x4C, 0x3E, - 0x0A -}; - -struct fsdata_file const file_cgi_demo_htm[] = { - { - file_bg_footer_gif, - data_cgi_demo_htm, - data_cgi_demo_htm + 14, - sizeof(data_cgi_demo_htm) - 14 - } -}; - -/* /img/AN_QP_and_lwIP.jpg */ -static unsigned char const data_img_AN_QP_and_lwIP_jpg[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, - 0x5F, 0x61, 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, - 0x6A, 0x70, 0x67, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, - 0x67, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, - 0x00, 0x01, 0x02, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, - 0xFF, 0xEC, 0x00, 0x11, 0x44, 0x75, 0x63, 0x6B, 0x79, 0x00, - 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xFF, - 0xEE, 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x00, 0x64, - 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xDB, 0x00, 0x84, 0x00, - 0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x06, - 0x09, 0x06, 0x05, 0x06, 0x09, 0x0B, 0x08, 0x06, 0x06, 0x08, - 0x0B, 0x0C, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0C, 0x10, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0x0C, 0x0E, 0x0F, 0x10, - 0x0F, 0x0E, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x13, 0x13, 0x1C, - 0x1B, 0x1B, 0x1B, 0x1C, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x01, 0x07, 0x07, 0x07, 0x0D, 0x0C, - 0x0D, 0x18, 0x10, 0x10, 0x18, 0x1A, 0x15, 0x11, 0x15, 0x1A, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, - 0xC0, 0x00, 0x11, 0x08, 0x00, 0x81, 0x00, 0x64, 0x03, 0x01, - 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, - 0x00, 0xC0, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x03, 0x04, 0x06, 0x07, 0x08, 0x02, 0x01, 0x09, 0x01, - 0x00, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x04, - 0x05, 0x06, 0x01, 0x07, 0x10, 0x00, 0x02, 0x01, 0x02, 0x04, - 0x03, 0x03, 0x06, 0x07, 0x0A, 0x0C, 0x06, 0x03, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x00, 0x21, 0x12, 0x05, - 0x31, 0x13, 0x06, 0x41, 0x22, 0x14, 0x51, 0x61, 0x71, 0xD1, - 0x32, 0x07, 0x81, 0x91, 0x42, 0x23, 0x93, 0x15, 0x08, 0xB1, - 0x52, 0x72, 0x92, 0x33, 0x53, 0x34, 0x55, 0x16, 0x17, 0xA1, - 0xC1, 0x82, 0xB2, 0xC2, 0x43, 0x73, 0x83, 0x24, 0x44, 0x54, - 0x35, 0xF0, 0x62, 0xD2, 0xB4, 0x76, 0x38, 0x25, 0xB5, 0x37, - 0x11, 0x00, 0x01, 0x03, 0x02, 0x02, 0x05, 0x09, 0x05, 0x06, - 0x05, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, - 0x02, 0x03, 0x04, 0x21, 0x12, 0x31, 0x41, 0x51, 0x13, 0x05, - 0xF0, 0x61, 0x71, 0x81, 0x91, 0xA1, 0x22, 0x32, 0x14, 0xB1, - 0xC1, 0xD1, 0x52, 0x06, 0xE1, 0x42, 0x72, 0x23, 0x33, 0x15, - 0xF1, 0x62, 0x92, 0x34, 0x07, 0x82, 0xA2, 0xE2, 0x53, 0x73, - 0x35, 0x16, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, - 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xEA, 0x1B, 0x6B, 0x6B, - 0x7F, 0x0F, 0x17, 0xCD, 0x27, 0xB0, 0xBF, 0x24, 0x79, 0x30, - 0x92, 0x4E, 0x78, 0x6B, 0x7F, 0xCD, 0x27, 0xE2, 0x8C, 0x24, - 0x92, 0xF0, 0xD6, 0xFF, 0x00, 0x9A, 0x4F, 0xC5, 0x18, 0x49, - 0x25, 0xE1, 0xAD, 0xFF, 0x00, 0x34, 0x9F, 0x8A, 0x30, 0x92, - 0x5F, 0x0D, 0xAD, 0xB1, 0x14, 0xE5, 0x27, 0xE2, 0x8C, 0x24, - 0x90, 0xEB, 0xDB, 0x2B, 0x72, 0x0F, 0xCD, 0x27, 0xE2, 0x8F, - 0x56, 0x0B, 0x12, 0xB8, 0xAB, 0x9B, 0x8D, 0x84, 0x19, 0xFC, - 0xD2, 0x7E, 0x28, 0xF5, 0x62, 0x54, 0x0A, 0x6A, 0xAA, 0x6E, - 0x96, 0x10, 0xE7, 0xF3, 0x6B, 0xF8, 0xA3, 0x13, 0x29, 0x95, - 0xC2, 0xA9, 0xFB, 0xAD, 0x8C, 0x79, 0xF7, 0x17, 0xE2, 0x18, - 0x9B, 0x4C, 0xA6, 0x95, 0x4E, 0xDD, 0x2C, 0x93, 0x3E, 0xE0, - 0xF8, 0x86, 0x27, 0x53, 0x21, 0x30, 0xAA, 0x8E, 0xE5, 0x68, - 0xA2, 0xBD, 0xD1, 0xF1, 0x62, 0x64, 0x19, 0x35, 0x56, 0x2F, - 0xED, 0xC0, 0xAE, 0x58, 0x97, 0x06, 0x5C, 0x41, 0xF9, 0x3F, - 0x3F, 0x4A, 0x60, 0xAC, 0x1D, 0x71, 0x7E, 0x94, 0x35, 0xDC, - 0x16, 0x9B, 0x70, 0xB9, 0xB8, 0x6D, 0x10, 0xC5, 0x1A, 0xB3, - 0xB9, 0xEC, 0x14, 0x18, 0xF2, 0xE8, 0xC4, 0x92, 0xC1, 0x4C, - 0x25, 0x90, 0x3D, 0xC7, 0xDE, 0x2F, 0x4B, 0x6D, 0xD1, 0xCD, - 0x25, 0xED, 0xC3, 0x42, 0x90, 0x7E, 0x50, 0xBA, 0xD2, 0x95, - 0xE0, 0x33, 0x3C, 0x4F, 0x66, 0x1F, 0x3A, 0x79, 0x43, 0xC8, - 0x80, 0xEA, 0x4D, 0xAD, 0xA5, 0x5B, 0x82, 0xD4, 0xA2, 0x64, - 0xDB, 0x14, 0x99, 0xBA, 0xDB, 0xA7, 0xA2, 0xDC, 0x2D, 0xEC, - 0x5E, 0x76, 0xE6, 0x5C, 0x72, 0xE9, 0x28, 0x8D, 0xF9, 0x48, - 0x66, 0x8D, 0xA6, 0x8D, 0x64, 0x92, 0x9A, 0x50, 0xB4, 0x71, - 0xB3, 0x0D, 0x5E, 0xAC, 0x77, 0x73, 0x26, 0x75, 0x17, 0x38, - 0x75, 0x36, 0x4E, 0xA1, 0xD8, 0x22, 0x72, 0x92, 0xEE, 0x56, - 0xA8, 0xEB, 0x4D, 0x4A, 0xD3, 0x46, 0x08, 0xA9, 0xA0, 0xE2, - 0xDE, 0x5C, 0x37, 0x77, 0x2D, 0x8B, 0xB9, 0x82, 0x69, 0x3A, - 0xAB, 0xA6, 0xDE, 0xCD, 0x2F, 0x13, 0x72, 0xB6, 0x36, 0xF2, - 0x0A, 0xC6, 0xC6, 0x54, 0x5D, 0x5E, 0x61, 0xA8, 0xAE, 0x78, - 0xEE, 0xEA, 0x4E, 0xCC, 0xB9, 0x9C, 0x21, 0x57, 0x9D, 0x77, - 0xB0, 0x47, 0x0A, 0xC9, 0x74, 0x27, 0xB7, 0x32, 0x2C, 0x6F, - 0x12, 0x34, 0x7A, 0xDA, 0x44, 0x94, 0xB0, 0x8D, 0xD3, 0x96, - 0x5C, 0x30, 0x6E, 0x5B, 0x11, 0x43, 0xC0, 0x63, 0x92, 0xF0, - 0x16, 0x52, 0x68, 0x5B, 0x4E, 0xAC, 0x73, 0x47, 0x46, 0x3A, - 0x79, 0x9B, 0xE2, 0x10, 0xED, 0xF7, 0xA8, 0xB6, 0x7B, 0x3B, - 0xAF, 0x0F, 0x33, 0xB1, 0xCA, 0x36, 0x96, 0x78, 0xD4, 0x3C, - 0x31, 0x2C, 0xB2, 0x18, 0x90, 0xCA, 0xE0, 0xF7, 0x6A, 0xE2, - 0x9E, 0x6E, 0xDC, 0x12, 0x35, 0x40, 0x4E, 0xA7, 0x65, 0x52, - 0x71, 0xCC, 0x39, 0xFA, 0x4B, 0x63, 0x87, 0x6A, 0x15, 0x74, - 0x21, 0xB9, 0x81, 0x27, 0x81, 0x84, 0x90, 0xCC, 0xA1, 0xE2, - 0x90, 0x70, 0x65, 0x61, 0x50, 0x45, 0x7C, 0xB8, 0x9D, 0x4E, - 0x78, 0x3A, 0x89, 0x28, 0x98, 0x92, 0x0E, 0x90, 0xAA, 0x97, - 0xF6, 0xC9, 0x30, 0x72, 0x8C, 0x08, 0x55, 0x57, 0xA9, 0xAD, - 0x28, 0xE2, 0xAB, 0x4C, 0xB8, 0x9C, 0x85, 0x3C, 0xA4, 0x0C, - 0x0E, 0xA7, 0x16, 0xA3, 0x4A, 0x39, 0xA4, 0x4E, 0x5C, 0xD9, - 0x5F, 0x9D, 0xB3, 0x7B, 0x12, 0xDD, 0x92, 0xAA, 0x3B, 0x85, - 0xBD, 0xA3, 0x21, 0x91, 0xCB, 0x08, 0x02, 0xBB, 0x3C, 0xF5, - 0x55, 0x4E, 0xEC, 0x8B, 0x1F, 0x74, 0xB1, 0xA9, 0xCD, 0xBC, - 0x99, 0xD3, 0x2E, 0x38, 0x24, 0xB8, 0xC4, 0xC3, 0xE4, 0x80, - 0x23, 0xC3, 0x97, 0x12, 0xE7, 0x36, 0x66, 0xC0, 0x44, 0xFC, - 0xBE, 0xC5, 0xCD, 0xDA, 0xA5, 0xEE, 0x76, 0xE0, 0x82, 0x40, - 0x34, 0x39, 0x8A, 0x8A, 0x1F, 0x8B, 0x1A, 0x7A, 0x33, 0x24, - 0x02, 0x70, 0x40, 0x21, 0x55, 0x37, 0x1B, 0x7E, 0x38, 0x9B, - 0x02, 0xB8, 0x81, 0xF2, 0x7F, 0xC4, 0x60, 0xCE, 0xB8, 0xBB, - 0xE7, 0xAB, 0x6E, 0xE3, 0xBE, 0xE8, 0xCB, 0xEB, 0x4D, 0xAE, - 0xEE, 0xDA, 0x4D, 0xCA, 0x5B, 0x60, 0x2D, 0x63, 0x69, 0xE3, - 0x50, 0x64, 0x14, 0x2B, 0x52, 0x4D, 0x07, 0x0E, 0xDC, 0x79, - 0xAD, 0xBD, 0x48, 0xC6, 0x60, 0xCB, 0x42, 0xB1, 0x9D, 0xA5, - 0x63, 0x12, 0xD1, 0x97, 0x61, 0x58, 0x3D, 0xFF, 0x00, 0x48, - 0x75, 0xFE, 0xEF, 0x6D, 0x7B, 0x6F, 0xB8, 0xEC, 0xF6, 0xB1, - 0xCB, 0x76, 0xA8, 0xDC, 0xFB, 0x6D, 0xC2, 0xD1, 0x22, 0xE7, - 0x23, 0xCB, 0x26, 0xAD, 0x2F, 0x2C, 0xAF, 0xA5, 0x9A, 0x76, - 0xA8, 0xCB, 0xCD, 0x4E, 0x18, 0x25, 0xF1, 0xA7, 0x55, 0x8C, - 0x65, 0xA3, 0x6A, 0xB8, 0xE0, 0x77, 0x95, 0x6C, 0xE3, 0x28, - 0x9A, 0x72, 0x39, 0xBF, 0x94, 0xEB, 0x01, 0xF6, 0x6C, 0xFB, - 0x16, 0xC3, 0xB8, 0xED, 0x3B, 0x05, 0xD0, 0xDB, 0xCD, 0xD5, - 0x95, 0xB5, 0xDD, 0xCD, 0xA5, 0xBC, 0x31, 0xBD, 0xD4, 0x57, - 0x30, 0x23, 0x39, 0x48, 0x5E, 0x23, 0x1B, 0x93, 0x2C, 0x6C, - 0xCA, 0xA2, 0x56, 0xA7, 0xA7, 0x2C, 0x08, 0x5C, 0x10, 0xEC, - 0x55, 0x64, 0x78, 0x7C, 0xA4, 0x1C, 0x82, 0x0F, 0xE1, 0x92, - 0x65, 0xB6, 0xCE, 0x9C, 0x46, 0x67, 0xFA, 0x9A, 0x17, 0x55, - 0x56, 0xA0, 0xF1, 0x91, 0xB1, 0x25, 0xE3, 0xD0, 0xE4, 0x21, - 0xB9, 0xA6, 0xA7, 0x51, 0x46, 0x6E, 0x2C, 0x73, 0x38, 0xE7, - 0xA8, 0x3C, 0x88, 0x4F, 0x1C, 0x34, 0xED, 0x3F, 0xD1, 0x24, - 0xEB, 0x6D, 0xBD, 0x39, 0x0D, 0xC3, 0x34, 0x3B, 0x45, 0xBC, - 0x80, 0x30, 0x01, 0xFC, 0x5C, 0x40, 0x51, 0x05, 0x15, 0x95, - 0x5A, 0xE3, 0x2A, 0xD0, 0x57, 0xCB, 0xDB, 0x9E, 0x11, 0xB8, - 0x3C, 0x8A, 0xE4, 0x78, 0x69, 0x6D, 0x7F, 0xD1, 0x24, 0xF4, - 0x06, 0xCC, 0x5E, 0x43, 0x38, 0xB4, 0x8E, 0x05, 0x82, 0xD8, - 0x59, 0xA4, 0x3E, 0x32, 0xDD, 0xA0, 0x30, 0x45, 0xA9, 0xE3, - 0x56, 0x8F, 0x9C, 0x6A, 0xC1, 0x8D, 0x14, 0xF6, 0x57, 0x03, - 0x33, 0x04, 0xB9, 0xF6, 0xA3, 0xFA, 0x6A, 0x91, 0x86, 0x50, - 0x4B, 0x3B, 0xF9, 0x25, 0xCD, 0xAD, 0x90, 0x88, 0x36, 0x9D, - 0x92, 0xCE, 0x76, 0xB9, 0x87, 0x6D, 0x89, 0xE6, 0x28, 0x11, - 0x66, 0x9E, 0xEA, 0xDD, 0xDD, 0x00, 0x1A, 0x7B, 0xB5, 0x9B, - 0xB8, 0x69, 0x96, 0xA1, 0x9E, 0x1D, 0x09, 0x44, 0x6A, 0xEF, - 0x44, 0xAB, 0x0A, 0xD2, 0x0C, 0x64, 0x59, 0xF4, 0x64, 0x93, - 0x7B, 0x14, 0xB8, 0x8E, 0xD3, 0x05, 0x85, 0xBD, 0xBC, 0x52, - 0x41, 0x6C, 0x91, 0xA0, 0x55, 0xB7, 0x13, 0x46, 0xDA, 0x07, - 0x92, 0xA1, 0xDE, 0xBF, 0x19, 0xC4, 0xCA, 0x73, 0x8B, 0x2A, - 0xFA, 0xB4, 0x2A, 0x99, 0x12, 0x44, 0xA5, 0xCF, 0x94, 0xE3, - 0xDC, 0xB3, 0xBE, 0xAC, 0xBC, 0x8E, 0xC3, 0xA7, 0x6E, 0x77, - 0x63, 0xB7, 0x1D, 0xCA, 0xEE, 0xDE, 0x03, 0x2F, 0x2C, 0xCA, - 0x91, 0x06, 0x10, 0x8A, 0xAB, 0x68, 0x2F, 0xAB, 0xBB, 0xA6, - 0xA7, 0x42, 0x57, 0x2C, 0xB1, 0x59, 0xC2, 0x6E, 0x45, 0x6B, - 0x7D, 0xE4, 0xE1, 0x13, 0x22, 0xE0, 0xE8, 0xC5, 0xB0, 0xF6, - 0x2E, 0xD6, 0xB7, 0x98, 0x91, 0x11, 0x05, 0xBA, 0x0A, 0xCD, - 0xFA, 0x27, 0xAB, 0xA4, 0xEA, 0x66, 0x51, 0x3C, 0x56, 0xC6, - 0x88, 0xDF, 0x37, 0x68, 0xB3, 0x2B, 0x5B, 0x08, 0x41, 0x65, - 0xAC, 0x4E, 0xEE, 0x1D, 0x34, 0x2D, 0x75, 0x2E, 0x63, 0xB7, - 0x12, 0x69, 0x71, 0x3A, 0x74, 0xAB, 0x3D, 0x48, 0x00, 0xFF, - 0x00, 0x78, 0x0D, 0x9F, 0x04, 0x58, 0xD8, 0x1A, 0x94, 0xB3, - 0x42, 0x4E, 0x41, 0xD0, 0xBE, 0xCB, 0x7B, 0x25, 0xF3, 0x31, - 0x87, 0x68, 0xBD, 0x30, 0x31, 0x22, 0x0B, 0x87, 0xE5, 0xC6, - 0x92, 0x53, 0xE5, 0x12, 0xC6, 0x88, 0xBE, 0x72, 0x71, 0x6D, - 0x4F, 0xEA, 0x1A, 0x26, 0x59, 0x63, 0xE2, 0x3C, 0xCA, 0x25, - 0x4B, 0x0A, 0xD0, 0x0F, 0x28, 0xE5, 0x1C, 0xE8, 0x35, 0xFD, - 0xBC, 0xC0, 0xB7, 0x2D, 0x60, 0x50, 0x3D, 0xA7, 0xCE, 0x45, - 0x5F, 0x4B, 0xB5, 0x01, 0xF8, 0x17, 0x12, 0x23, 0xC4, 0x2E, - 0x2A, 0x96, 0x8B, 0x41, 0x0C, 0x5B, 0x93, 0xA0, 0x19, 0x74, - 0x02, 0x81, 0xFC, 0xC7, 0x8F, 0xEC, 0xF6, 0x34, 0xF3, 0x74, - 0x0A, 0x6A, 0xAF, 0xB5, 0xA3, 0xC9, 0x8B, 0xA7, 0x96, 0xEB, - 0x2E, 0xF0, 0x67, 0x6D, 0x38, 0x26, 0xFA, 0x6A, 0x9F, 0x24, - 0xBF, 0xA4, 0xAE, 0xF7, 0xB6, 0xD8, 0xF6, 0x4F, 0x0F, 0x17, - 0xFF, 0x00, 0x1F, 0x6D, 0xEC, 0x2F, 0xF5, 0x31, 0xF9, 0x3D, - 0x18, 0xC1, 0xE5, 0x0A, 0x67, 0xAC, 0xAD, 0xF3, 0xCB, 0xB4, - 0xA7, 0x7E, 0xA2, 0xD9, 0x3F, 0x57, 0xDB, 0x7D, 0x0C, 0x7E, - 0xAC, 0x2C, 0xA1, 0x2F, 0x59, 0x5B, 0xE7, 0x97, 0x69, 0x4B, - 0xEA, 0x2D, 0x93, 0xF5, 0x7D, 0xB7, 0xD0, 0xC7, 0xEA, 0xC2, - 0xCA, 0x12, 0xF5, 0x95, 0xBE, 0x79, 0x76, 0x94, 0xBE, 0xA2, - 0xD9, 0x3F, 0x57, 0xDB, 0x7D, 0x0C, 0x7E, 0xAC, 0x2C, 0xA1, - 0x2F, 0x59, 0x5B, 0xE7, 0x97, 0x69, 0x4B, 0xEA, 0x2D, 0x93, - 0xF5, 0x7D, 0xB7, 0xD0, 0xC7, 0xEA, 0xC2, 0xCA, 0x12, 0xF5, - 0x95, 0xBE, 0x79, 0x76, 0x94, 0xBE, 0xA2, 0xD9, 0x3F, 0x57, - 0xDB, 0x7D, 0x0C, 0x7E, 0xAC, 0x2C, 0xA1, 0x2F, 0x59, 0x5B, - 0xE7, 0x97, 0x69, 0x4B, 0xEA, 0x2D, 0x93, 0xF5, 0x7D, 0xB7, - 0xD0, 0xC7, 0xEA, 0xC2, 0xCA, 0x12, 0xF5, 0x95, 0xBE, 0x79, - 0x76, 0x94, 0xBE, 0xA3, 0xD9, 0x7B, 0x2C, 0x2D, 0x81, 0xF2, - 0xF2, 0x63, 0xF5, 0x61, 0x65, 0x09, 0x7A, 0xBA, 0xDF, 0x3C, - 0xBB, 0x4A, 0xAC, 0xF4, 0xC7, 0x4E, 0xEE, 0x50, 0xC1, 0xE1, - 0xB7, 0x74, 0xB5, 0xB8, 0xB9, 0xB5, 0x2D, 0x1B, 0xC8, 0x63, - 0x52, 0x65, 0x8C, 0x3B, 0x72, 0xE4, 0x15, 0x0C, 0x17, 0x5C, - 0x74, 0x25, 0x7B, 0x1A, 0xA3, 0x18, 0xEE, 0x19, 0xC2, 0xE7, - 0x46, 0xF2, 0xA8, 0x85, 0x49, 0x42, 0x31, 0x20, 0xE5, 0xC1, - 0xA4, 0x25, 0xAF, 0x17, 0xE7, 0x18, 0x07, 0xE7, 0x47, 0x9D, - 0xD4, 0xB2, 0x06, 0x27, 0x1E, 0x72, 0xAB, 0x9B, 0x87, 0xBB, - 0x3F, 0x77, 0x9D, 0x1F, 0x35, 0xEE, 0xE1, 0xB7, 0x6C, 0x90, - 0xD9, 0xB6, 0xE6, 0x1C, 0x47, 0x74, 0x8E, 0xE0, 0x41, 0x34, - 0xAA, 0x63, 0x92, 0x38, 0xC3, 0x31, 0x58, 0x96, 0x58, 0xDD, - 0xA8, 0x16, 0x9E, 0x4F, 0xBD, 0xC6, 0x83, 0x89, 0xC6, 0x5B, - 0xA9, 0x18, 0x8C, 0x59, 0x72, 0xC6, 0xBC, 0x84, 0xE3, 0x12, - 0x7C, 0x0E, 0xED, 0xA9, 0x67, 0xAD, 0xB6, 0xA5, 0x8E, 0xE3, - 0x6B, 0x3C, 0x96, 0xF7, 0x5B, 0x97, 0x4B, 0xD8, 0x49, 0xFE, - 0x27, 0x6B, 0x84, 0xE4, 0x63, 0x91, 0x4E, 0x82, 0x8E, 0xFA, - 0x68, 0x41, 0x8F, 0x35, 0x0D, 0xDE, 0xA7, 0x66, 0x29, 0x38, - 0x4D, 0xE9, 0xA3, 0x22, 0x48, 0xE9, 0x2B, 0x45, 0xC4, 0xED, - 0xA3, 0x5C, 0x0F, 0x13, 0x49, 0xBD, 0x8B, 0x5B, 0xE9, 0x5E, - 0xB5, 0xF7, 0x57, 0xBD, 0x49, 0x06, 0xD5, 0xB5, 0xA4, 0x10, - 0x5D, 0x85, 0x02, 0x2D, 0xB6, 0xE2, 0xCD, 0xAD, 0xE4, 0x51, - 0xE4, 0x0B, 0x24, 0x6A, 0xA6, 0x9F, 0xF2, 0x93, 0x8D, 0x58, - 0x9E, 0xF3, 0xC4, 0xB2, 0xD9, 0xEA, 0x51, 0xF0, 0x89, 0x37, - 0x41, 0x56, 0xBF, 0xA9, 0x76, 0x7F, 0x19, 0x4F, 0x01, 0x6F, - 0x4E, 0x5F, 0xE6, 0x93, 0xEF, 0xBD, 0x18, 0xEE, 0x50, 0xBB, - 0xEA, 0xAA, 0xFC, 0xF2, 0xED, 0x2A, 0x75, 0xB7, 0xE8, 0xF1, - 0x7E, 0x02, 0xFD, 0xCC, 0x75, 0x47, 0x4E, 0x61, 0x24, 0x96, - 0x12, 0x4A, 0xB3, 0xD7, 0x9D, 0x5F, 0x37, 0x4C, 0xED, 0xF6, - 0xB7, 0x16, 0xD6, 0x6D, 0x7F, 0x71, 0x3C, 0xE1, 0x5A, 0xDD, - 0x16, 0x47, 0x61, 0x6F, 0x1A, 0x99, 0x6E, 0x24, 0xA4, 0x4A, - 0xE7, 0xBB, 0x1A, 0x1A, 0x54, 0x53, 0x51, 0x15, 0x20, 0x62, - 0x4D, 0xB5, 0x0D, 0xE1, 0x20, 0x96, 0xE5, 0x82, 0xE1, 0x2C, - 0x81, 0xFE, 0xF9, 0x76, 0xA6, 0xBD, 0x5B, 0x68, 0xB6, 0xF9, - 0xA6, 0x0F, 0x74, 0xF6, 0xB1, 0x4A, 0x8F, 0x19, 0x0F, 0xCB, - 0x99, 0xA1, 0x6D, 0x22, 0xB5, 0x32, 0x55, 0x35, 0x08, 0xF8, - 0xE9, 0x20, 0xF6, 0xE0, 0xDE, 0x82, 0x4C, 0xEF, 0xAB, 0x97, - 0xF1, 0x5C, 0xCC, 0x99, 0xDA, 0xBD, 0xEF, 0xF3, 0xAC, 0x64, - 0x9E, 0xFF, 0x00, 0x6D, 0x30, 0xCB, 0x14, 0x0D, 0x70, 0xC0, - 0x36, 0x95, 0x6D, 0x30, 0xAC, 0x9A, 0x22, 0x0C, 0x19, 0xE4, - 0xEF, 0x1A, 0x39, 0x03, 0xBA, 0x34, 0x93, 0xC7, 0x1D, 0x9D, - 0x8B, 0x16, 0x05, 0x70, 0x49, 0x35, 0x6F, 0xEF, 0x9D, 0xA4, - 0xD7, 0x34, 0x9B, 0x34, 0xB1, 0xDA, 0xE8, 0x12, 0x42, 0xA6, - 0x45, 0x0F, 0xA5, 0xA2, 0xB6, 0x94, 0x19, 0x49, 0xA2, 0xC7, - 0x5F, 0x12, 0xCA, 0x38, 0xEA, 0x60, 0x00, 0x39, 0xE3, 0xA6, - 0xC3, 0x56, 0x6C, 0x7F, 0x8F, 0xC1, 0x2C, 0xE8, 0xAB, 0x7B, - 0xC8, 0xBA, 0xB9, 0xDA, 0x37, 0x6B, 0xAD, 0xB7, 0x67, 0x94, - 0xDE, 0x6D, 0xE6, 0x01, 0x6D, 0x6B, 0x72, 0xC2, 0x3E, 0x7F, - 0x3E, 0xEE, 0x4B, 0x40, 0x32, 0xAF, 0x2D, 0xB5, 0xC0, 0xD9, - 0x1E, 0x19, 0x60, 0x7E, 0x90, 0x09, 0x00, 0x65, 0x81, 0xEE, - 0xC1, 0xFD, 0xEB, 0xB9, 0x90, 0xD4, 0xF7, 0xBF, 0xCC, 0x8E, - 0x17, 0x87, 0x65, 0x99, 0xE7, 0x9A, 0x44, 0x5A, 0xC8, 0x79, - 0x5A, 0x61, 0x7B, 0xDF, 0x0F, 0xAD, 0xC3, 0x02, 0xEA, 0x15, - 0x0D, 0x49, 0x22, 0x9C, 0xCE, 0xE7, 0x9F, 0x0F, 0xFD, 0xBC, - 0x02, 0x71, 0x1C, 0x83, 0xF2, 0xE6, 0xC5, 0x73, 0x32, 0xB5, - 0x74, 0xCE, 0xFD, 0x65, 0xD6, 0x1B, 0x04, 0x97, 0x53, 0x6D, - 0xCF, 0x0D, 0xAC, 0xB2, 0x3C, 0x2F, 0x69, 0x76, 0x11, 0xF5, - 0x05, 0xA1, 0xEF, 0x28, 0x2C, 0x3B, 0x68, 0x54, 0xE6, 0x18, - 0x11, 0xD9, 0x88, 0xB7, 0x14, 0x77, 0x72, 0xCA, 0xEE, 0x9C, - 0x0B, 0xA2, 0xD6, 0xFB, 0x56, 0xD9, 0x6D, 0x08, 0x82, 0x0B, - 0x58, 0xA3, 0x85, 0x5B, 0x5A, 0xC6, 0xA8, 0xB4, 0x0D, 0xF7, - 0xD4, 0xA7, 0x1C, 0x47, 0x10, 0x88, 0xD0, 0x13, 0xB3, 0x15, - 0x2B, 0x0E, 0x5C, 0x4C, 0xFF, 0x00, 0x9C, 0xFE, 0xEF, 0xFA, - 0x58, 0x49, 0x2F, 0x56, 0xDF, 0xA3, 0xC5, 0xF8, 0x0B, 0xF7, - 0x30, 0x92, 0x43, 0x3A, 0x9E, 0xE3, 0x74, 0x82, 0xC6, 0x27, - 0xB0, 0x13, 0x53, 0x9C, 0xA2, 0xED, 0xAD, 0x63, 0x49, 0x6E, - 0x16, 0x1D, 0x2C, 0x6B, 0x12, 0x48, 0x19, 0x4B, 0x17, 0xD2, - 0x38, 0x1C, 0x89, 0xC0, 0xAA, 0x92, 0x06, 0x0A, 0x7F, 0x0F, - 0x85, 0x39, 0x4C, 0x89, 0xE5, 0xD1, 0x86, 0x62, 0x44, 0x5F, - 0x0D, 0x24, 0x63, 0xA1, 0xFA, 0xD0, 0x6E, 0x9F, 0x3D, 0x7B, - 0x7E, 0x27, 0x9F, 0x70, 0x98, 0x58, 0xC2, 0xF1, 0xC6, 0x21, - 0x8C, 0xC6, 0x82, 0x41, 0x27, 0x2E, 0x07, 0x66, 0x08, 0xD1, - 0x9D, 0x22, 0xBC, 0xD5, 0x6D, 0x4C, 0xD9, 0xF0, 0x02, 0x95, - 0x22, 0xA7, 0xBD, 0x96, 0x27, 0x0E, 0x43, 0xED, 0x53, 0xEF, - 0x7D, 0x15, 0x26, 0x14, 0xC6, 0x72, 0xE5, 0xF1, 0x2C, 0xCF, - 0x21, 0xA5, 0xFF, 0x00, 0x09, 0x0C, 0x07, 0x3B, 0xBA, 0x99, - 0x79, 0x73, 0xD5, 0xDB, 0x5E, 0xCD, 0x1B, 0x08, 0xD3, 0x78, - 0xDC, 0x9A, 0xE5, 0x55, 0xB9, 0x71, 0xE8, 0x51, 0x01, 0xE2, - 0x48, 0x05, 0x68, 0x45, 0x38, 0xE7, 0x99, 0xE1, 0x4C, 0x3E, - 0x46, 0x71, 0x8F, 0xCC, 0x5D, 0x47, 0xA5, 0x4E, 0xD6, 0xB5, - 0x63, 0x89, 0xA5, 0x4F, 0x2E, 0xB3, 0xF7, 0x90, 0x88, 0x67, - 0xEA, 0x81, 0x77, 0x60, 0xAB, 0xB1, 0xC1, 0x6A, 0xA9, 0x74, - 0x1B, 0xC4, 0x45, 0x08, 0x26, 0x38, 0xEE, 0x65, 0x8D, 0xEE, - 0x40, 0xAB, 0x77, 0x0B, 0x2B, 0x48, 0xCE, 0xFD, 0xA4, 0x70, - 0xAE, 0x78, 0xE1, 0xAF, 0x58, 0xE0, 0x75, 0xB2, 0x91, 0xE9, - 0x2C, 0x84, 0x64, 0x44, 0xDC, 0x88, 0xC9, 0x83, 0xEB, 0x69, - 0x31, 0xD1, 0x8E, 0x39, 0x70, 0xE7, 0x52, 0xE7, 0xDD, 0xFA, - 0xEA, 0x39, 0xAE, 0x2D, 0xE2, 0xDB, 0x44, 0xD1, 0xB4, 0xB7, - 0x02, 0xDE, 0xEC, 0xD0, 0x68, 0x8F, 0x9A, 0xEB, 0x0D, 0x54, - 0x1E, 0xF5, 0x11, 0x01, 0xF3, 0xD5, 0x7C, 0xF8, 0x69, 0x9D, - 0x4D, 0x0C, 0xB9, 0x0B, 0x6B, 0x22, 0x04, 0x8C, 0xD8, 0xB4, - 0x5E, 0x3B, 0x4B, 0x0C, 0xDD, 0xE7, 0xB8, 0xA7, 0x76, 0x21, - 0xD6, 0xF3, 0xDA, 0xEE, 0x12, 0xEE, 0x73, 0xF2, 0x35, 0xA3, - 0x2D, 0x94, 0x61, 0x23, 0xE7, 0x24, 0x8A, 0x4D, 0x1C, 0x2F, - 0x2F, 0x48, 0x04, 0x76, 0x31, 0x7A, 0xF9, 0xB8, 0x63, 0xB4, - 0xF7, 0x84, 0x17, 0x4C, 0xBC, 0xF4, 0x71, 0x94, 0x05, 0x30, - 0xF8, 0xF8, 0xB1, 0x2C, 0x46, 0xCD, 0x2F, 0xD9, 0x97, 0xAD, - 0x41, 0x7B, 0xAE, 0xBC, 0x8E, 0xC9, 0xC5, 0x6E, 0x5F, 0x70, - 0xF0, 0x48, 0xF6, 0xE0, 0x43, 0x6E, 0x61, 0x69, 0x5A, 0x0D, - 0x52, 0x73, 0x5B, 0x48, 0x2B, 0x22, 0xCE, 0x74, 0xAA, 0x81, - 0x4A, 0x01, 0xDD, 0x39, 0x9C, 0x31, 0xEA, 0x36, 0xB7, 0x6E, - 0x6E, 0x5A, 0x54, 0x91, 0x4E, 0xC8, 0xCC, 0x79, 0x44, 0x33, - 0x97, 0xF1, 0x49, 0xDB, 0x36, 0x0D, 0xB4, 0x18, 0xE2, 0x4E, - 0xD7, 0xC4, 0x60, 0x17, 0xDB, 0xE9, 0x3D, 0xE3, 0xC6, 0xD0, - 0xDB, 0x42, 0xC2, 0x47, 0x24, 0x47, 0x25, 0xC4, 0x6B, 0x1E, - 0x9C, 0xE7, 0x88, 0xEB, 0x32, 0x34, 0x44, 0x65, 0x0C, 0x8C, - 0xA4, 0xF2, 0xA9, 0x55, 0x27, 0x4E, 0x14, 0x8D, 0x5D, 0x1C, - 0xB9, 0x75, 0x2E, 0x51, 0x8F, 0x0F, 0x20, 0xC8, 0xE1, 0xAD, - 0xB1, 0xF9, 0x65, 0x83, 0x66, 0xF9, 0x80, 0x3E, 0x6D, 0x60, - 0x66, 0x4E, 0xEF, 0xF7, 0x5D, 0x79, 0x69, 0x25, 0x94, 0x76, - 0x03, 0xC5, 0x4F, 0xE0, 0x9B, 0xC4, 0xF2, 0xA1, 0x1C, 0x96, - 0xBA, 0x11, 0xB7, 0x7C, 0xB3, 0x0F, 0x67, 0x58, 0x1D, 0xCD, - 0x49, 0xE6, 0xD5, 0xC0, 0x3A, 0xA1, 0xA8, 0x19, 0xB1, 0xC3, - 0xBD, 0x32, 0xCA, 0x9D, 0x94, 0xC4, 0x8C, 0xFC, 0x23, 0x3E, - 0x0E, 0x71, 0xCA, 0xE3, 0x0E, 0x96, 0xD6, 0xD2, 0xEA, 0xD2, - 0x5C, 0x4D, 0xFF, 0x00, 0xAC, 0xE4, 0x9A, 0x68, 0x8E, 0xD4, - 0x62, 0x85, 0x64, 0x29, 0x0D, 0xCF, 0x28, 0x96, 0x65, 0xD1, - 0x91, 0xD1, 0xCC, 0xEE, 0xD5, 0xAA, 0x75, 0x56, 0x80, 0x64, - 0x45, 0x4E, 0x16, 0xF2, 0xA6, 0xC4, 0xD3, 0x67, 0x68, 0x00, - 0x3B, 0xC7, 0x2D, 0x88, 0x7E, 0x7D, 0xAD, 0xB3, 0x56, 0xBD, - 0xA8, 0xDF, 0x4C, 0x5D, 0x6F, 0x17, 0x5B, 0x2D, 0xBC, 0xBB, - 0xCD, 0xBF, 0x86, 0xDC, 0xB4, 0xD2, 0xE6, 0x11, 0xC0, 0x30, - 0xCA, 0xA0, 0x8C, 0x8D, 0x78, 0xE4, 0x06, 0x0D, 0x48, 0xC8, - 0xC4, 0x66, 0xD2, 0xAB, 0xF8, 0x85, 0x3A, 0x50, 0xAD, 0x21, - 0x44, 0xE6, 0xA7, 0xA8, 0xA9, 0xDF, 0xE7, 0x3F, 0xBB, 0xFE, - 0x96, 0x08, 0xA1, 0x2F, 0x56, 0xDF, 0xA3, 0xC5, 0xF8, 0x0B, - 0xF7, 0x30, 0x92, 0x4E, 0x61, 0x24, 0x96, 0x12, 0x49, 0x61, - 0x24, 0x96, 0x12, 0x49, 0x61, 0x24, 0x96, 0x12, 0x49, 0x61, - 0x24, 0x96, 0x12, 0x49, 0x61, 0x24, 0x96, 0x12, 0x49, 0x61, - 0x24, 0x99, 0xFF, 0x00, 0x39, 0xFD, 0xDF, 0xF4, 0xB0, 0x92, - 0x5C, 0xDD, 0x0E, 0xE1, 0xBA, 0x98, 0x93, 0xFC, 0x6D, 0xC7, - 0xB2, 0x3F, 0xAD, 0x93, 0xC9, 0xE9, 0xC2, 0x25, 0x3D, 0x93, - 0xE9, 0x7B, 0xB9, 0xFF, 0x00, 0xAC, 0xB8, 0xFA, 0x59, 0x3D, - 0x78, 0x6B, 0xA7, 0x08, 0xA7, 0xD2, 0xF7, 0x73, 0x3F, 0xE7, - 0x2E, 0x3E, 0x96, 0x4F, 0x5E, 0x38, 0xE8, 0xB1, 0xA6, 0x9F, - 0x5B, 0xBD, 0xC8, 0x0A, 0x9B, 0xC9, 0xF2, 0xCF, 0xF2, 0xAF, - 0xEB, 0xC7, 0x1D, 0x1A, 0x34, 0x50, 0xEB, 0x7E, 0xB4, 0xB6, - 0x92, 0x30, 0xFF, 0x00, 0x58, 0x5C, 0xA6, 0x5A, 0x8A, 0xB3, - 0x49, 0x90, 0xA5, 0x6B, 0x55, 0x2C, 0xBC, 0x3C, 0xF8, 0x91, - 0x2B, 0x5A, 0x80, 0xE8, 0x5D, 0x88, 0x81, 0x44, 0x76, 0xCE, - 0xA4, 0xB1, 0xB9, 0x25, 0xE5, 0xDD, 0x6E, 0x62, 0x89, 0x46, - 0xAA, 0x52, 0xE4, 0xBB, 0x8C, 0xBD, 0x90, 0x07, 0x0C, 0xF8, - 0xE1, 0xF1, 0xB1, 0xAB, 0xAC, 0x77, 0x85, 0xC9, 0x54, 0xA6, - 0x34, 0x29, 0x92, 0x75, 0x2E, 0xC6, 0xD3, 0x72, 0x45, 0xFD, - 0xFD, 0xB3, 0xC9, 0x1A, 0x4D, 0x0B, 0xC8, 0x26, 0x64, 0x61, - 0x22, 0x6B, 0x54, 0x56, 0x04, 0xD0, 0xD3, 0x36, 0xD5, 0xC3, - 0x0F, 0x36, 0x32, 0x67, 0x1E, 0xD5, 0xD1, 0x56, 0x0F, 0x88, - 0x42, 0x65, 0xEB, 0x3B, 0x58, 0xA6, 0x78, 0x9F, 0x71, 0xB8, - 0x0C, 0x95, 0xD5, 0x9C, 0xFD, 0x86, 0x9E, 0x9C, 0xFB, 0x30, - 0x03, 0x69, 0x53, 0x91, 0x52, 0x06, 0xEF, 0x90, 0x52, 0x6D, - 0x7A, 0x89, 0xEE, 0xAE, 0x1A, 0x08, 0x2F, 0x6E, 0x19, 0xD6, - 0x24, 0x9C, 0xD5, 0xE4, 0x03, 0x44, 0x9C, 0x38, 0x9E, 0x3E, - 0x51, 0xD9, 0x51, 0x80, 0xCE, 0x94, 0xA2, 0x1C, 0xED, 0x64, - 0xF1, 0x4E, 0x04, 0xB0, 0x52, 0xBC, 0x6E, 0xE1, 0xFE, 0xAE, - 0x6F, 0xA5, 0x7F, 0x5E, 0x06, 0xE9, 0xC6, 0x80, 0xD8, 0x91, - 0xBD, 0xDC, 0x3F, 0xD5, 0xCD, 0xF4, 0xAF, 0xEB, 0xC2, 0x74, - 0xC3, 0x40, 0x6C, 0x5E, 0x4D, 0xEE, 0xE1, 0xFE, 0xAA, 0x7F, - 0xA5, 0x7F, 0x5E, 0x13, 0xA6, 0x1A, 0x23, 0x62, 0x6B, 0xC6, - 0x6E, 0x1C, 0xEF, 0xD2, 0xA7, 0xF6, 0x7F, 0x3A, 0xFE, 0x5F, - 0x4E, 0x3A, 0xE9, 0x9B, 0xA0, 0xE8, 0x5D, 0xBC, 0x2C, 0x63, - 0x4C, 0xBE, 0x48, 0xFB, 0x98, 0x7A, 0x87, 0x18, 0x29, 0x71, - 0xDB, 0x1E, 0x24, 0x63, 0x84, 0xA9, 0x30, 0xA4, 0xA4, 0x2C, - 0x34, 0x03, 0x2F, 0x46, 0x1A, 0x4A, 0x97, 0x0A, 0x0B, 0xD8, - 0x4F, 0x36, 0x1A, 0xA4, 0xC6, 0x88, 0x53, 0xF6, 0xA8, 0x61, - 0x33, 0x2B, 0x18, 0x4C, 0xEE, 0x86, 0xBC, 0xB0, 0x06, 0x95, - 0x03, 0x83, 0x1A, 0xF1, 0xF4, 0x60, 0xD4, 0x40, 0x25, 0x0E, - 0xBB, 0xC4, 0x68, 0xC1, 0x7D, 0x5E, 0x9E, 0xEA, 0x55, 0xBC, - 0xAC, 0x5B, 0xF4, 0x85, 0x59, 0x8B, 0x2A, 0xBC, 0x2A, 0x4A, - 0x86, 0xA9, 0x55, 0xA9, 0x27, 0x21, 0xE8, 0xCF, 0x12, 0xEA, - 0x5D, 0x43, 0x46, 0x4C, 0x7A, 0x55, 0x76, 0xEC, 0xED, 0x4D, - 0x6E, 0xF6, 0x3B, 0x9C, 0x49, 0x1C, 0x11, 0x6F, 0x2E, 0xF7, - 0xAB, 0x33, 0xC8, 0x4A, 0x25, 0x0E, 0x97, 0x00, 0xAA, 0x36, - 0x96, 0x03, 0xBA, 0x6B, 0xE5, 0x3E, 0x8E, 0xDE, 0xFA, 0x98, - 0x47, 0xEE, 0xB9, 0x45, 0xA5, 0x6B, 0x39, 0xEB, 0x68, 0xA7, - 0xB6, 0x5D, 0x82, 0xE6, 0x23, 0x3C, 0xDB, 0x9E, 0xE0, 0xDB, - 0xAC, 0xD3, 0xE8, 0xD3, 0xAD, 0x0A, 0x88, 0xCA, 0x82, 0x3B, - 0x94, 0x39, 0x83, 0x51, 0xF1, 0x63, 0x95, 0x32, 0x48, 0x03, - 0x95, 0x93, 0xF3, 0xCA, 0x05, 0x81, 0x44, 0x6E, 0x36, 0x3B, - 0x66, 0x8E, 0x4E, 0x5E, 0x98, 0xCA, 0x29, 0x60, 0x73, 0x14, - 0x00, 0x56, 0xBD, 0xE3, 0xC3, 0x00, 0x95, 0x38, 0xB2, 0x24, - 0x2E, 0x24, 0xE1, 0xD0, 0x28, 0x2D, 0xA7, 0x9D, 0xB4, 0xC3, - 0x1B, 0x3B, 0x76, 0xD3, 0x80, 0xF4, 0x9E, 0xCC, 0x45, 0x00, - 0x9D, 0x0A, 0x6C, 0x88, 0x1A, 0x51, 0x09, 0x3A, 0x7A, 0xED, - 0x6D, 0x04, 0xCA, 0xCA, 0xF2, 0xE6, 0x5E, 0x05, 0xF6, 0x95, - 0x7B, 0x0F, 0xC3, 0x82, 0x9A, 0x44, 0x05, 0x1C, 0x57, 0x81, - 0x93, 0x21, 0x7A, 0x4F, 0x93, 0xD3, 0x81, 0x22, 0x98, 0x2F, - 0x1A, 0x4F, 0x3B, 0x87, 0xC9, 0xFE, 0x3C, 0x24, 0x3C, 0x98, - 0xAE, 0x78, 0xB5, 0x8E, 0x55, 0x45, 0xF9, 0xC7, 0xE0, 0x3E, - 0x53, 0x7A, 0xF0, 0xD3, 0x25, 0x36, 0xDE, 0xD5, 0x5E, 0xBA, - 0x47, 0x6A, 0x5B, 0x64, 0x3B, 0x96, 0xE6, 0x46, 0x89, 0x14, - 0x2D, 0x9A, 0x4A, 0xC4, 0x80, 0x4D, 0x09, 0x76, 0x53, 0xE6, - 0xE1, 0xE6, 0xCF, 0x13, 0x6D, 0x6D, 0xC9, 0xC5, 0x91, 0x6E, - 0x6A, 0x46, 0x90, 0x00, 0x72, 0xE6, 0x56, 0xAB, 0x79, 0xED, - 0xFC, 0x7B, 0x2E, 0xE7, 0x6E, 0x27, 0xB0, 0xB9, 0x47, 0x86, - 0x37, 0x61, 0xA9, 0xE0, 0x24, 0x52, 0x44, 0x5A, 0x15, 0x1A, - 0x80, 0xF6, 0x4E, 0x26, 0xCA, 0x02, 0x51, 0x6D, 0x63, 0x93, - 0xAA, 0xB8, 0xD6, 0xA9, 0x19, 0xB8, 0x3C, 0x86, 0xA2, 0xBC, - 0xEC, 0xDD, 0x0D, 0xB2, 0xC5, 0x7F, 0x2C, 0xB2, 0xC5, 0x73, - 0x7F, 0x63, 0x14, 0x85, 0x22, 0x9A, 0xE2, 0x43, 0x1C, 0x52, - 0xB1, 0xF6, 0x56, 0x24, 0x8C, 0x89, 0x25, 0x00, 0x90, 0x09, - 0x34, 0x5E, 0xCA, 0xE2, 0xBE, 0x36, 0xF1, 0x76, 0x65, 0x73, - 0x73, 0xC4, 0xE7, 0x90, 0x10, 0x63, 0x19, 0x11, 0xA2, 0x21, - 0xCF, 0x5B, 0xE0, 0x3D, 0xA8, 0xBD, 0xDE, 0xEF, 0x65, 0xB7, - 0x09, 0x2D, 0xF6, 0xD8, 0x23, 0xB6, 0x01, 0x75, 0xCD, 0x2A, - 0xA8, 0x8E, 0x34, 0x51, 0xF2, 0xB2, 0xE3, 0x4E, 0x15, 0x27, - 0x12, 0x72, 0x88, 0x8C, 0x18, 0x05, 0x52, 0x23, 0x3A, 0xA4, - 0x66, 0x26, 0x45, 0x51, 0x3A, 0x97, 0xAE, 0xE4, 0x99, 0x90, - 0x6D, 0x77, 0x13, 0xAD, 0xC2, 0x2B, 0x47, 0x36, 0xE0, 0x5C, - 0xAE, 0xB5, 0x26, 0xB4, 0x45, 0x3C, 0x33, 0xF9, 0x67, 0x3F, - 0x26, 0x2B, 0xAA, 0x54, 0x0E, 0xF1, 0x0C, 0x4E, 0x93, 0xB5, - 0x68, 0xEC, 0xB8, 0x59, 0x8E, 0x35, 0x18, 0xFF, 0x00, 0x2A, - 0x93, 0xD3, 0x5B, 0x30, 0x7B, 0x78, 0x4B, 0x4B, 0x23, 0x0B, - 0xB1, 0xAA, 0x22, 0xD5, 0x56, 0x72, 0x28, 0x75, 0x23, 0x37, - 0x7A, 0x82, 0xB4, 0xCB, 0x2F, 0x87, 0x12, 0x69, 0x88, 0x53, - 0x8E, 0x67, 0xEB, 0x4D, 0xBB, 0xBA, 0x69, 0x18, 0x8C, 0x25, - 0x15, 0x67, 0x30, 0xC3, 0x6F, 0x74, 0xD6, 0x56, 0x8C, 0xFA, - 0x91, 0x54, 0xCD, 0x24, 0x92, 0x06, 0x0B, 0x5C, 0xD8, 0xE4, - 0x72, 0x50, 0x07, 0x13, 0xD9, 0x86, 0xDB, 0xDC, 0x6F, 0x89, - 0x23, 0xC9, 0x1D, 0x7B, 0x55, 0x54, 0xA0, 0x72, 0xE7, 0x96, - 0xB3, 0x86, 0x08, 0x4A, 0x35, 0x8E, 0xE8, 0x22, 0xE6, 0x3D, - 0xCD, 0xDC, 0x2C, 0xDC, 0xC8, 0xEC, 0xA1, 0x06, 0x92, 0x90, - 0x7B, 0xAF, 0x23, 0x06, 0x04, 0x03, 0x5A, 0x80, 0x48, 0xF3, - 0xE1, 0x97, 0x17, 0x34, 0xA3, 0x17, 0x9C, 0xBC, 0x2A, 0x4E, - 0x63, 0x44, 0x90, 0x00, 0xCF, 0xA3, 0xA3, 0xA3, 0xE2, 0xA6, - 0xEE, 0x3B, 0x16, 0xE0, 0x90, 0x5B, 0x4C, 0x50, 0x5B, 0xDA, - 0xA3, 0x05, 0x96, 0xCA, 0xD5, 0x82, 0xB2, 0xF6, 0xD0, 0xBD, - 0x02, 0xD5, 0xBE, 0xFB, 0x8F, 0x9F, 0x10, 0x6D, 0xF8, 0xB5, - 0x3A, 0xB2, 0x30, 0x80, 0xCA, 0x35, 0x13, 0xAF, 0xA1, 0x45, - 0x9D, 0x59, 0x93, 0xA5, 0xCE, 0xDD, 0x7C, 0xBB, 0x13, 0x72, - 0x32, 0xDA, 0x08, 0x2E, 0xA6, 0xDD, 0x16, 0xCE, 0xC9, 0x99, - 0x9A, 0x45, 0x04, 0xF3, 0x09, 0x50, 0x46, 0x9D, 0x43, 0x33, - 0x9F, 0x9A, 0xA7, 0xB7, 0x16, 0x54, 0x89, 0x18, 0x81, 0x86, - 0xB3, 0x2F, 0x72, 0x11, 0xB6, 0x32, 0x90, 0x8E, 0x2F, 0xB0, - 0x0E, 0x4C, 0x15, 0x2B, 0xAB, 0xF7, 0xBD, 0xBF, 0x72, 0xDC, - 0x56, 0x6D, 0xB9, 0x5D, 0x14, 0x2D, 0x27, 0x98, 0xD5, 0x0C, - 0x8E, 0x4F, 0x1D, 0x20, 0xF0, 0x1F, 0x1E, 0x22, 0xDC, 0x4C, - 0x48, 0xE0, 0xB4, 0x76, 0x96, 0xF2, 0x84, 0x5A, 0x78, 0xEC, - 0xE6, 0x40, 0xB9, 0xB3, 0x7E, 0x71, 0xFF, 0x00, 0x18, 0xFA, - 0xF0, 0x04, 0x6C, 0x83, 0x37, 0x52, 0x65, 0x14, 0x04, 0x1E, - 0x4A, 0x0C, 0x3D, 0xD0, 0xAD, 0xA8, 0x30, 0x08, 0xCE, 0xD7, - 0x35, 0xE5, 0xCC, 0xC7, 0x6B, 0x01, 0xDA, 0x77, 0x3C, 0xD7, - 0x2E, 0x49, 0xD2, 0x48, 0x05, 0x0E, 0x7C, 0x32, 0x1F, 0x16, - 0x2F, 0x2C, 0x6A, 0x08, 0xC4, 0x09, 0x69, 0xF7, 0x2C, 0xF7, - 0x16, 0x02, 0x55, 0x72, 0x53, 0xC4, 0x0D, 0x3C, 0xC7, 0x67, - 0x2D, 0xAC, 0xAE, 0x76, 0x3B, 0xF2, 0xD9, 0x40, 0xB0, 0xC3, - 0x70, 0x4E, 0x9D, 0x31, 0x4A, 0xE8, 0x7D, 0xB7, 0xA5, 0x1A, - 0x8D, 0xC6, 0x80, 0x1A, 0x71, 0xC0, 0x2B, 0x5D, 0xD3, 0x88, - 0x73, 0x88, 0x09, 0x7A, 0x39, 0x42, 0x23, 0x33, 0x39, 0x18, - 0x7C, 0x55, 0xA2, 0xE3, 0x70, 0xB6, 0xB4, 0xB5, 0x8E, 0x49, - 0x27, 0x42, 0xB3, 0xAA, 0xF2, 0x95, 0x48, 0x68, 0xD4, 0x8E, - 0x1A, 0x50, 0x16, 0xE0, 0x32, 0xCC, 0xD7, 0x0E, 0x84, 0xC4, - 0xDA, 0x43, 0xCA, 0x54, 0x5C, 0x86, 0x20, 0x83, 0xA4, 0x2A, - 0xEF, 0x56, 0x5C, 0x45, 0xBB, 0x6D, 0xD6, 0xBB, 0x66, 0xDF, - 0x3F, 0x22, 0xD5, 0xBE, 0x72, 0xF2, 0x46, 0x42, 0xCD, 0x2B, - 0xAF, 0xB0, 0xA3, 0x49, 0xF6, 0x17, 0x8D, 0x2B, 0xC7, 0xD1, - 0x8A, 0xDB, 0x8D, 0xE6, 0x62, 0x66, 0x43, 0x6A, 0x88, 0x7E, - 0xF2, 0x74, 0x95, 0x65, 0xC3, 0x6A, 0xD3, 0xA4, 0x4C, 0x88, - 0xCD, 0x2D, 0x4A, 0x57, 0x4A, 0xEC, 0x9B, 0x46, 0xD7, 0x6C, - 0x7C, 0x26, 0xDE, 0x9B, 0xAE, 0xEF, 0x2A, 0xD1, 0xEF, 0xB7, - 0x08, 0x01, 0xB7, 0x80, 0x9E, 0xC8, 0xA1, 0x7D, 0x66, 0x47, - 0x1E, 0x5F, 0xE0, 0xC0, 0x2E, 0x38, 0x85, 0x1A, 0x01, 0xA2, - 0x33, 0x4D, 0xB9, 0x39, 0xD4, 0x39, 0x3A, 0x75, 0xE5, 0xDD, - 0x7A, 0xF2, 0x60, 0x4D, 0x3A, 0x7B, 0x22, 0x7C, 0x47, 0xAD, - 0x14, 0xBE, 0xB9, 0xBD, 0xB7, 0xB5, 0x9C, 0xC5, 0x76, 0xE7, - 0x72, 0x95, 0x69, 0x73, 0x7D, 0x34, 0x66, 0x49, 0x96, 0x35, - 0x19, 0x24, 0x08, 0x95, 0x58, 0x85, 0x3B, 0x38, 0xE2, 0xAA, - 0x9C, 0xAB, 0xDD, 0x1C, 0xF3, 0xFD, 0x3F, 0xF6, 0xF6, 0x0F, - 0x37, 0xB1, 0x06, 0x8D, 0x3A, 0x54, 0xFC, 0xDA, 0x36, 0x3F, - 0x79, 0x7D, 0x28, 0x26, 0xD3, 0xD3, 0x77, 0xB7, 0x4A, 0xF2, - 0x23, 0x3C, 0x11, 0xCF, 0x53, 0x71, 0x77, 0x76, 0x00, 0x69, - 0x2B, 0xC7, 0x44, 0x39, 0x93, 0xE9, 0x7F, 0x8B, 0x07, 0xBA, - 0xE2, 0xC6, 0x88, 0xCB, 0x08, 0xCA, 0x52, 0xFC, 0x25, 0x87, - 0xB9, 0x1A, 0xAD, 0xEE, 0x63, 0x81, 0x00, 0x0E, 0x87, 0xED, - 0x46, 0x3E, 0xB1, 0x87, 0x62, 0xB7, 0x36, 0x7B, 0x6D, 0x8C, - 0x8C, 0xCC, 0x47, 0x3A, 0xE6, 0x70, 0xC4, 0x39, 0xF2, 0xD1, - 0x2A, 0x4F, 0x9B, 0x31, 0x8A, 0x31, 0x6B, 0x5A, 0xE6, 0x79, - 0xEA, 0x93, 0xD0, 0x01, 0xF6, 0x9F, 0x82, 0x00, 0x8C, 0x65, - 0x89, 0x98, 0xED, 0x51, 0x6E, 0x6E, 0xF7, 0x9B, 0xEB, 0x71, - 0xE0, 0xDA, 0x38, 0xA6, 0x42, 0x74, 0xBC, 0x9A, 0x80, 0x19, - 0x91, 0x5D, 0x0A, 0x73, 0xA8, 0xEC, 0x3D, 0xB8, 0xBF, 0x8D, - 0x7A, 0x56, 0xED, 0x92, 0x9C, 0xE5, 0x2D, 0xA4, 0x22, 0x40, - 0xD3, 0x12, 0xF1, 0x9F, 0x0F, 0x33, 0x3F, 0x6F, 0x22, 0xA8, - 0xBB, 0xE7, 0x4E, 0xF5, 0x5C, 0xF7, 0x0D, 0x71, 0x75, 0xAA, - 0xF9, 0xC9, 0xF6, 0xD3, 0x21, 0xF0, 0x25, 0x14, 0x0F, 0x83, - 0x05, 0x17, 0x86, 0xA7, 0x98, 0x4B, 0xAC, 0x15, 0x71, 0x42, - 0xEE, 0xDA, 0x21, 0xA2, 0x63, 0x14, 0x0A, 0x5D, 0xB7, 0x71, - 0x89, 0xB4, 0xCB, 0x69, 0x32, 0x37, 0x90, 0xC6, 0xDE, 0xAC, - 0x1A, 0x31, 0x27, 0x40, 0x2A, 0x48, 0xAF, 0x4C, 0xFD, 0xE8, - 0xF6, 0x84, 0xDF, 0x85, 0xB9, 0xAD, 0x39, 0x32, 0x57, 0xC9, - 0xA1, 0xAB, 0xF7, 0x30, 0xED, 0xDC, 0xB6, 0x1E, 0xC4, 0xDD, - 0xF5, 0x3C, 0xDE, 0x68, 0xE8, 0xDA, 0x13, 0x51, 0x80, 0x74, - 0x83, 0xC3, 0x2A, 0xFA, 0x06, 0x09, 0x46, 0x02, 0x53, 0x11, - 0xDA, 0x51, 0x8C, 0xB2, 0x53, 0x32, 0xD9, 0x17, 0xEC, 0x08, - 0xDE, 0xD3, 0xB7, 0x5D, 0x5D, 0x47, 0x70, 0xF6, 0x90, 0xB3, - 0xDE, 0x4B, 0x1B, 0x48, 0xCA, 0x0D, 0x3B, 0xCF, 0x40, 0x59, - 0x89, 0xC8, 0x00, 0x1B, 0xB7, 0x12, 0x8F, 0xE6, 0x4A, 0x52, - 0x1A, 0x75, 0x75, 0xAC, 0xFD, 0x94, 0x61, 0x4E, 0x51, 0x94, - 0xB0, 0x1A, 0x4B, 0xED, 0x44, 0xF6, 0x8E, 0x99, 0xDC, 0x1A, - 0xE5, 0x21, 0x34, 0x8E, 0x28, 0x56, 0x94, 0x35, 0xAB, 0xBB, - 0x66, 0xC4, 0x53, 0xB2, 0xB9, 0x60, 0xB5, 0xEC, 0xF3, 0x53, - 0x8C, 0x43, 0x61, 0xC8, 0xA8, 0xF7, 0x37, 0xA2, 0x75, 0x8C, - 0xCB, 0xB6, 0xAE, 0x5D, 0xEA, 0xCE, 0x36, 0xD9, 0x75, 0xC1, - 0x6F, 0x03, 0x29, 0x08, 0x75, 0x10, 0xCC, 0x07, 0x79, 0x6A, - 0x6A, 0x49, 0xA5, 0x15, 0x71, 0x0A, 0xB5, 0x71, 0x6D, 0x17, - 0x9E, 0x90, 0x35, 0x6C, 0xD9, 0xF6, 0xEC, 0x43, 0x99, 0x35, - 0x0B, 0xA7, 0xD9, 0xE1, 0x85, 0x1D, 0xE6, 0x7E, 0xE4, 0x29, - 0x55, 0x0A, 0x09, 0xD4, 0x69, 0xEC, 0xD3, 0xBB, 0x96, 0x7D, - 0x95, 0xC5, 0x74, 0x66, 0x4E, 0x27, 0xED, 0xDB, 0xAF, 0x93, - 0x22, 0x8A, 0x65, 0x17, 0xE8, 0x1D, 0xBA, 0xF7, 0x7C, 0xDE, - 0x23, 0xB3, 0xB8, 0x1C, 0xBB, 0x5D, 0x3C, 0xD8, 0xA0, 0x61, - 0xA7, 0xBA, 0x0D, 0x5A, 0x49, 0x00, 0xCE, 0x82, 0x99, 0x29, - 0x39, 0x9E, 0x38, 0xB0, 0xB2, 0xB4, 0xA5, 0x56, 0x26, 0xB4, - 0xC0, 0x90, 0x89, 0x60, 0x35, 0x3F, 0xBD, 0x95, 0x7F, 0x13, - 0xBF, 0x34, 0x9A, 0x14, 0xB0, 0x24, 0x63, 0x2D, 0x7F, 0x62, - 0xD2, 0x65, 0xDE, 0xFD, 0xDF, 0x6D, 0xAC, 0x60, 0xB8, 0x8B, - 0x99, 0x1A, 0xF7, 0x45, 0xCB, 0x28, 0x75, 0x24, 0x71, 0x3A, - 0x41, 0x19, 0x7A, 0x06, 0x2E, 0x63, 0x4E, 0xB1, 0x1E, 0x1C, - 0x39, 0x96, 0x5E, 0x55, 0xA2, 0xF8, 0xA8, 0xC6, 0xEB, 0x60, - 0xBE, 0x62, 0x76, 0x31, 0xB1, 0x5F, 0xB1, 0xF6, 0x6D, 0xE5, - 0xD5, 0x04, 0xE7, 0xCC, 0x15, 0xDB, 0x3C, 0x10, 0x67, 0x8F, - 0x9C, 0xCC, 0x77, 0xA4, 0x27, 0x13, 0xA1, 0x90, 0x7D, 0xE3, - 0x7B, 0xBB, 0xD9, 0x81, 0x6D, 0xCB, 0xA4, 0xED, 0x6D, 0xA3, - 0x19, 0x19, 0x8C, 0x2E, 0xD1, 0x7D, 0x22, 0x33, 0x27, 0xF0, - 0xE0, 0xF4, 0xE9, 0x89, 0xF9, 0x6A, 0x13, 0xD6, 0xBA, 0x70, - 0xD4, 0x83, 0x7E, 0xF3, 0xFA, 0x76, 0x95, 0xFA, 0xAB, 0x6C, - 0xA7, 0x97, 0x4B, 0x7F, 0xD5, 0x83, 0xFA, 0x1A, 0x9F, 0x34, - 0x97, 0x33, 0x04, 0x73, 0x67, 0xDD, 0x6F, 0xF7, 0x80, 0x1F, - 0x6F, 0xE9, 0x2B, 0x59, 0x61, 0x6E, 0x13, 0xB4, 0x2F, 0x1C, - 0x5F, 0x48, 0xEC, 0xAB, 0xF1, 0x62, 0x3D, 0x48, 0x08, 0x79, - 0xAA, 0x1E, 0xD4, 0xE1, 0x8E, 0xA4, 0x61, 0x65, 0xD8, 0x2D, - 0x3F, 0xDE, 0xC6, 0xC9, 0x6A, 0x47, 0xB5, 0x6D, 0x6E, 0xAF, - 0x71, 0x2F, 0xA0, 0xE9, 0x61, 0x4C, 0x40, 0xA9, 0x76, 0x06, - 0x89, 0x48, 0xF5, 0xAB, 0x0A, 0x1C, 0x2A, 0xE2, 0xAF, 0x96, - 0x99, 0x6E, 0x8F, 0x8A, 0x19, 0xFB, 0x43, 0xEE, 0x9F, 0xEB, - 0xDF, 0xF6, 0xA1, 0xF9, 0x2F, 0xD2, 0x39, 0x63, 0x47, 0xB5, - 0xF7, 0x9A, 0xBF, 0x8B, 0x00, 0xFD, 0xC6, 0xA6, 0x8C, 0xC5, - 0x59, 0x7F, 0xF2, 0xF7, 0x19, 0x5D, 0xA2, 0xFB, 0x39, 0x05, - 0xCB, 0xD6, 0xCA, 0x09, 0x52, 0xCC, 0x12, 0x30, 0x06, 0xB7, - 0x39, 0x80, 0x3E, 0x0C, 0x43, 0xB6, 0x81, 0x32, 0x70, 0x59, - 0xB5, 0xAD, 0xCC, 0xE5, 0x18, 0xD3, 0x26, 0x5E, 0x56, 0xE4, - 0x11, 0xDB, 0x53, 0x2D, 0xCB, 0xC3, 0x69, 0x68, 0xCD, 0xCC, - 0xBA, 0x60, 0xBA, 0x05, 0x57, 0x2A, 0xD3, 0xBD, 0xF7, 0x69, - 0x80, 0x7A, 0xA3, 0x4E, 0xA1, 0x31, 0x2D, 0x17, 0x55, 0x73, - 0x10, 0x30, 0x2E, 0x31, 0xD2, 0x39, 0x95, 0xB0, 0xC6, 0x64, - 0x77, 0x8E, 0x29, 0x24, 0x93, 0x92, 0xD4, 0x26, 0x30, 0x4D, - 0x29, 0xDB, 0x5C, 0x5B, 0xDF, 0xDC, 0xC2, 0x1A, 0x70, 0x3D, - 0x2D, 0xEF, 0x59, 0x6A, 0x34, 0xC9, 0xD2, 0xBD, 0xAB, 0x72, - 0x22, 0x2C, 0xC0, 0xDC, 0xBB, 0x10, 0x91, 0xA3, 0x54, 0x50, - 0x91, 0xF2, 0x88, 0xEC, 0x5E, 0x38, 0xCF, 0xDD, 0xDC, 0x89, - 0xD2, 0x2C, 0x59, 0xC8, 0xE7, 0xC3, 0x4B, 0x2B, 0x9B, 0x3B, - 0x73, 0x9B, 0x1C, 0x00, 0xC5, 0x17, 0xB7, 0xB6, 0xB3, 0x59, - 0x12, 0x7B, 0xB2, 0xB2, 0x5C, 0x95, 0xD5, 0x0D, 0xBE, 0xAA, - 0xAA, 0xD3, 0xE5, 0x39, 0x1E, 0x9C, 0x55, 0xD2, 0xB7, 0xAD, - 0x74, 0x58, 0x1C, 0x90, 0xD0, 0xE7, 0x49, 0xE8, 0x1E, 0xF4, - 0x7A, 0x95, 0x1B, 0x0C, 0x59, 0x15, 0xE8, 0xED, 0xE2, 0x49, - 0x3A, 0xA3, 0xA9, 0x4A, 0x30, 0x06, 0x0E, 0x9B, 0x9E, 0x44, - 0xD1, 0x96, 0x96, 0x57, 0x14, 0xA6, 0x36, 0xDC, 0x32, 0xC6, - 0x16, 0xF6, 0x91, 0x84, 0x4B, 0xFE, 0x76, 0x3D, 0x81, 0x64, - 0xB8, 0xC9, 0xFC, 0xDF, 0xF4, 0x7C, 0x56, 0x7D, 0xB5, 0xEC, - 0x1D, 0x4B, 0xD7, 0x9D, 0x51, 0x6B, 0xB1, 0x6D, 0xF7, 0x06, - 0x04, 0xD0, 0x66, 0xBC, 0xBA, 0x6A, 0x94, 0x86, 0x05, 0x20, - 0x17, 0x20, 0x52, 0xA6, 0xA4, 0x05, 0x1D, 0xA7, 0x1A, 0x69, - 0xD5, 0x85, 0x08, 0x19, 0x90, 0xB2, 0xF1, 0x84, 0xAA, 0x49, - 0x82, 0xD5, 0x6F, 0xBE, 0xCB, 0xBD, 0x30, 0xDB, 0x68, 0x8E, - 0xDB, 0x7D, 0xDC, 0x62, 0xDC, 0xE9, 0x44, 0xB9, 0x99, 0xE3, - 0x78, 0x99, 0xE9, 0xDB, 0x10, 0x54, 0x34, 0xF3, 0x07, 0xAE, - 0x2A, 0xA3, 0xC6, 0xE7, 0x9B, 0x18, 0xC7, 0x2A, 0x98, 0x6C, - 0x22, 0xDA, 0x4B, 0xAA, 0x0C, 0xBD, 0x23, 0xEF, 0xBF, 0xA1, - 0x3A, 0x6A, 0xF7, 0xA8, 0x21, 0xEA, 0x06, 0xB6, 0xB2, 0xDB, - 0x26, 0x68, 0xAE, 0x6C, 0x4C, 0xD2, 0x48, 0x0A, 0xAC, 0xA2, - 0x24, 0x91, 0x22, 0x95, 0x1E, 0x17, 0x49, 0x35, 0x06, 0x1D, - 0xB4, 0x38, 0x9E, 0x2E, 0x2D, 0x6B, 0xCC, 0x40, 0xC7, 0x19, - 0x6B, 0xE5, 0x8A, 0x8F, 0xBB, 0xAB, 0x4E, 0x24, 0xBE, 0x84, - 0x4A, 0xDB, 0xAC, 0x6E, 0xFF, 0x00, 0x76, 0xB6, 0x1D, 0x66, - 0xBB, 0x6E, 0xD6, 0x9D, 0x4F, 0x75, 0xB8, 0xCD, 0x63, 0x36, - 0xE6, 0x96, 0x30, 0x09, 0x39, 0x71, 0x2B, 0x3A, 0xB0, 0x1A, - 0x74, 0x87, 0xAF, 0x16, 0xA6, 0x29, 0x78, 0xCD, 0x49, 0xD0, - 0x9E, 0xEE, 0x12, 0x96, 0x5D, 0x8E, 0x56, 0xDB, 0xE8, 0xBE, - 0x1B, 0x46, 0xFE, 0xAC, 0x85, 0x70, 0xE2, 0x31, 0x7D, 0x9A, - 0xC6, 0xC5, 0x38, 0x74, 0x4F, 0xBD, 0x8E, 0xAC, 0xDA, 0xF6, - 0xCD, 0xD2, 0xEF, 0x7B, 0x6B, 0x8B, 0x5D, 0xDA, 0x44, 0x11, - 0x41, 0xCE, 0x92, 0x91, 0xC4, 0xEA, 0xCC, 0x65, 0x92, 0x35, - 0x54, 0x8D, 0x42, 0x85, 0xE0, 0x3C, 0xC3, 0x14, 0x59, 0x27, - 0x20, 0x0B, 0xE9, 0x5B, 0x5F, 0xDD, 0xB8, 0x65, 0x95, 0x49, - 0xD2, 0x85, 0x2C, 0xB2, 0xA6, 0x0E, 0x2C, 0x31, 0x23, 0x50, - 0x25, 0xCE, 0xB5, 0x72, 0x8F, 0xEC, 0xF1, 0xD3, 0x9E, 0x00, - 0xC7, 0xF5, 0xC5, 0xFB, 0x5F, 0x01, 0x43, 0x72, 0xAD, 0x18, - 0x8C, 0x3F, 0xF6, 0x5A, 0x4E, 0x5E, 0x6D, 0x75, 0xF3, 0xE0, - 0xBE, 0x9C, 0x36, 0x95, 0x43, 0x2F, 0xAD, 0xEE, 0x33, 0xBE, - 0xEE, 0x9E, 0x4D, 0x98, 0xBF, 0x6B, 0xFB, 0x96, 0x51, 0xFB, - 0xB4, 0xEA, 0xDF, 0xDE, 0x1F, 0xEC, 0x8F, 0x37, 0xFC, 0x4E, - 0x8E, 0x67, 0x8D, 0xA9, 0xE5, 0x78, 0x5A, 0xD7, 0x9F, 0xE5, - 0xA7, 0x65, 0x3E, 0xFB, 0x2C, 0x03, 0x76, 0x73, 0x65, 0x5B, - 0x0F, 0xDF, 0xED, 0xBD, 0x27, 0xAA, 0x6F, 0x0B, 0x79, 0x75, - 0xE6, 0xF9, 0x79, 0x6A, 0xC5, 0x66, 0x8D, 0x15, 0xD4, 0x57, - 0x8B, 0x6B, 0x34, 0x32, 0xAC, 0xE0, 0x0E, 0x4D, 0xBE, 0x83, - 0xA9, 0x89, 0x19, 0x30, 0x1F, 0x2A, 0xBD, 0x98, 0x70, 0xA9, - 0x9C, 0x34, 0x4B, 0xC5, 0x66, 0xA5, 0x79, 0x19, 0x55, 0xF1, - 0xBE, 0x58, 0xE8, 0x1E, 0xF2, 0x8F, 0xD9, 0x6A, 0xDA, 0x2E, - 0xE3, 0x7B, 0xC6, 0x68, 0x2F, 0x92, 0x8D, 0x0D, 0x94, 0x00, - 0x4D, 0x75, 0xA8, 0xE7, 0xDE, 0x00, 0x85, 0x43, 0xF8, 0x46, - 0xA3, 0xC9, 0x83, 0x55, 0xE1, 0xF1, 0x94, 0x5E, 0xA1, 0x8C, - 0x23, 0xB3, 0x5F, 0x62, 0x85, 0x79, 0xC7, 0x61, 0x32, 0xD0, - 0x86, 0x69, 0x77, 0x76, 0xEB, 0xEA, 0x53, 0xF6, 0xCD, 0xA7, - 0xA8, 0x2E, 0x6F, 0x16, 0x58, 0xA1, 0x93, 0x6B, 0xB2, 0x2C, - 0x09, 0x4B, 0x8B, 0x83, 0xF3, 0xAC, 0x78, 0x19, 0x14, 0x05, - 0x56, 0x6E, 0xDC, 0x86, 0x21, 0x5F, 0x5E, 0xDA, 0x64, 0x11, - 0x03, 0x31, 0x8E, 0xBD, 0x7F, 0x62, 0xAC, 0xA4, 0x2B, 0xCA, - 0x79, 0xF4, 0x73, 0x00, 0xAD, 0x9F, 0xB3, 0xB6, 0xF7, 0x97, - 0xA9, 0x0B, 0xDF, 0x32, 0xB4, 0x80, 0x31, 0x48, 0x53, 0x48, - 0xCB, 0x2A, 0xEA, 0x38, 0xCC, 0xCE, 0xF8, 0xD3, 0x89, 0x22, - 0x2E, 0x06, 0xD2, 0xAC, 0x4D, 0x3A, 0x8C, 0xE4, 0xAA, 0xB6, - 0xE5, 0x38, 0xB1, 0xDF, 0xAE, 0x2C, 0x2D, 0xAC, 0xA7, 0xBC, - 0x8A, 0x06, 0xD0, 0xEB, 0x2C, 0x8C, 0xF5, 0x34, 0xA8, 0x75, - 0x0A, 0xAB, 0xA7, 0xE1, 0x27, 0x16, 0xF6, 0xD1, 0xDE, 0x52, - 0x13, 0x94, 0x80, 0x7D, 0x81, 0x95, 0xB5, 0x0E, 0x17, 0x13, - 0x01, 0x39, 0x4C, 0xE2, 0xAD, 0xBE, 0xED, 0x2E, 0x77, 0x1B, - 0x8D, 0xF3, 0xAA, 0x64, 0xBE, 0xB7, 0x16, 0xCE, 0x3A, 0x5E, - 0xE5, 0x61, 0x88, 0x00, 0x07, 0x2C, 0x38, 0xA1, 0xCB, 0x2E, - 0x35, 0xC6, 0xBF, 0x85, 0xC2, 0x31, 0xB3, 0x86, 0x5F, 0xFB, - 0xFD, 0xC1, 0x63, 0x3E, 0xA4, 0x85, 0x38, 0xD7, 0x22, 0x05, - 0xC6, 0xEF, 0xBF, 0x15, 0x71, 0xFB, 0x36, 0x59, 0xC3, 0xA7, - 0xA8, 0x2F, 0x74, 0x83, 0x39, 0x7B, 0x68, 0x03, 0x76, 0x84, - 0x55, 0x77, 0xA7, 0xC2, 0x5B, 0x13, 0xF8, 0xC4, 0x8F, 0x84, - 0x74, 0xAC, 0xDD, 0x88, 0xD2, 0x56, 0x53, 0xF6, 0x88, 0xEA, - 0x4D, 0xD2, 0xFB, 0xDE, 0x85, 0xF5, 0xA3, 0x5C, 0x48, 0xB6, - 0xDB, 0x40, 0x86, 0x1B, 0x28, 0x95, 0x8A, 0x88, 0xC9, 0x89, - 0x65, 0x77, 0x5A, 0x52, 0x8C, 0xCE, 0xFC, 0x78, 0xF0, 0xC5, - 0xAF, 0x09, 0xA3, 0x18, 0xD0, 0x05, 0xB1, 0x96, 0x95, 0x12, - 0xF6, 0xA1, 0x35, 0x1B, 0x62, 0xD3, 0xF7, 0x7E, 0xA2, 0xBF, - 0xEA, 0x0F, 0xB2, 0xD4, 0xFB, 0x9E, 0xE1, 0x21, 0x9A, 0xF5, - 0xAD, 0x92, 0x19, 0xE6, 0x6F, 0x69, 0xDA, 0x0B, 0xD5, 0x8B, - 0x5B, 0x79, 0x4B, 0x04, 0x04, 0xF9, 0xF1, 0x57, 0x4E, 0x88, - 0xA7, 0x7F, 0x94, 0x68, 0x7F, 0x68, 0x52, 0xE5, 0x33, 0x2B, - 0x77, 0x3C, 0xB1, 0x58, 0x9E, 0xD5, 0xD3, 0x1B, 0x8C, 0x3D, - 0x13, 0x07, 0x52, 0xBD, 0xC2, 0x36, 0xDF, 0x79, 0x7A, 0xF6, - 0x71, 0x5B, 0x02, 0xFA, 0xD6, 0x48, 0x94, 0xB3, 0x31, 0x04, - 0x68, 0xA1, 0xF3, 0x1A, 0xE2, 0x2F, 0xD4, 0xB3, 0x06, 0xA4, - 0x46, 0xC1, 0xED, 0x5E, 0x87, 0xFE, 0x32, 0xA8, 0x06, 0xF6, - 0x1A, 0xE4, 0xD2, 0xEA, 0x18, 0x7B, 0xD7, 0x40, 0x6E, 0xDB, - 0xF5, 0xF6, 0xCB, 0xF6, 0x7F, 0xDB, 0xAE, 0x2C, 0x64, 0x68, - 0x6E, 0x67, 0xB5, 0xB7, 0xB6, 0x49, 0x94, 0xD1, 0x90, 0x4A, - 0x68, 0xE5, 0x48, 0xE0, 0x74, 0x82, 0x2B, 0x8A, 0x33, 0x26, - 0xA4, 0x11, 0xAD, 0xAC, 0xE1, 0x71, 0xC7, 0x27, 0x19, 0x87, - 0x88, 0x94, 0xA4, 0xDB, 0x5B, 0x47, 0x7A, 0xA4, 0x7D, 0x9F, - 0xB7, 0xCB, 0xFB, 0x7E, 0xB8, 0x1B, 0x68, 0x99, 0xCD, 0xA6, - 0xE3, 0x0C, 0xBC, 0xE8, 0x49, 0x25, 0x4C, 0x91, 0xAF, 0x31, - 0x5E, 0x9F, 0x7D, 0xDD, 0x22, 0xBE, 0x7C, 0x0E, 0x81, 0x69, - 0x32, 0xD0, 0xFD, 0x69, 0x69, 0x09, 0x59, 0xEF, 0x1B, 0xC5, - 0x09, 0x06, 0x3C, 0xC7, 0x06, 0x5D, 0x09, 0xF5, 0x7D, 0xAF, - 0xED, 0x2F, 0xD6, 0x3A, 0x07, 0x8A, 0xF0, 0x7E, 0x1F, 0x99, - 0xDB, 0xCB, 0xE6, 0xEB, 0xA7, 0xC7, 0x89, 0xAD, 0x8B, 0xAF, - 0x29, 0xDF, 0x4B, 0x77, 0xBB, 0x7F, 0x0B, 0xBF, 0x5E, 0x85, - 0xC5, 0xBF, 0xB4, 0xBB, 0xCE, 0xED, 0x15, 0xA4, 0x2B, 0x37, - 0x36, 0xDE, 0xD2, 0x31, 0x1A, 0xB4, 0x1A, 0x12, 0x45, 0x5A, - 0x52, 0x8C, 0xE4, 0x16, 0x20, 0xF0, 0xA6, 0x2B, 0xED, 0x28, - 0x8B, 0x69, 0xCA, 0x50, 0x1E, 0x29, 0x1C, 0x56, 0xBE, 0xEB, - 0x25, 0x58, 0xC4, 0xC6, 0x71, 0x11, 0x96, 0x9E, 0x9E, 0x74, - 0xFD, 0xAD, 0x96, 0xDD, 0x67, 0x75, 0x6A, 0x56, 0xD2, 0xE6, - 0xDE, 0x49, 0xDD, 0x45, 0xC5, 0xCA, 0x32, 0xBB, 0x20, 0x63, - 0x99, 0x4A, 0xD0, 0x57, 0x3A, 0xD3, 0x07, 0x11, 0x35, 0xE4, - 0x73, 0xE0, 0x0A, 0x64, 0xEA, 0x5B, 0x5A, 0x8C, 0x06, 0xF2, - 0x5D, 0xCB, 0x43, 0xB4, 0xD9, 0x63, 0xB7, 0xBD, 0x6B, 0x88, - 0xEE, 0x1E, 0xF2, 0xD5, 0x2A, 0x82, 0xE5, 0xDB, 0xBF, 0x43, - 0xC0, 0x90, 0xE3, 0x52, 0x70, 0xE3, 0x4C, 0xB0, 0x48, 0xF0, - 0x58, 0x82, 0x36, 0x6B, 0x1C, 0xB4, 0xAA, 0xF9, 0xF1, 0x8C, - 0xF1, 0x38, 0x31, 0xD4, 0xCB, 0xC6, 0xEB, 0x6F, 0x77, 0xA5, - 0x1E, 0xC1, 0x95, 0x6E, 0x41, 0x64, 0x60, 0x64, 0x0C, 0xBD, - 0xD3, 0xC1, 0x59, 0x78, 0xEA, 0xEC, 0xA7, 0x1E, 0xCC, 0x32, - 0xE3, 0x80, 0xD3, 0x2E, 0x60, 0x3A, 0x93, 0xE8, 0x71, 0x63, - 0xA2, 0x40, 0x36, 0xD4, 0x0E, 0x71, 0xB8, 0xD8, 0xC3, 0xE2, - 0x2F, 0x1B, 0x98, 0xED, 0x5C, 0xED, 0xC1, 0x90, 0x8F, 0x4E, - 0xAD, 0x34, 0xF4, 0xE2, 0x97, 0x34, 0xA1, 0x3C, 0xB0, 0x06, - 0x04, 0x75, 0x7B, 0x1D, 0x5B, 0x52, 0xA6, 0x6A, 0x8C, 0x4E, - 0x08, 0xCF, 0xBB, 0x0D, 0xD2, 0x4D, 0xCB, 0x7C, 0xEA, 0xCB, - 0x89, 0x35, 0xEB, 0x5E, 0x98, 0xBA, 0x8C, 0xF3, 0x1B, 0x59, - 0xEE, 0xB2, 0xF0, 0xF2, 0x0C, 0xF8, 0x63, 0x63, 0xC3, 0x4C, - 0xBD, 0x24, 0x73, 0x4B, 0x31, 0xDF, 0xFB, 0x82, 0xCB, 0xFD, - 0x41, 0x6F, 0x1A, 0x55, 0xB2, 0xC5, 0x9B, 0x76, 0xF8, 0x75, - 0xA3, 0x9F, 0x67, 0x8E, 0xA5, 0xB6, 0xB3, 0xEA, 0x7D, 0xCB, - 0x60, 0xB8, 0x70, 0x8F, 0xBA, 0x42, 0x93, 0xDA, 0x57, 0x2D, - 0x52, 0x5B, 0xEA, 0x0E, 0x83, 0xCE, 0x51, 0xF5, 0x7F, 0x24, - 0xE2, 0xCF, 0x8B, 0x51, 0x26, 0x02, 0x63, 0xEE, 0xFB, 0xD6, - 0x6E, 0xCA, 0x6D, 0x23, 0x1D, 0xA9, 0x9F, 0x7D, 0xBE, 0xE3, - 0x3A, 0xBF, 0x7E, 0xEB, 0x67, 0xDF, 0xBA, 0x6E, 0x08, 0xEE, - 0xE0, 0xDC, 0x96, 0x31, 0x77, 0x1B, 0x4A, 0x91, 0x34, 0x32, - 0xC6, 0x82, 0x32, 0xC7, 0x59, 0x15, 0x46, 0x55, 0x07, 0xBB, - 0x53, 0x5A, 0xE5, 0x8E, 0xF0, 0xDE, 0x27, 0x4E, 0x9D, 0x2C, - 0x93, 0xC3, 0x2A, 0x57, 0x56, 0x92, 0x94, 0x9E, 0x3A, 0xD5, - 0xA7, 0xAE, 0x7A, 0x59, 0x3A, 0x57, 0xEC, 0xE3, 0x7D, 0xB0, - 0x2C, 0xAB, 0x3B, 0xD8, 0xDB, 0x42, 0xB3, 0xCC, 0x9E, 0xCB, - 0x4C, 0xF7, 0x68, 0xF2, 0x91, 0xE6, 0xD6, 0xC6, 0x98, 0x8B, - 0x6D, 0x5F, 0x7B, 0x78, 0x27, 0xB4, 0xFB, 0x91, 0xAA, 0xC3, - 0x25, 0x12, 0x39, 0x69, 0x58, 0x36, 0xD5, 0x7B, 0xD5, 0x0F, - 0xD0, 0x16, 0xF6, 0x93, 0x41, 0x4E, 0x98, 0x86, 0xFD, 0xDE, - 0xD6, 0xE7, 0x40, 0x15, 0xBA, 0x64, 0x3C, 0xC4, 0xD7, 0x5A, - 0x9A, 0x2F, 0x65, 0x30, 0x0F, 0xA9, 0x40, 0xDE, 0x45, 0xB4, - 0xB6, 0x3E, 0xE5, 0xBF, 0xFF, 0x00, 0x19, 0x08, 0x7E, 0x69, - 0x3E, 0x7C, 0x1B, 0xF0, 0xEB, 0xEF, 0x65, 0xD1, 0xD6, 0x9D, - 0x2C, 0x7A, 0xA3, 0xDC, 0x8E, 0xD9, 0xB3, 0xA4, 0x8B, 0x15, - 0xCC, 0xB6, 0x70, 0xBD, 0xA3, 0xB9, 0xA2, 0xF3, 0xA3, 0x3A, - 0xD4, 0x1F, 0x33, 0x52, 0x87, 0x14, 0xC2, 0x19, 0xA9, 0x80, - 0x87, 0x57, 0x88, 0xFA, 0x3E, 0x31, 0x3A, 0xA4, 0x3C, 0x44, - 0xE4, 0xFD, 0x07, 0x04, 0x07, 0xDC, 0xD7, 0xBA, 0x6E, 0xA3, - 0xD8, 0x7A, 0x8A, 0x5D, 0xEF, 0x7E, 0x89, 0x2D, 0x7C, 0x3C, - 0x6F, 0x0D, 0xA4, 0x01, 0xD2, 0x46, 0x76, 0x93, 0x26, 0x7A, - 0xA1, 0x60, 0x14, 0x2D, 0x47, 0x97, 0x3C, 0x36, 0x8D, 0x22, - 0x0B, 0x95, 0x63, 0xF5, 0x4F, 0xD4, 0x96, 0xF7, 0x34, 0x05, - 0x1A, 0x07, 0x36, 0x62, 0x09, 0x2C, 0x46, 0x8D, 0x58, 0xF3, - 0xAB, 0x7F, 0xED, 0xFE, 0xDF, 0xFB, 0xD9, 0xFD, 0x97, 0xE6, - 0xAD, 0x3C, 0x06, 0x9D, 0x75, 0x14, 0xF1, 0x7A, 0xF9, 0x9C, - 0xAF, 0x4F, 0x2B, 0xF8, 0x72, 0xC1, 0x77, 0x83, 0x3E, 0x55, - 0x9D, 0xFD, 0x96, 0xA7, 0xA0, 0xF5, 0x2D, 0xF7, 0xBF, 0xDB, - 0xA1, 0xFF, 0x00, 0xA9, 0x71, 0xCA, 0xC7, 0x02, 0x02, 0xF6, - 0xCE, 0x20, 0x99, 0x90, 0x07, 0x75, 0x54, 0x35, 0x1E, 0x70, - 0xC0, 0x8C, 0x45, 0x8C, 0xE4, 0x15, 0xCD, 0xCD, 0xAD, 0xAD, - 0x53, 0x87, 0x80, 0xB0, 0xC4, 0x7B, 0xC2, 0x6D, 0x77, 0xBD, - 0xF7, 0x6D, 0xBA, 0x8A, 0x4E, 0x74, 0x73, 0x2C, 0x74, 0xD2, - 0x04, 0x71, 0x1E, 0xEF, 0x91, 0x90, 0xAE, 0x0A, 0x25, 0x99, - 0x53, 0x5C, 0x5B, 0x4A, 0xDE, 0x4C, 0xE2, 0x43, 0x9B, 0xE0, - 0xB5, 0x6E, 0x9E, 0xF7, 0x89, 0xB7, 0x6E, 0xD6, 0xCD, 0x1C, - 0x96, 0x76, 0xAC, 0xDD, 0xD6, 0x7B, 0x78, 0xC0, 0x8D, 0x9D, - 0x97, 0xB3, 0x53, 0x0A, 0x8C, 0x23, 0xC4, 0x4D, 0x37, 0xCE, - 0x27, 0x8E, 0xB1, 0x8F, 0xB5, 0x0E, 0x16, 0xF1, 0x98, 0x19, - 0x48, 0x7E, 0x74, 0x53, 0xF6, 0xC6, 0x75, 0x65, 0x2B, 0xB0, - 0x41, 0x16, 0x92, 0xA4, 0x32, 0x80, 0x48, 0xA6, 0x60, 0x2B, - 0x70, 0xFE, 0x1C, 0xB1, 0x0E, 0x77, 0x62, 0x63, 0xC3, 0x3A, - 0x83, 0x9D, 0xCF, 0xC5, 0x4B, 0x87, 0x0F, 0xC1, 0xC8, 0x1D, - 0xC8, 0x4D, 0xD6, 0xF3, 0x11, 0xE5, 0xB2, 0xDB, 0xCB, 0x08, - 0x53, 0xA6, 0x94, 0x00, 0x02, 0x4D, 0x4D, 0x42, 0x55, 0x4D, - 0x70, 0x39, 0x6E, 0xE7, 0x27, 0x24, 0x9E, 0x93, 0x8A, 0xB7, - 0xB7, 0xFC, 0xB8, 0x00, 0x7D, 0x88, 0xC7, 0xBB, 0xCB, 0x98, - 0x6E, 0xBA, 0x8B, 0xAA, 0xE7, 0x84, 0x28, 0x57, 0xE9, 0x8B, - 0xAA, 0x84, 0x5D, 0x20, 0x10, 0xE0, 0x1A, 0xE4, 0x33, 0xC6, - 0xAE, 0xC4, 0x01, 0x6B, 0x06, 0xFF, 0x00, 0xBB, 0xDC, 0x16, - 0x4B, 0x8E, 0xCC, 0x4A, 0xB1, 0x6F, 0x93, 0xE2, 0xB2, 0x5D, - 0xE6, 0xF2, 0xEE, 0xC7, 0x72, 0xB4, 0xBC, 0xB3, 0x99, 0xED, - 0xEE, 0xED, 0xD8, 0x49, 0x04, 0xF1, 0x92, 0xAE, 0x8E, 0xB9, - 0x86, 0x52, 0x38, 0x11, 0x8D, 0x5D, 0x38, 0x89, 0x44, 0x83, - 0x88, 0x2B, 0x1D, 0x29, 0x10, 0x5C, 0x2B, 0xAB, 0xFD, 0xA5, - 0xFD, 0xE8, 0xB6, 0xD9, 0xE0, 0xB9, 0xD6, 0x8B, 0x36, 0x9D, - 0x27, 0x70, 0x5B, 0x7F, 0x9F, 0xF2, 0x6A, 0xA6, 0xAE, 0x56, - 0xAF, 0xE4, 0x62, 0x10, 0xE0, 0xD4, 0x33, 0x3E, 0x3D, 0x0F, - 0x82, 0x91, 0xEB, 0xEA, 0x33, 0x2D, 0x01, 0xEE, 0x6E, 0x6E, - 0xBE, 0xC9, 0xF7, 0x37, 0x37, 0x32, 0xBC, 0xF7, 0x33, 0xC6, - 0xF2, 0x4D, 0x34, 0x84, 0xB3, 0xBB, 0xB6, 0xE7, 0x56, 0x66, - 0x63, 0x99, 0x24, 0xE2, 0xBF, 0x28, 0x17, 0xE0, 0x0D, 0x1F, - 0xF1, 0x52, 0x5D, 0xED, 0xDF, 0x96, 0x95, 0x93, 0x6D, 0x3D, - 0x45, 0x7F, 0x27, 0xBB, 0xA8, 0x7A, 0x79, 0xAC, 0x19, 0x6C, - 0x6D, 0xF7, 0x27, 0xBC, 0x4D, 0xCB, 0xBD, 0xA5, 0xE4, 0x78, - 0xCA, 0x98, 0xBD, 0x9D, 0x35, 0x51, 0x9F, 0xB5, 0x5C, 0x42, - 0xFA, 0x96, 0x2D, 0x52, 0x27, 0x68, 0xF6, 0x2F, 0x43, 0xFF, - 0x00, 0x19, 0x52, 0x04, 0xD5, 0x9B, 0xE3, 0x10, 0x03, 0x74, - 0xE2, 0xFD, 0x4D, 0xDE, 0xB7, 0x0E, 0xA1, 0xBD, 0xBB, 0xB1, - 0xF7, 0x05, 0xB2, 0x5E, 0x59, 0xCA, 0xD0, 0x5D, 0x5B, 0xAD, - 0x94, 0x90, 0xCC, 0x86, 0x8C, 0xAC, 0x1F, 0x22, 0x0E, 0x28, - 0xA4, 0x7F, 0x28, 0x75, 0x29, 0xB6, 0x54, 0xA3, 0x53, 0x8D, - 0xD5, 0x84, 0xC6, 0x68, 0xCB, 0x38, 0x23, 0xA9, 0x52, 0x25, - 0xF7, 0xFF, 0x00, 0xEF, 0x0A, 0x4D, 0xBC, 0xDA, 0x73, 0x6D, - 0x92, 0x52, 0xBA, 0x4D, 0xEA, 0x43, 0x49, 0xBD, 0x3E, 0xD7, - 0x2C, 0x1F, 0xE4, 0x61, 0x9B, 0xF9, 0x32, 0xD0, 0xC7, 0xE8, - 0xBB, 0x11, 0x3C, 0xCD, 0x26, 0xF9, 0x73, 0x61, 0xF1, 0xEF, - 0x59, 0xD7, 0x8D, 0xBC, 0xFA, 0xCB, 0xC6, 0xF3, 0xE4, 0xF1, - 0x9A, 0xB9, 0xDE, 0x23, 0x51, 0xE6, 0x73, 0x35, 0x6A, 0xD7, - 0xAB, 0x8E, 0xAA, 0xE7, 0x5C, 0x09, 0x69, 0x77, 0x50, 0xF2, - 0x30, 0xC9, 0x95, 0x9B, 0x53, 0x6C, 0x65, 0x52, 0x7E, 0x0F, - 0xF8, 0x3F, 0xC7, 0x89, 0x0B, 0xC6, 0xA7, 0xA4, 0xA8, 0x52, - 0x7B, 0x43, 0x0F, 0x0A, 0x1C, 0xB4, 0xA9, 0xDD, 0x37, 0xFE, - 0xED, 0x1E, 0x05, 0x71, 0xE4, 0x29, 0x53, 0xF3, 0xAD, 0x7A, - 0xCB, 0xF2, 0x11, 0x7F, 0xC7, 0x60, 0xC5, 0x54, 0x3F, 0x4C, - 0x7E, 0x35, 0x77, 0x0F, 0x28, 0x42, 0x9F, 0xF2, 0xC3, 0xFB, - 0x71, 0xFC, 0xC6, 0xC1, 0x69, 0xF9, 0x51, 0x2A, 0x68, 0x08, - 0x8F, 0xBA, 0xBF, 0xF7, 0x8E, 0xAB, 0xFF, 0x00, 0xC7, 0xAE, - 0xBF, 0x9C, 0xB8, 0xD5, 0xF0, 0xFF, 0x00, 0xED, 0x63, 0xFF, - 0x00, 0x9B, 0xDC, 0xB2, 0x9C, 0x53, 0xF5, 0x0F, 0xE1, 0x59, - 0x9F, 0x50, 0xFE, 0x56, 0x3F, 0x46, 0x35, 0x74, 0x56, 0x5E, - 0x68, 0x3E, 0x0C, 0x86, 0xBA, 0x1E, 0x1F, 0xFD, 0x53, 0x7F, - 0xEC, 0x9B, 0xFF, 0x00, 0xB1, 0xC6, 0x78, 0xFF, 0x00, 0x7F, - 0xCB, 0xE5, 0x56, 0x83, 0xFB, 0x7E, 0x5B, 0x55, 0x4A, 0xCB, - 0xFF, 0x00, 0xC0, 0xB6, 0xDF, 0xFC, 0x82, 0xE3, 0xFE, 0xDC, - 0xE2, 0xBF, 0xEA, 0x0F, 0xD5, 0xEA, 0x0B, 0x6F, 0xFE, 0x3B, - 0xFD, 0x79, 0xFE, 0x03, 0xED, 0x8A, 0xD1, 0x3A, 0xAF, 0xFF, - 0x00, 0x5F, 0x36, 0xAF, 0xEC, 0xEC, 0xFF, 0x00, 0x9E, 0x71, - 0x4F, 0x2F, 0xD2, 0x1D, 0x4A, 0xD7, 0x86, 0xFF, 0x00, 0xEF, - 0x2A, 0x74, 0xCF, 0xD8, 0xB0, 0xBC, 0x47, 0x5E, 0x8C, 0xBC, - 0x7F, 0x5D, 0xFC, 0x9F, 0xE3, 0xC2, 0x43, 0xFB, 0xFD, 0x4B, - 0xFF, 0xD9 -}; - -struct fsdata_file const file_img_AN_QP_and_lwIP_jpg[] = { - { - file_cgi_demo_htm, - data_img_AN_QP_and_lwIP_jpg, - data_img_AN_QP_and_lwIP_jpg + 24, - sizeof(data_img_AN_QP_and_lwIP_jpg) - 24 - } -}; - -/* /img/arrow.gif */ -static unsigned char const data_img_arrow_gif[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x61, 0x72, 0x72, 0x6F, 0x77, - 0x2E, 0x67, 0x69, 0x66, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x07, 0x00, 0x09, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x33, 0xCC, 0xFF, 0xFF, 0xFF, 0x21, - 0xF9, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x09, 0x00, 0x00, 0x02, 0x0C, 0x8C, - 0x8F, 0x80, 0xA1, 0x6A, 0xCE, 0xA2, 0x84, 0xEB, 0xD5, 0x0B, - 0x0B, 0x00, 0x3B -}; - -struct fsdata_file const file_img_arrow_gif[] = { - { - file_img_AN_QP_and_lwIP_jpg, - data_img_arrow_gif, - data_img_arrow_gif + 15, - sizeof(data_img_arrow_gif) - 15 - } -}; - -/* /img/favicon.ico */ -static unsigned char const data_img_favicon_ico[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x66, 0x61, 0x76, 0x69, 0x63, - 0x6F, 0x6E, 0x2E, 0x69, 0x63, 0x6F, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, - 0x6E, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x75, 0x53, 0x00, - 0xEC, 0xD9, 0xD0, 0x00, 0xC7, 0x8F, 0x73, 0x00, 0x1C, 0x00, - 0x8E, 0x00, 0xC9, 0x94, 0x79, 0x00, 0x78, 0x28, 0x00, 0x00, - 0xCC, 0x99, 0x7F, 0x00, 0x37, 0x17, 0xB7, 0x00, 0x95, 0x8B, - 0xB9, 0x00, 0x30, 0x00, 0xF0, 0x00, 0xB5, 0x6A, 0x45, 0x00, - 0x17, 0x00, 0x74, 0x00, 0xC4, 0x89, 0x6B, 0x00, 0x79, 0x57, - 0xFF, 0x00, 0x89, 0x2E, 0x00, 0x00, 0xBA, 0x74, 0x51, 0x00, - 0x70, 0x5E, 0xBB, 0x00, 0x7E, 0x5F, 0xFC, 0x00, 0x92, 0x31, - 0x00, 0x00, 0xE1, 0xC3, 0xB4, 0x00, 0x41, 0x11, 0xFF, 0x00, - 0x9A, 0x35, 0x03, 0x00, 0x14, 0x00, 0x63, 0x00, 0xD9, 0xB3, - 0xA0, 0x00, 0x8C, 0x6F, 0xFF, 0x00, 0x24, 0x00, 0xB3, 0x00, - 0xEB, 0xD7, 0xCC, 0x00, 0x48, 0x18, 0x00, 0x00, 0xDB, 0xD3, - 0xFF, 0x00, 0xBC, 0x79, 0x58, 0x00, 0x2B, 0x00, 0xD7, 0x00, - 0x54, 0x29, 0xFF, 0x00, 0xA4, 0x49, 0x1B, 0x00, 0x51, 0x1B, - 0x00, 0x00, 0x2D, 0x00, 0xE0, 0x00, 0x20, 0x00, 0xA2, 0x00, - 0xD8, 0xB2, 0x9E, 0x00, 0x59, 0x1E, 0x00, 0x00, 0xB4, 0x69, - 0x44, 0x00, 0xC1, 0x83, 0x64, 0x00, 0x16, 0x00, 0x6D, 0x00, - 0x30, 0x00, 0xF2, 0x00, 0x24, 0x00, 0xB4, 0x00, 0xC3, 0x88, - 0x6A, 0x00, 0xE9, 0xD2, 0xC7, 0x00, 0x62, 0x3B, 0xFF, 0x00, - 0x7A, 0x38, 0x17, 0x00, 0xB9, 0x73, 0x50, 0x00, 0x6B, 0x24, - 0x00, 0x00, 0xAF, 0x5E, 0x36, 0x00, 0x69, 0x44, 0xFF, 0x00, - 0xA4, 0x49, 0x1C, 0x00, 0x6C, 0x47, 0xFF, 0x00, 0xAF, 0x64, - 0x3F, 0x00, 0x1F, 0x00, 0x9A, 0x00, 0xA7, 0x4E, 0x22, 0x00, - 0x14, 0x00, 0x65, 0x00, 0x73, 0x50, 0xFF, 0x00, 0x7F, 0x2A, - 0x00, 0x00, 0x75, 0x53, 0xFF, 0x00, 0x32, 0x00, 0xFC, 0x00, - 0xC4, 0x88, 0x6B, 0x00, 0x9F, 0x3E, 0x0E, 0x00, 0xAB, 0x58, - 0x2E, 0x00, 0x88, 0x2D, 0x00, 0x00, 0x64, 0x3F, 0xFA, 0x00, - 0xAE, 0x5D, 0x34, 0x00, 0x7F, 0x5F, 0xFF, 0x00, 0x1D, 0x00, - 0x92, 0x00, 0xC9, 0x92, 0x77, 0x00, 0xB6, 0xAF, 0xD6, 0x00, - 0x96, 0x71, 0x5E, 0x00, 0xB6, 0xAA, 0xE2, 0x00, 0x99, 0x33, - 0x00, 0x00, 0x13, 0x00, 0x5D, 0x00, 0xCD, 0xC0, 0xFF, 0x00, - 0x21, 0x00, 0xA4, 0x00, 0x14, 0x00, 0x66, 0x00, 0x88, 0x6B, - 0xFF, 0x00, 0x23, 0x00, 0xAD, 0x00, 0x38, 0x17, 0xBB, 0x00, - 0x33, 0x00, 0xFD, 0x00, 0xF5, 0xEB, 0xE6, 0x00, 0x63, 0x3E, - 0xF8, 0x00, 0x44, 0x17, 0x00, 0x00, 0x1A, 0x00, 0x81, 0x00, - 0x1C, 0x00, 0x8A, 0x00, 0xBB, 0x77, 0x55, 0x00, 0xDD, 0xD5, - 0xFF, 0x00, 0xBD, 0x7C, 0x5B, 0x00, 0xFB, 0xFB, 0xFB, 0x00, - 0x56, 0x1D, 0x00, 0x00, 0x21, 0x00, 0xA5, 0x00, 0xE5, 0xCB, - 0xBE, 0x00, 0xA9, 0x52, 0x27, 0x00, 0xD4, 0xCE, 0xEB, 0x00, - 0x5F, 0x20, 0x00, 0x00, 0xE7, 0xD0, 0xC4, 0x00, 0x9F, 0x5B, - 0x39, 0x00, 0x61, 0x20, 0x00, 0x00, 0x53, 0x3A, 0xB8, 0x00, - 0x9E, 0x3D, 0x0D, 0x00, 0xB4, 0xB2, 0xBD, 0x00, 0x28, 0x00, - 0xC9, 0x00, 0x66, 0x40, 0xFF, 0x00, 0xBB, 0x76, 0x53, 0x00, - 0xC8, 0x91, 0x76, 0x00, 0x71, 0x26, 0x00, 0x00, 0xF6, 0xF3, - 0xFF, 0x00, 0x73, 0x26, 0x00, 0x00, 0x1F, 0x00, 0x9D, 0x00, - 0xCB, 0x96, 0x7C, 0x00, 0x13, 0x00, 0x5F, 0x00, 0x2E, 0x00, - 0xE4, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x90, 0x7D, 0xDD, 0x00, - 0xA7, 0x95, 0xEE, 0x00, 0xC3, 0x86, 0x68, 0x00, 0x77, 0x55, - 0xFF, 0x00, 0x79, 0x58, 0xFF, 0x00, 0x7A, 0x58, 0xFF, 0x00, - 0x35, 0x03, 0xFF, 0x00, 0xC5, 0x8B, 0x6E, 0x00, 0x1A, 0x00, - 0x83, 0x00, 0x8E, 0x2F, 0x00, 0x00, 0xE3, 0xE3, 0xE3, 0x00, - 0xB0, 0x61, 0x3A, 0x00, 0x95, 0x32, 0x00, 0x00, 0xE2, 0xC5, - 0xB7, 0x00, 0x96, 0x32, 0x00, 0x00, 0x5A, 0x38, 0xE0, 0x00, - 0x97, 0x32, 0x00, 0x00, 0x5B, 0x39, 0xE3, 0x00, 0x85, 0x67, - 0xFF, 0x00, 0xFA, 0xFA, 0xFA, 0x00, 0xB3, 0x66, 0x40, 0x00, - 0x21, 0x00, 0xA7, 0x00, 0x88, 0x6A, 0xFF, 0x00, 0xCC, 0x9A, - 0x80, 0x00, 0xD5, 0xD5, 0xD5, 0x00, 0xAA, 0xA3, 0xC8, 0x00, - 0xE7, 0xCF, 0xC3, 0x00, 0x31, 0x00, 0xF7, 0x00, 0x8D, 0x70, - 0xFF, 0x00, 0x8F, 0x73, 0xFF, 0x00, 0x41, 0x16, 0x00, 0x00, - 0x42, 0x16, 0x00, 0x00, 0xE9, 0xD4, 0xC9, 0x00, 0xAD, 0x5B, - 0x32, 0x00, 0x1C, 0x00, 0x8D, 0x00, 0xF5, 0xF5, 0xF5, 0x00, - 0x3E, 0x0F, 0xF7, 0x00, 0x55, 0x1C, 0x00, 0x00, 0x8D, 0x7B, - 0xD9, 0x00, 0x9B, 0x36, 0x04, 0x00, 0x22, 0x00, 0xA8, 0x00, - 0xE6, 0xE0, 0xFF, 0x00, 0x15, 0x00, 0x6A, 0x00, 0x30, 0x00, - 0xEF, 0x00, 0x5C, 0x33, 0xFF, 0x00, 0x17, 0x00, 0x73, 0x00, - 0x7D, 0x69, 0xD1, 0x00, 0x9F, 0x40, 0x10, 0x00, 0xC5, 0x8A, - 0x6D, 0x00, 0x27, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x22, 0x1C, 0x55, 0x93, 0x92, - 0x29, 0x29, 0x9E, 0x39, 0x71, 0x4B, 0x00, 0x00, 0x00, 0x06, - 0x31, 0x64, 0x26, 0x5C, 0x5C, 0x99, 0x04, 0x96, 0x57, 0x56, - 0xA1, 0x4E, 0x17, 0x00, 0x13, 0x0F, 0x3B, 0x06, 0x6E, 0x6C, - 0x48, 0x2F, 0x51, 0x11, 0x08, 0x50, 0x37, 0x7C, 0x0C, 0x0C, - 0x3F, 0x16, 0x80, 0x7D, 0x0F, 0x41, 0x7E, 0x63, 0x85, 0x7E, - 0x83, 0x1F, 0xA5, 0x89, 0x04, 0x7C, 0x38, 0x21, 0xA3, 0x9B, - 0x84, 0x82, 0x87, 0x36, 0x42, 0x87, 0x54, 0x2A, 0x23, 0xA5, - 0x5D, 0x45, 0x40, 0x5F, 0x6A, 0x8E, 0x73, 0x18, 0x73, 0x88, - 0x69, 0x73, 0x4C, 0x5B, 0x60, 0xA2, 0x1A, 0x6F, 0x43, 0x7B, - 0x73, 0x14, 0x10, 0x02, 0x73, 0x88, 0x69, 0x73, 0x9D, 0x12, - 0x75, 0x8C, 0x65, 0x24, 0x32, 0x5E, 0x73, 0x3F, 0x16, 0x30, - 0x73, 0x88, 0x69, 0x73, 0x90, 0x3D, 0x9F, 0x47, 0x09, 0x4D, - 0x7F, 0x1B, 0x94, 0xA3, 0x9B, 0x4A, 0x73, 0x88, 0x69, 0x73, - 0x69, 0x52, 0x0A, 0x9A, 0x67, 0x9C, 0x0B, 0x8E, 0x53, 0x34, - 0x66, 0x0B, 0x73, 0x27, 0x33, 0x73, 0x91, 0x7A, 0x8F, 0x49, - 0x8D, 0x2B, 0x58, 0x25, 0x73, 0x8B, 0x95, 0x2D, 0x73, 0x01, - 0x3C, 0x73, 0x59, 0xA0, 0x35, 0x97, 0x74, 0x68, 0x28, 0x76, - 0x62, 0x73, 0x73, 0x81, 0x73, 0x3E, 0x4F, 0x73, 0x6D, 0x73, - 0x73, 0x1D, 0x98, 0x72, 0x00, 0x6B, 0x6B, 0x07, 0x46, 0x5A, - 0x1E, 0x1E, 0x78, 0x0E, 0x77, 0x19, 0x79, 0x20, 0x15, 0x00, - 0x00, 0x00, 0x70, 0x05, 0x03, 0xA4, 0x0D, 0x2C, 0x8A, 0x8A, - 0x86, 0x44, 0x3A, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xC0, 0x03, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00 -}; - -struct fsdata_file const file_img_favicon_ico[] = { - { - file_img_arrow_gif, - data_img_favicon_ico, - data_img_favicon_ico + 17, - sizeof(data_img_favicon_ico) - 17 - } -}; - -/* /img/footer.jpg */ -static unsigned char const data_img_footer_jpg[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x66, 0x6F, 0x6F, 0x74, 0x65, - 0x72, 0x2E, 0x6A, 0x70, 0x67, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, - 0x67, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, - 0x00, 0x01, 0x02, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, - 0xFF, 0xEC, 0x00, 0x11, 0x44, 0x75, 0x63, 0x6B, 0x79, 0x00, - 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xFF, - 0xEE, 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x00, 0x64, - 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xDB, 0x00, 0x84, 0x00, - 0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x06, - 0x09, 0x06, 0x05, 0x06, 0x09, 0x0B, 0x08, 0x06, 0x06, 0x08, - 0x0B, 0x0C, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0C, 0x10, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0x0C, 0x0E, 0x0F, 0x10, - 0x0F, 0x0E, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x13, 0x13, 0x1C, - 0x1B, 0x1B, 0x1B, 0x1C, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x01, 0x07, 0x07, 0x07, 0x0D, 0x0C, - 0x0D, 0x18, 0x10, 0x10, 0x18, 0x1A, 0x15, 0x11, 0x15, 0x1A, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, - 0xC0, 0x00, 0x11, 0x08, 0x00, 0x53, 0x00, 0x01, 0x03, 0x01, - 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, - 0x00, 0x63, 0x00, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x02, 0x03, 0x04, 0x05, 0x07, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x02, 0x04, 0x05, 0x10, - 0x00, 0x02, 0x01, 0x03, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x51, 0x52, - 0x14, 0x15, 0x11, 0x12, 0x62, 0xA2, 0x23, 0x16, 0x11, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x12, 0x13, 0xFF, - 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, - 0x00, 0x3F, 0x00, 0x6B, 0xFA, 0x07, 0x5B, 0x3D, 0xDE, 0x6F, - 0x3F, 0x4E, 0x77, 0x9B, 0x75, 0x1D, 0xDC, 0x0A, 0x92, 0x72, - 0x8E, 0x46, 0x88, 0xB1, 0x7A, 0xE4, 0xDA, 0xE5, 0x1A, 0x7B, - 0x87, 0x21, 0xD2, 0x46, 0x1E, 0xF0, 0x74, 0x58, 0xA7, 0x50, - 0xB4, 0x48, 0x80, 0x6D, 0x04, 0x81, 0x25, 0xBE, 0x7C, 0x3B, - 0x98, 0x9F, 0xFF, 0xD9 -}; - -struct fsdata_file const file_img_footer_jpg[] = { - { - file_img_favicon_ico, - data_img_footer_jpg, - data_img_footer_jpg + 16, - sizeof(data_img_footer_jpg) - 16 - } -}; - -/* /img/logo_lwip_qp.jpg */ -static unsigned char const data_img_logo_lwip_qp_jpg[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, - 0x6C, 0x77, 0x69, 0x70, 0x5F, 0x71, 0x70, 0x2E, 0x6A, 0x70, - 0x67, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, - 0x67, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, - 0x00, 0x01, 0x02, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, - 0xFF, 0xEC, 0x00, 0x11, 0x44, 0x75, 0x63, 0x6B, 0x79, 0x00, - 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xFF, - 0xEE, 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x00, 0x64, - 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xDB, 0x00, 0x84, 0x00, - 0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x06, - 0x09, 0x06, 0x05, 0x06, 0x09, 0x0B, 0x08, 0x06, 0x06, 0x08, - 0x0B, 0x0C, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0C, 0x10, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0x0C, 0x0E, 0x0F, 0x10, - 0x0F, 0x0E, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x13, 0x13, 0x1C, - 0x1B, 0x1B, 0x1B, 0x1C, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x01, 0x07, 0x07, 0x07, 0x0D, 0x0C, - 0x0D, 0x18, 0x10, 0x10, 0x18, 0x1A, 0x15, 0x11, 0x15, 0x1A, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, - 0xC0, 0x00, 0x11, 0x08, 0x00, 0x49, 0x00, 0x64, 0x03, 0x01, - 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, - 0x00, 0xB1, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x03, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x06, 0x07, 0x04, 0x03, 0x00, 0x01, 0x02, 0x08, 0x01, 0x00, - 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x03, 0x06, 0x01, - 0x02, 0x07, 0x00, 0x08, 0x10, 0x00, 0x01, 0x03, 0x02, 0x04, - 0x02, 0x05, 0x07, 0x06, 0x0D, 0x05, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x11, 0x05, 0x00, 0x21, 0x12, - 0x06, 0x13, 0x07, 0x31, 0x41, 0x51, 0x22, 0x14, 0x61, 0x71, - 0x81, 0x32, 0x23, 0x15, 0x08, 0x42, 0x52, 0x62, 0x72, 0x16, - 0x17, 0x91, 0xA1, 0xB1, 0xD1, 0x82, 0x92, 0xA2, 0x33, 0x43, - 0x53, 0x73, 0x35, 0x36, 0xF0, 0xB2, 0x63, 0x34, 0x74, 0x37, - 0x11, 0x00, 0x01, 0x03, 0x02, 0x04, 0x02, 0x08, 0x04, 0x03, - 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, - 0x03, 0x11, 0x04, 0x21, 0x31, 0x12, 0x05, 0x51, 0x22, 0x41, - 0x61, 0x71, 0x81, 0x32, 0x13, 0x14, 0x06, 0xF0, 0x91, 0xA1, - 0x42, 0xB1, 0x23, 0x33, 0xC1, 0xD1, 0x52, 0x72, 0x34, 0x15, - 0xF1, 0x92, 0xA2, 0xB2, 0xC2, 0x16, 0x07, 0xFF, 0xDA, 0x00, - 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, - 0x00, 0x9C, 0x62, 0xDE, 0x90, 0x2F, 0x31, 0xE5, 0xE4, 0x52, - 0xD5, 0xB6, 0x6F, 0x57, 0x4F, 0xFA, 0x91, 0x94, 0xB4, 0xFC, - 0xF2, 0x28, 0x31, 0xA3, 0xA4, 0x03, 0x35, 0xBB, 0x63, 0x73, - 0xB2, 0x46, 0x4F, 0x2C, 0x77, 0x30, 0x15, 0x2D, 0x0F, 0xC3, - 0x8D, 0x3D, 0x43, 0x54, 0xBE, 0x95, 0xCB, 0x65, 0xB3, 0x69, - 0x6C, 0xF8, 0xAD, 0x36, 0xC6, 0xE8, 0x7A, 0xE8, 0xCD, 0xCD, - 0xE7, 0xB8, 0x68, 0x44, 0x26, 0xD2, 0x59, 0x09, 0x52, 0x82, - 0x51, 0x55, 0x14, 0x2C, 0xD4, 0xD7, 0x3C, 0x56, 0x77, 0x9D, - 0xD3, 0x71, 0x85, 0xE7, 0xD3, 0x45, 0x1B, 0xE2, 0x0D, 0xAE, - 0xA7, 0x3B, 0x1E, 0xBC, 0x11, 0x70, 0x59, 0xB0, 0x8E, 0x72, - 0x6A, 0x88, 0x6E, 0x0D, 0x95, 0xCA, 0xBB, 0x5D, 0xDE, 0x4D, - 0x9D, 0xCB, 0xF5, 0xCE, 0x35, 0xC2, 0x28, 0x49, 0x71, 0x25, - 0x81, 0x21, 0x15, 0x5A, 0x42, 0xD2, 0x01, 0x43, 0x49, 0xA9, - 0xA1, 0xED, 0xC2, 0x1D, 0xBF, 0xDD, 0x7B, 0xAD, 0xC4, 0x62, - 0x56, 0xDB, 0x31, 0xEC, 0x77, 0x07, 0x53, 0x2E, 0xD2, 0xA7, - 0x7E, 0xDD, 0x10, 0x34, 0xD4, 0x42, 0xC1, 0xB7, 0x6C, 0x36, - 0x3B, 0x76, 0xD1, 0xBA, 0x6E, 0x0B, 0xF5, 0x9D, 0xCB, 0xCB, - 0xCC, 0x4A, 0x66, 0x34, 0x28, 0x41, 0xE5, 0xC6, 0xAA, 0x5D, - 0x03, 0xBC, 0x74, 0x1E, 0x9E, 0xF6, 0x7D, 0x38, 0x63, 0xBD, - 0xEE, 0xD7, 0x86, 0xEA, 0x1B, 0x6B, 0x77, 0x36, 0x23, 0x23, - 0x0B, 0x9C, 0x48, 0xD5, 0x97, 0x42, 0xD2, 0xDE, 0xD1, 0x81, - 0xA5, 0xCF, 0x15, 0xA2, 0xEE, 0xBD, 0xA9, 0xB6, 0xF7, 0x35, - 0xAE, 0x6C, 0x9B, 0x0D, 0xBE, 0x4E, 0xDD, 0xBD, 0xDB, 0xD9, - 0x32, 0x9C, 0xB5, 0x48, 0x70, 0xBF, 0x1D, 0xF6, 0x13, 0xEB, - 0x16, 0xDC, 0x51, 0x2A, 0x0A, 0x1F, 0xE8, 0x75, 0xE0, 0x66, - 0xEF, 0x97, 0xFB, 0x7C, 0xCC, 0x6D, 0xE1, 0x6C, 0xB0, 0x48, - 0xED, 0x21, 0xED, 0x14, 0x2D, 0x27, 0x88, 0xF8, 0xED, 0x5B, - 0x3E, 0xCA, 0x39, 0x1A, 0x4B, 0x39, 0x5C, 0x3A, 0x10, 0x18, - 0xFB, 0x0A, 0xFC, 0xFB, 0x29, 0x75, 0xB6, 0xC1, 0x42, 0xC5, - 0x41, 0xC5, 0xF4, 0x4C, 0xD4, 0xBB, 0xD3, 0x39, 0x74, 0xFB, - 0xBB, 0xDC, 0x5F, 0xCA, 0x18, 0xCF, 0x9C, 0xD5, 0xEF, 0x4C, - 0xE5, 0xE7, 0xDD, 0xE6, 0xE2, 0xFE, 0x50, 0xC7, 0xBC, 0xE6, - 0xAF, 0x7A, 0x67, 0x2F, 0x85, 0xEC, 0x1D, 0xC0, 0x9E, 0x96, - 0xBF, 0x2E, 0x3D, 0xE6, 0x85, 0xEF, 0x4C, 0xE5, 0x9B, 0xEC, - 0x8D, 0xE3, 0x8B, 0xC3, 0xE1, 0xF7, 0xBB, 0x33, 0xC6, 0xFA, - 0x82, 0xC7, 0xA6, 0x72, 0xD2, 0x9B, 0x4C, 0x06, 0xB9, 0x67, - 0x7A, 0xBB, 0xBD, 0x1C, 0x2A, 0xE5, 0x1E, 0xE5, 0x1A, 0x34, - 0x79, 0x04, 0xAA, 0xA9, 0x6D, 0x61, 0x25, 0x41, 0x20, 0x1D, - 0x39, 0xEA, 0x3D, 0x58, 0xAA, 0x5E, 0x6E, 0xB2, 0x8D, 0xD2, - 0x08, 0x58, 0xEF, 0xCA, 0x7C, 0x6E, 0x71, 0x1C, 0x73, 0xA2, - 0x26, 0x3B, 0x71, 0xE4, 0xB8, 0x91, 0xCC, 0x0A, 0xD3, 0xCB, - 0x2B, 0x35, 0xB2, 0xE3, 0xB8, 0xE2, 0x1B, 0xC3, 0x02, 0x45, - 0xB9, 0xC5, 0x16, 0x4B, 0x64, 0xA9, 0x23, 0x8A, 0xE2, 0x48, - 0x6C, 0x9D, 0x24, 0x1C, 0x95, 0x4C, 0x19, 0xEE, 0x6B, 0xAB, - 0x88, 0x2C, 0x64, 0x92, 0xDC, 0xD2, 0x46, 0x8A, 0xE5, 0x5C, - 0x06, 0x7F, 0x45, 0xA5, 0x8C, 0x2D, 0x7B, 0xF9, 0xB2, 0x57, - 0x2D, 0x9B, 0x02, 0x22, 0x10, 0xFC, 0x35, 0xA1, 0x21, 0xD8, - 0x4E, 0x2D, 0xB5, 0xA1, 0x39, 0x0A, 0x25, 0x45, 0x28, 0xAD, - 0x3B, 0x40, 0xAE, 0x29, 0xFB, 0xC7, 0xBA, 0x1F, 0x1D, 0x83, - 0x27, 0x8F, 0xF5, 0x25, 0x02, 0x9D, 0x47, 0xEE, 0xF9, 0x26, - 0xF1, 0x5B, 0x8D, 0x54, 0xE8, 0x0B, 0x5D, 0xBB, 0x78, 0x5B, - 0x17, 0x6C, 0x9C, 0x5F, 0x6D, 0x08, 0x76, 0xD6, 0x1F, 0x54, - 0xD1, 0x40, 0x28, 0x96, 0x09, 0x1D, 0x7D, 0xA4, 0x65, 0x89, - 0x6F, 0xB7, 0x59, 0x5B, 0x62, 0xC9, 0x58, 0x7F, 0x36, 0x5D, - 0x01, 0xBF, 0xCC, 0xE5, 0x86, 0x30, 0x17, 0x90, 0x7A, 0x16, - 0x08, 0x0F, 0x5C, 0xAE, 0xB6, 0x18, 0x77, 0x07, 0xE0, 0xC6, - 0x5F, 0x15, 0xD6, 0x4A, 0xD4, 0x00, 0xD4, 0x80, 0x56, 0x2B, - 0x4F, 0x36, 0x1C, 0xDC, 0x1D, 0x36, 0xAF, 0xD4, 0x49, 0x70, - 0x8C, 0xF7, 0x9D, 0x2A, 0x36, 0xF8, 0x92, 0xE7, 0xBC, 0x11, - 0x17, 0x7A, 0xEE, 0x05, 0xBD, 0x6D, 0x44, 0xA4, 0xF1, 0xD3, - 0x47, 0x56, 0x9A, 0xF4, 0x34, 0x8C, 0x01, 0xEC, 0xE8, 0x03, - 0xF6, 0xF8, 0xF1, 0xE3, 0xFE, 0xE2, 0xB7, 0xB8, 0x3C, 0xE5, - 0x6D, 0x98, 0xF7, 0xBE, 0xF6, 0xE3, 0xCF, 0xB1, 0xE0, 0xAD, - 0xE1, 0x9B, 0x9B, 0x44, 0x26, 0x52, 0xF8, 0x2C, 0xA8, 0x34, - 0xD8, 0x3A, 0x75, 0x50, 0xF7, 0xBB, 0xD9, 0x61, 0x6E, 0xF9, - 0x74, 0xCB, 0x4D, 0xDA, 0x22, 0xFD, 0x4E, 0x68, 0x89, 0xDE, - 0x11, 0x53, 0x89, 0x3D, 0x0B, 0x78, 0x9A, 0x5D, 0x19, 0xED, - 0x43, 0xF7, 0x76, 0xFD, 0xB3, 0xC3, 0xB7, 0x3D, 0x0E, 0x23, - 0xD0, 0xE7, 0x6E, 0x19, 0x6C, 0x18, 0x6D, 0xB7, 0x6E, 0xF6, - 0x8D, 0x30, 0xD3, 0x94, 0x0E, 0x2D, 0xC7, 0x69, 0x42, 0x69, - 0xD0, 0x31, 0x24, 0xBE, 0x66, 0xED, 0x23, 0x18, 0xC6, 0x3D, - 0x96, 0xEC, 0x78, 0x73, 0x9C, 0xF1, 0x42, 0xEA, 0x64, 0x1A, - 0x16, 0x05, 0x23, 0x06, 0xA7, 0x14, 0x46, 0xC3, 0xBE, 0xFC, - 0x0D, 0xAA, 0x3C, 0x65, 0x42, 0x65, 0x45, 0xB4, 0x81, 0x52, - 0x33, 0xC8, 0x62, 0xF0, 0x2C, 0xBA, 0xCA, 0x1B, 0x52, 0x24, - 0x8E, 0x62, 0x95, 0x9A, 0x22, 0xDE, 0xCA, 0x8F, 0x60, 0x4D, - 0x71, 0x93, 0x65, 0xD6, 0xBD, 0xA9, 0x16, 0xB7, 0xDE, 0xEF, - 0xB3, 0x88, 0xE0, 0xD9, 0x9B, 0x09, 0x3F, 0x29, 0x49, 0xA0, - 0xFC, 0x78, 0x81, 0xF1, 0x31, 0xB9, 0xB9, 0x64, 0x12, 0x98, - 0x23, 0x34, 0x5B, 0x4E, 0xBB, 0x9B, 0x71, 0x18, 0x4F, 0x5A, - 0x40, 0x15, 0xC0, 0x8F, 0x91, 0xA3, 0x22, 0x54, 0xCC, 0x85, - 0xEE, 0xC8, 0x2C, 0xBE, 0xFA, 0xD8, 0x7E, 0x3F, 0x83, 0xEC, - 0x38, 0xF4, 0xF5, 0xB4, 0x8A, 0x62, 0x1F, 0x52, 0x72, 0xAA, - 0x3F, 0xFB, 0x45, 0xC6, 0x9D, 0x5A, 0x70, 0x50, 0x37, 0x76, - 0xFD, 0xE2, 0xEF, 0xCA, 0x9B, 0x84, 0x2B, 0x24, 0x37, 0x27, - 0x4A, 0x76, 0xF4, 0xD1, 0x53, 0x2D, 0x69, 0xD4, 0x10, 0xDB, - 0x68, 0x25, 0x59, 0x94, 0x8A, 0x0C, 0xB1, 0x58, 0xF5, 0x4C, - 0x83, 0x72, 0xB6, 0x33, 0xB8, 0x34, 0x36, 0xDC, 0xE2, 0x7A, - 0xEB, 0x44, 0xB9, 0xED, 0xD4, 0xC7, 0xE9, 0x1F, 0x72, 0xD7, - 0xB4, 0xB6, 0xB5, 0xDA, 0xC4, 0xF4, 0x28, 0x97, 0xA6, 0xDA, - 0x8B, 0x26, 0x4A, 0x8A, 0x98, 0x8C, 0x1E, 0x6D, 0xC7, 0xC2, - 0x90, 0x35, 0x05, 0x29, 0x08, 0x2A, 0xA0, 0xF2, 0xD7, 0x16, - 0xF1, 0xBE, 0x59, 0xDF, 0x35, 0xF1, 0x42, 0xED, 0x7C, 0xB8, - 0x9A, 0x1D, 0x34, 0xCB, 0x34, 0x3C, 0x30, 0x3E, 0x31, 0x57, - 0x0A, 0x23, 0xFC, 0xD5, 0xBF, 0xA2, 0xC6, 0xC4, 0x0F, 0x75, - 0x29, 0x4D, 0xCB, 0xBF, 0x4C, 0x62, 0xE1, 0x39, 0x61, 0x59, - 0x06, 0x61, 0x70, 0xD4, 0x52, 0x3B, 0x02, 0xD5, 0x4A, 0xFA, - 0x71, 0xCD, 0x3D, 0xBD, 0xB6, 0xC9, 0x77, 0x2B, 0xE0, 0x93, - 0x16, 0x5B, 0x07, 0xB4, 0x7F, 0x33, 0xEA, 0x3E, 0x89, 0x84, - 0xF2, 0x86, 0x0A, 0x8F, 0xB9, 0x0B, 0xE6, 0xEC, 0xC8, 0x1B, - 0x7E, 0x2C, 0x88, 0x50, 0xE4, 0x71, 0x24, 0xEF, 0x09, 0x69, - 0x96, 0xF0, 0x1F, 0x22, 0x23, 0x29, 0x49, 0xD2, 0x3C, 0x8E, - 0x3A, 0x6B, 0x5F, 0x3E, 0x0F, 0xF6, 0x8C, 0x72, 0x5E, 0xC9, - 0x1B, 0x1E, 0x39, 0x2D, 0x01, 0xEF, 0x79, 0x26, 0x9F, 0x20, - 0xA2, 0xBB, 0x70, 0x8D, 0xA4, 0x8C, 0xDC, 0xBD, 0xEC, 0xF6, - 0xF7, 0xB4, 0xF8, 0x71, 0x5C, 0xB6, 0xB6, 0x5B, 0xB5, 0x35, - 0x21, 0xB4, 0xBE, 0xEB, 0xCE, 0xA1, 0xA4, 0xE9, 0x42, 0x92, - 0xA5, 0xD1, 0x2A, 0x3A, 0x8D, 0x13, 0xD8, 0x31, 0x75, 0xDF, - 0xF7, 0x6B, 0x1B, 0x56, 0x3A, 0x19, 0x5E, 0x04, 0xAE, 0x61, - 0xA0, 0xA1, 0x39, 0x82, 0x06, 0x48, 0x0B, 0x68, 0xE4, 0x79, - 0x0E, 0x03, 0x0A, 0xA6, 0xB7, 0x1F, 0xDC, 0x16, 0x8D, 0xC7, - 0x7A, 0xB9, 0xB4, 0xBB, 0x54, 0x8B, 0x34, 0x82, 0x1E, 0x4A, - 0x1F, 0x92, 0x12, 0xE0, 0x08, 0x68, 0x05, 0xD4, 0x69, 0x20, - 0x66, 0x93, 0xD7, 0x8A, 0x6F, 0xB6, 0xF7, 0xEB, 0x48, 0x2D, - 0x19, 0x0C, 0x9E, 0x60, 0x90, 0x57, 0x26, 0x93, 0x99, 0xC1, - 0x30, 0xB8, 0x8A, 0x42, 0xE2, 0x45, 0x28, 0x93, 0xB7, 0x26, - 0xE6, 0xDA, 0x3B, 0x9F, 0x60, 0xC5, 0x9D, 0x29, 0xA1, 0x0E, - 0xD6, 0xFD, 0xF3, 0x43, 0xCD, 0xA6, 0x95, 0x0B, 0x4B, 0x15, - 0xD4, 0x07, 0xA7, 0x0F, 0x24, 0x85, 0xE3, 0x7D, 0x00, 0x62, - 0x7D, 0x3F, 0xFC, 0x94, 0x2D, 0x94, 0x18, 0x6A, 0x7F, 0x89, - 0x6D, 0xB2, 0xF2, 0xCF, 0x6C, 0xDD, 0x00, 0x5E, 0xD3, 0xBB, - 0xB2, 0xFA, 0x82, 0x42, 0x96, 0xD2, 0xC5, 0x14, 0x91, 0x8B, - 0x88, 0x9F, 0xCA, 0xF1, 0xB6, 0x8A, 0x16, 0xB8, 0x3F, 0xC2, - 0x51, 0x34, 0xD9, 0xB6, 0x3D, 0x94, 0x91, 0x7A, 0xBC, 0xF8, - 0x87, 0xD1, 0x92, 0xD8, 0x67, 0xB4, 0x75, 0x60, 0x49, 0xB7, - 0x71, 0xF6, 0x84, 0xF6, 0xD7, 0xDB, 0xB7, 0x53, 0x62, 0x1B, - 0x82, 0xED, 0xF7, 0x9D, 0xB3, 0x2D, 0x83, 0x45, 0xA6, 0xDC, - 0x95, 0x28, 0x74, 0x3A, 0xEE, 0x67, 0x0B, 0x24, 0xDC, 0x1C, - 0xEE, 0x95, 0x60, 0xB7, 0xF6, 0x5C, 0x9F, 0x79, 0x59, 0x97, - 0xCD, 0x6B, 0xFD, 0xC9, 0x45, 0xB8, 0x40, 0x84, 0xF5, 0x21, - 0x94, 0xFE, 0x6C, 0x0C, 0x66, 0x25, 0x34, 0x6F, 0xB6, 0xE0, - 0x84, 0x55, 0xDF, 0x54, 0x26, 0xE7, 0xB8, 0x6F, 0x28, 0xAA, - 0xA7, 0x25, 0xF4, 0xD7, 0xAD, 0xC0, 0xA0, 0x31, 0xA1, 0x71, - 0x47, 0x5B, 0xD8, 0xC4, 0x7C, 0x1A, 0x52, 0xB7, 0xDA, 0x41, - 0xEF, 0x2D, 0x55, 0x34, 0xC6, 0x9A, 0xB1, 0x4E, 0x7D, 0x0F, - 0xE5, 0xD1, 0x7D, 0x5C, 0xF6, 0xA4, 0xB7, 0xAD, 0x6E, 0xBD, - 0x1E, 0xE1, 0x21, 0x87, 0x90, 0x02, 0x9D, 0x53, 0x2A, 0x71, - 0x94, 0xB8, 0x09, 0xA0, 0x05, 0x28, 0x34, 0x2A, 0xED, 0x38, - 0x87, 0x6B, 0xDC, 0xA1, 0xBD, 0x7B, 0x19, 0x33, 0x5A, 0xF9, - 0x0D, 0x40, 0xE5, 0x06, 0x9A, 0x78, 0x93, 0x9D, 0x7A, 0x82, - 0xE2, 0x37, 0x96, 0xE6, 0x2A, 0xB9, 0x98, 0x37, 0xB5, 0x66, - 0xE4, 0xAD, 0xAD, 0x91, 0xCC, 0x18, 0x89, 0x79, 0x4A, 0x75, - 0xC2, 0x55, 0xA9, 0x6B, 0x25, 0x44, 0xE5, 0xD6, 0x4E, 0x2F, - 0x13, 0x5A, 0x32, 0x3B, 0x73, 0xA4, 0x01, 0xD8, 0x81, 0x82, - 0x42, 0xEC, 0xD1, 0x0E, 0x63, 0xDB, 0x6D, 0x36, 0xBD, 0xCB, - 0x74, 0xB8, 0x4F, 0x90, 0x88, 0x70, 0x50, 0xE1, 0x4F, 0x19, - 0xD2, 0x68, 0x49, 0xCF, 0x43, 0x69, 0x15, 0x2A, 0x3E, 0x44, - 0x8C, 0x41, 0x00, 0x8A, 0x26, 0x6A, 0x20, 0x02, 0x7E, 0xAA, - 0x29, 0x35, 0x39, 0xD4, 0x09, 0x33, 0x6B, 0xF3, 0x1F, 0x95, - 0x90, 0x37, 0x03, 0x77, 0x1B, 0xD4, 0x6B, 0xA5, 0xE5, 0xB6, - 0x40, 0x43, 0x2B, 0x21, 0xBD, 0x08, 0x09, 0xE8, 0x1A, 0x5C, - 0x73, 0x56, 0x91, 0xD4, 0x32, 0xC0, 0x0E, 0xB8, 0x8E, 0x3A, - 0x88, 0x9A, 0x1B, 0xA8, 0xD4, 0xD0, 0x52, 0xA5, 0x10, 0xC8, - 0x1C, 0x7C, 0x58, 0xD1, 0x5F, 0xAC, 0xB7, 0x9E, 0x4D, 0xF3, - 0x39, 0x9E, 0x2C, 0x09, 0x28, 0x65, 0xD8, 0xCD, 0xEA, 0x72, - 0x0B, 0xE9, 0x4B, 0x2F, 0x25, 0xB1, 0xD2, 0xAD, 0x20, 0x90, - 0xA4, 0xF6, 0xD0, 0x9A, 0x75, 0xE0, 0x1A, 0x09, 0x1D, 0x95, - 0x5D, 0xD9, 0x8A, 0x29, 0xCC, 0x2D, 0x15, 0xE8, 0x43, 0x77, - 0x57, 0xC3, 0xE6, 0xC7, 0xBE, 0xDB, 0xC4, 0xAD, 0xBC, 0xE2, - 0x0C, 0xA6, 0x54, 0x0A, 0x83, 0x2A, 0x05, 0x2A, 0x4D, 0x73, - 0x06, 0x98, 0x61, 0x6D, 0x27, 0x94, 0xEA, 0x3C, 0x60, 0x85, - 0x95, 0x9A, 0x86, 0x05, 0x2E, 0xF3, 0x33, 0xE1, 0xFF, 0x00, - 0x6F, 0x58, 0x36, 0x92, 0xEF, 0x30, 0x1D, 0x78, 0x48, 0x60, - 0x24, 0x98, 0xE4, 0xD5, 0x3A, 0x88, 0xA1, 0xCB, 0x07, 0xD9, - 0x5D, 0xEB, 0x98, 0x02, 0x07, 0x6A, 0x1A, 0x78, 0x34, 0xB2, - 0xA1, 0x09, 0xF8, 0x70, 0x59, 0x87, 0xB9, 0x67, 0x2A, 0x5A, - 0xB8, 0x08, 0x54, 0x55, 0x04, 0x97, 0x0E, 0x90, 0x4F, 0xA7, - 0x06, 0x6F, 0x54, 0x31, 0x60, 0xB5, 0xDA, 0xC1, 0xF3, 0x42, - 0x11, 0x26, 0xD9, 0x26, 0xE5, 0xBA, 0x5F, 0x65, 0x09, 0x52, - 0x9B, 0x76, 0x49, 0x05, 0x63, 0xA0, 0x24, 0xAB, 0xA7, 0x14, - 0x43, 0x9A, 0xFA, 0x32, 0x3B, 0x86, 0xC3, 0x6C, 0x09, 0xCC, - 0x35, 0x39, 0xEE, 0xFB, 0x2F, 0x27, 0x36, 0xD5, 0xB4, 0x47, - 0x7E, 0xF8, 0x1E, 0xBB, 0x77, 0x4B, 0x8C, 0x46, 0x3E, 0x21, - 0xD4, 0xFC, 0xE0, 0x52, 0xDD, 0x52, 0x93, 0xF5, 0x88, 0xC1, - 0xBE, 0x90, 0x90, 0xB9, 0xE8, 0xF7, 0xBC, 0xC2, 0x43, 0xA8, - 0x0D, 0x3C, 0x02, 0x1B, 0x1F, 0xE2, 0x06, 0xC1, 0xB7, 0xE1, - 0xA6, 0x1E, 0xD4, 0xDA, 0xE9, 0xEE, 0x0A, 0x78, 0xCB, 0x8B, - 0x89, 0x0B, 0x59, 0xED, 0x2D, 0xB7, 0x53, 0xFB, 0x78, 0x9D, - 0x90, 0xB1, 0xA1, 0x55, 0xEF, 0xF7, 0x5B, 0x8B, 0xA7, 0x97, - 0x3C, 0xF7, 0x25, 0xBB, 0xEF, 0xC4, 0x26, 0xFB, 0xB9, 0xA1, - 0xC6, 0x9F, 0xF7, 0x7B, 0x2C, 0x2C, 0x64, 0xDB, 0x71, 0x10, - 0xB0, 0x3F, 0x49, 0xDD, 0x47, 0x19, 0x2D, 0x69, 0xC2, 0x88, - 0x58, 0xAE, 0x65, 0x88, 0xEA, 0x6B, 0x88, 0x2B, 0x07, 0x88, - 0xBC, 0xFD, 0x9F, 0xFB, 0x4B, 0xEE, 0xE7, 0x7C, 0x25, 0x29, - 0xEF, 0x0D, 0x51, 0xB4, 0x6B, 0xD7, 0xA7, 0x57, 0x0B, 0x87, - 0xEA, 0x6A, 0xCB, 0xA3, 0xD3, 0x88, 0x7D, 0x2B, 0x75, 0xD3, - 0xE8, 0xAC, 0x7F, 0xF6, 0x7B, 0xBF, 0x4D, 0x9E, 0x35, 0xA6, - 0xAE, 0x5F, 0xC2, 0x8A, 0xAB, 0x1D, 0x71, 0xDF, 0xB6, 0x48, - 0x2E, 0x34, 0xA2, 0xCB, 0x49, 0x49, 0x4A, 0xCE, 0xA4, 0x2C, - 0xEA, 0xD2, 0xAC, 0xF5, 0x27, 0xCA, 0x06, 0x39, 0xEE, 0xC0, - 0xF9, 0xA3, 0xBC, 0x60, 0x8E, 0x84, 0xB8, 0xE2, 0x3A, 0x85, - 0x7A, 0x7A, 0x12, 0xED, 0xC2, 0x26, 0xF9, 0x64, 0xB8, 0xA5, - 0xBD, 0xA4, 0xED, 0xCD, 0x3B, 0x99, 0x29, 0xDA, 0x70, 0x6D, - 0xE2, 0xF0, 0x6B, 0xC0, 0x72, 0x7C, 0xA5, 0x94, 0x03, 0x9D, - 0x7B, 0x8D, 0x35, 0x9F, 0xEB, 0x63, 0xAE, 0x4C, 0x6E, 0x4C, - 0x5C, 0xDA, 0x74, 0xF7, 0xAA, 0xFC, 0x3A, 0x3E, 0xDA, 0xA9, - 0x0F, 0x3C, 0x53, 0xBC, 0xDA, 0xDD, 0xAE, 0xB7, 0xBD, 0x25, - 0xA6, 0x55, 0xC8, 0x77, 0xD9, 0x6E, 0x32, 0x38, 0x71, 0x12, - 0x85, 0x74, 0x96, 0x40, 0xC8, 0x8A, 0x8A, 0x1F, 0x95, 0x96, - 0x78, 0x50, 0xF7, 0x3C, 0x90, 0x0E, 0x48, 0xA6, 0x06, 0x0E, - 0xB2, 0x85, 0xEC, 0xCB, 0xE6, 0xDD, 0x8B, 0x78, 0x4A, 0xA7, - 0xA5, 0xA5, 0x40, 0x92, 0xD3, 0x8C, 0xAA, 0x2B, 0x9A, 0xF4, - 0x34, 0xA7, 0x1A, 0xD2, 0x85, 0x04, 0xA5, 0x29, 0x1A, 0xD0, - 0xE5, 0x16, 0x17, 0xAF, 0x3E, 0x82, 0x30, 0x04, 0xF1, 0x9D, - 0x07, 0x97, 0x53, 0xB8, 0xFC, 0x7E, 0x09, 0x94, 0x12, 0x8F, - 0x30, 0x1D, 0x41, 0xAD, 0xE1, 0xF1, 0xF8, 0xA6, 0xE7, 0xEC, - 0xA6, 0x24, 0xD6, 0x2E, 0x96, 0x05, 0x17, 0x65, 0x33, 0xAC, - 0xA9, 0x09, 0x41, 0xD4, 0x10, 0x28, 0x95, 0x05, 0x8A, 0x0A, - 0x85, 0x25, 0x54, 0x3D, 0x58, 0x59, 0x6D, 0x7E, 0xE8, 0x9D, - 0x53, 0x85, 0x15, 0x86, 0xE6, 0xC5, 0xB2, 0xB2, 0x86, 0x98, - 0xA7, 0xBD, 0x91, 0xB9, 0x5F, 0xDA, 0x33, 0x17, 0xB8, 0x63, - 0x39, 0x22, 0x44, 0x12, 0x9A, 0xC9, 0xB2, 0xA4, 0x28, 0xBD, - 0xA8, 0x8A, 0xE9, 0xA1, 0xEA, 0xFA, 0x58, 0xB7, 0xBF, 0x7B, - 0xB6, 0xB8, 0x8A, 0x87, 0x07, 0xAA, 0x64, 0x9B, 0x35, 0xC5, - 0xBB, 0xC9, 0xA5, 0x58, 0x95, 0x77, 0xC7, 0x3E, 0x79, 0x9D, - 0xBC, 0xE7, 0x3F, 0x06, 0x22, 0x55, 0x6B, 0xB6, 0x6B, 0xD2, - 0x9B, 0x74, 0x76, 0xE8, 0x40, 0x19, 0x82, 0xEB, 0xAB, 0x4E, - 0xB2, 0x69, 0x99, 0xE8, 0x1E, 0x4C, 0x08, 0x2E, 0x1B, 0x1E, - 0x20, 0xD1, 0x68, 0xDB, 0x79, 0x24, 0x34, 0x00, 0xA0, 0x16, - 0xCD, 0xCF, 0xB8, 0xED, 0xA9, 0x2E, 0x2D, 0xC5, 0xCB, 0x70, - 0x1A, 0x2B, 0x59, 0x57, 0x0C, 0x79, 0xD6, 0xAC, 0x8F, 0x98, - 0x0C, 0x6E, 0x77, 0x30, 0x41, 0x69, 0xE6, 0xAA, 0x9A, 0x3B, - 0x17, 0xC4, 0xE0, 0xF1, 0x81, 0x1C, 0x11, 0x66, 0xED, 0xDB, - 0xF6, 0xFD, 0xA2, 0x65, 0xCE, 0x51, 0xB7, 0x5B, 0x16, 0x35, - 0x21, 0x84, 0xA4, 0xB4, 0x1D, 0x1D, 0x7D, 0xC4, 0x8A, 0x84, - 0xF9, 0x55, 0x9E, 0x07, 0x8D, 0xC7, 0xEC, 0x08, 0xAB, 0x9B, - 0x89, 0xA6, 0x3F, 0x9A, 0xF2, 0x47, 0x0A, 0xE1, 0xF2, 0x5E, - 0xDD, 0xB0, 0x5B, 0xA0, 0x7A, 0xC5, 0x2B, 0xCB, 0xA5, 0x24, - 0xF4, 0xFE, 0x92, 0x4E, 0x26, 0x0D, 0x71, 0xCC, 0xA1, 0x4E, - 0x91, 0x90, 0x58, 0x38, 0x32, 0x66, 0x3C, 0x23, 0xC1, 0x8E, - 0xA5, 0x15, 0x1A, 0x55, 0x3D, 0x5E, 0x52, 0x74, 0x80, 0x06, - 0x25, 0x11, 0xD0, 0x54, 0xE0, 0x3B, 0x56, 0x8C, 0x0E, 0x91, - 0xDA, 0x18, 0x0B, 0x9C, 0x7A, 0x00, 0x56, 0x8E, 0x47, 0x72, - 0x77, 0x6F, 0x4B, 0x94, 0xBB, 0xF5, 0xE9, 0xE6, 0xEE, 0xAE, - 0xC4, 0x51, 0x4B, 0x36, 0xF2, 0x80, 0xB8, 0xE9, 0x59, 0x1E, - 0xBB, 0x9A, 0xFD, 0x72, 0x9C, 0xE8, 0x29, 0x4E, 0xBC, 0x46, - 0x2E, 0x1A, 0xE1, 0xCA, 0x8B, 0xBE, 0xDA, 0xA5, 0xB5, 0x20, - 0x4B, 0x99, 0x15, 0x56, 0xFF, 0x00, 0x01, 0x13, 0xDE, 0x5C, - 0x2E, 0x0B, 0x7E, 0x1F, 0x81, 0xC0, 0xE0, 0x69, 0x1C, 0x3E, - 0x1D, 0x69, 0xA3, 0x45, 0x34, 0xE9, 0xF2, 0x62, 0x3E, 0x9A, - 0xA1, 0xB5, 0x72, 0x69, 0xE8, 0xAA, 0x98, 0xC0, 0xDB, 0x08, - 0x9D, 0x6E, 0x5C, 0x57, 0x1E, 0xF6, 0x2A, 0x57, 0xB1, 0x70, - 0x66, 0xA4, 0x80, 0x92, 0x06, 0xAE, 0x8C, 0xC1, 0x51, 0xC7, - 0x25, 0xDB, 0x77, 0xE3, 0x63, 0x72, 0x25, 0xD3, 0xAB, 0x0A, - 0x38, 0x76, 0xF0, 0x4D, 0x2E, 0xD8, 0x26, 0x66, 0x9C, 0x92, - 0xF6, 0xC9, 0xE5, 0xE5, 0xE7, 0x6E, 0xF3, 0x1E, 0x1B, 0xEF, - 0x23, 0x89, 0x0D, 0x45, 0x5A, 0x24, 0x27, 0x34, 0x1A, 0xF9, - 0x7F, 0x3E, 0x3B, 0x4D, 0x97, 0xB8, 0xAD, 0x77, 0x0B, 0x42, - 0x61, 0x75, 0x5D, 0xD2, 0xDF, 0xB8, 0x76, 0x8F, 0xDB, 0x92, - 0x42, 0xCB, 0x77, 0x44, 0x68, 0x52, 0xA7, 0x3C, 0xF6, 0xD2, - 0xB7, 0x25, 0xC2, 0xE7, 0x09, 0x08, 0xAD, 0xCE, 0x1B, 0xCA, - 0x7A, 0xDC, 0x4E, 0x5A, 0xAB, 0xFB, 0xC6, 0x6A, 0x7E, 0x78, - 0x15, 0x1F, 0x48, 0x0C, 0x4F, 0x25, 0xBE, 0xB8, 0x41, 0x19, - 0x85, 0x00, 0x93, 0x4B, 0xCA, 0xFC, 0xDA, 0xD4, 0x29, 0x0D, - 0xCE, 0xF0, 0xCF, 0x23, 0x84, 0xEA, 0x15, 0xA5, 0xC4, 0x3A, - 0x34, 0x94, 0x90, 0x68, 0x42, 0x82, 0xBA, 0x0F, 0x93, 0x09, - 0x9E, 0xEA, 0x04, 0xD2, 0xD9, 0x9A, 0x9E, 0x00, 0xA2, 0xA1, - 0xD8, 0x25, 0x5D, 0x2D, 0x96, 0xD9, 0x08, 0x8E, 0xFB, 0xA6, - 0x34, 0x84, 0xA1, 0x32, 0xD2, 0xC2, 0xA8, 0xE1, 0x43, 0x67, - 0x52, 0x40, 0x34, 0x24, 0x52, 0xBD, 0x47, 0x08, 0xAE, 0x34, - 0xBD, 0xC2, 0xA3, 0xF7, 0x2B, 0x84, 0x11, 0x35, 0x8C, 0xFE, - 0x2E, 0xC3, 0xCD, 0xF1, 0xF1, 0x45, 0x73, 0xE7, 0x2D, 0xAA, - 0x22, 0xB6, 0x9E, 0xDA, 0x79, 0xC2, 0x89, 0x57, 0x55, 0xC4, - 0x6D, 0x72, 0x24, 0x21, 0xBE, 0x0A, 0x94, 0x92, 0x84, 0x94, - 0x2C, 0xA0, 0x29, 0x5A, 0x4F, 0x51, 0xCF, 0x10, 0xDC, 0xB5, - 0xB1, 0xCA, 0x03, 0x70, 0xAB, 0x45, 0x78, 0x20, 0x76, 0xCD, - 0x52, 0x07, 0x83, 0x88, 0x0E, 0xC1, 0x00, 0xDA, 0x56, 0x2B, - 0x74, 0xBB, 0x79, 0x40, 0x52, 0x61, 0xCB, 0x99, 0xA5, 0xA2, - 0xFB, 0xAA, 0x0A, 0xA6, 0xA5, 0x50, 0xAE, 0x86, 0x9F, 0x27, - 0xB3, 0x0A, 0xA4, 0x9D, 0xDA, 0xA9, 0xD0, 0x9F, 0xB9, 0xA2, - 0x36, 0xD4, 0x0E, 0xEE, 0x28, 0x9E, 0xE7, 0xB2, 0xD9, 0xA1, - 0x5F, 0xB8, 0x0C, 0xC7, 0x44, 0x98, 0x90, 0x80, 0x4B, 0x2F, - 0x65, 0xA0, 0xB8, 0x84, 0x84, 0x85, 0x04, 0x8F, 0x95, 0xDD, - 0xA8, 0xE9, 0xF3, 0x1C, 0x3E, 0xDA, 0xE1, 0x24, 0xD4, 0x9A, - 0xE2, 0xAA, 0xD7, 0xF7, 0x05, 0xCD, 0x18, 0x50, 0xD3, 0xE4, - 0x97, 0x26, 0x2E, 0x74, 0xD7, 0x0F, 0x86, 0x4A, 0x94, 0x49, - 0xA0, 0xCA, 0xBD, 0x3F, 0x54, 0x50, 0xFE, 0x01, 0x8B, 0x4C, - 0x70, 0xD7, 0x2F, 0x8E, 0xF4, 0x85, 0xF2, 0x1F, 0x8F, 0xDC, - 0x8F, 0x42, 0xE4, 0xFD, 0xED, 0xBB, 0x23, 0xFB, 0x8A, 0xF4, - 0x38, 0x10, 0x1B, 0x68, 0xB8, 0x98, 0xC0, 0xA9, 0x2F, 0xB9, - 0xD9, 0xDC, 0x23, 0xB8, 0x3C, 0xF9, 0xF9, 0x31, 0x99, 0xA6, - 0x6C, 0x6D, 0x34, 0xE6, 0x77, 0xD1, 0x4F, 0xB6, 0xD9, 0xFA, - 0x99, 0xDB, 0x1B, 0xB9, 0x5A, 0xE3, 0xDE, 0x92, 0xA4, 0x5D, - 0x96, 0x18, 0x11, 0x22, 0x27, 0xC3, 0xC5, 0x49, 0xF5, 0x01, - 0xCC, 0x9E, 0xD5, 0x1E, 0xB3, 0x84, 0x73, 0x4C, 0xE9, 0x0D, - 0x5C, 0xBB, 0x66, 0xD3, 0xB1, 0x5B, 0xD9, 0x33, 0x4B, 0x07, - 0x79, 0xCC, 0xAB, 0xCF, 0xC3, 0xA3, 0x4E, 0x0D, 0xBB, 0x31, - 0xD5, 0x57, 0x4A, 0xDD, 0xEE, 0x9F, 0x36, 0x27, 0xB7, 0xC9, - 0x51, 0x7D, 0xF2, 0xE1, 0xE7, 0xB4, 0x75, 0x2A, 0x5E, 0xA1, - 0xEF, 0x6D, 0x3D, 0x7A, 0x6B, 0xF8, 0xF0, 0x42, 0xA3, 0xD3, - 0x05, 0x09, 0xE4, 0xBE, 0xEF, 0x97, 0x73, 0x6E, 0x4D, 0x86, - 0xE0, 0x34, 0xEE, 0x3B, 0x5A, 0x3D, 0xAA, 0x16, 0x68, 0x99, - 0x2D, 0x24, 0xE9, 0x0B, 0x3D, 0x8B, 0x19, 0x02, 0x7A, 0xF2, - 0x38, 0xE5, 0x5E, 0xE1, 0xDA, 0x44, 0x2F, 0xD4, 0x39, 0x5A, - 0x4F, 0xF9, 0x4F, 0x0E, 0xC4, 0xD5, 0x92, 0x02, 0x01, 0x54, - 0xF8, 0x9B, 0x92, 0xD8, 0xE2, 0x8B, 0x25, 0xD1, 0x19, 0xF4, - 0x66, 0xEC, 0x77, 0xBB, 0x8B, 0x4D, 0x14, 0x53, 0x5E, 0xB0, - 0x68, 0xA0, 0x7A, 0x30, 0x92, 0xDA, 0xCA, 0xE5, 0x8F, 0xE4, - 0xAB, 0x71, 0x15, 0x73, 0x6B, 0x41, 0xC0, 0x9A, 0x62, 0x16, - 0x64, 0x6E, 0x18, 0xE2, 0x91, 0x79, 0xA7, 0x36, 0xCC, 0x1A, - 0x5A, 0x58, 0x88, 0x1C, 0xB8, 0x2E, 0x87, 0xC7, 0x24, 0x91, - 0x40, 0x33, 0xCA, 0x87, 0xBD, 0xE9, 0xC7, 0x65, 0xF6, 0x94, - 0x17, 0xDE, 0x39, 0xAE, 0x1B, 0x2C, 0x7F, 0xC2, 0xDA, 0x1F, - 0x9B, 0xA9, 0x5E, 0xE4, 0x86, 0xFF, 0x00, 0x40, 0xC0, 0x34, - 0x87, 0x2C, 0x5B, 0x6B, 0x64, 0x72, 0xFF, 0x00, 0x98, 0xF6, - 0x2F, 0x19, 0x76, 0xB3, 0x31, 0x33, 0x74, 0xDB, 0x05, 0x0A, - 0xCA, 0xD6, 0xC2, 0xE4, 0x25, 0x09, 0x21, 0x08, 0x79, 0x4D, - 0x29, 0x05, 0x40, 0x8C, 0x82, 0x8E, 0x63, 0x2E, 0xCA, 0x61, - 0xDE, 0xE3, 0x6F, 0xA1, 0xF5, 0xE8, 0x2B, 0x4B, 0x69, 0x35, - 0x37, 0xAC, 0x2A, 0xA7, 0x2F, 0xEC, 0x1B, 0x36, 0x0E, 0xCD, - 0x87, 0x02, 0xC5, 0x6F, 0x4C, 0x7B, 0x49, 0x4A, 0xCA, 0xA1, - 0xC8, 0xF6, 0xAE, 0x25, 0x6B, 0x35, 0x79, 0x0F, 0x17, 0x0A, - 0xD4, 0x56, 0x14, 0x28, 0xA0, 0x4F, 0x56, 0x14, 0x07, 0xB7, - 0x22, 0x8C, 0x04, 0xE6, 0x12, 0xBE, 0xFB, 0xB3, 0x42, 0xB9, - 0xDD, 0x96, 0x25, 0xF7, 0x9B, 0x1E, 0xC9, 0xA6, 0xC0, 0x23, - 0x4F, 0x77, 0xBB, 0x41, 0xD8, 0x29, 0x8A, 0x55, 0xFD, 0xC1, - 0x74, 0xCE, 0x20, 0xF4, 0xAB, 0x56, 0xD5, 0x29, 0x8E, 0x2C, - 0x07, 0x5A, 0x98, 0x5C, 0xB6, 0xB5, 0xBF, 0xC6, 0x26, 0x19, - 0x90, 0xB8, 0x61, 0x4A, 0x47, 0x05, 0xC4, 0xD4, 0xA5, 0x0B, - 0x49, 0xC8, 0xA8, 0x65, 0xDD, 0xE9, 0x14, 0xC4, 0x50, 0x4E, - 0x5A, 0xF1, 0x5C, 0x41, 0x4F, 0x67, 0x69, 0x92, 0x1A, 0xB7, - 0x31, 0x8A, 0x43, 0x0E, 0xDE, 0x61, 0x5D, 0x1B, 0x8D, 0x1E, - 0x62, 0x6E, 0xB6, 0x69, 0x2E, 0x68, 0x32, 0x16, 0x4B, 0x7C, - 0x23, 0xA8, 0x66, 0xA0, 0xAA, 0xA8, 0x23, 0x3A, 0x83, 0xD2, - 0x31, 0x66, 0xB5, 0xBB, 0x60, 0x3A, 0x5D, 0xCA, 0x47, 0xD5, - 0x56, 0x2E, 0x2C, 0x64, 0x70, 0x0F, 0x6F, 0x30, 0x77, 0xFA, - 0x4A, 0x70, 0x76, 0x74, 0xCB, 0x75, 0xFA, 0x25, 0xBD, 0x09, - 0x21, 0x49, 0x75, 0x09, 0x72, 0x46, 0x55, 0x5D, 0x48, 0xCC, - 0x11, 0xD4, 0x7A, 0xB0, 0xCA, 0x5B, 0xC7, 0xC9, 0xCB, 0x5A, - 0x37, 0x87, 0x1E, 0xDE, 0x2A, 0xDD, 0xB4, 0x7B, 0x7A, 0xDA, - 0x2B, 0x73, 0x37, 0x8E, 0x4D, 0x27, 0x13, 0xD1, 0xD9, 0xC1, - 0x7E, 0xA0, 0x7A, 0x1C, 0x79, 0xD6, 0x6F, 0x09, 0x26, 0x85, - 0xA7, 0xD9, 0x08, 0x5D, 0x7E, 0x92, 0x70, 0x45, 0x2A, 0x17, - 0x38, 0x64, 0xAE, 0x8E, 0x6D, 0x4D, 0xCC, 0x15, 0x02, 0xBB, - 0x7C, 0x3F, 0xEE, 0x31, 0x78, 0x52, 0x20, 0xAD, 0x0B, 0x80, - 0xB5, 0xD5, 0x2E, 0x13, 0x42, 0x94, 0x93, 0xD9, 0x81, 0x0C, - 0x06, 0xAB, 0xA6, 0xDB, 0x7B, 0xD2, 0xDF, 0xCA, 0xAB, 0xC1, - 0xD6, 0x15, 0xBB, 0x65, 0x6D, 0x68, 0xFB, 0x66, 0xC2, 0xC5, - 0xB5, 0xA3, 0xA9, 0x48, 0x15, 0x75, 0x7D, 0xAA, 0x3D, 0x38, - 0x25, 0x8D, 0xD2, 0x28, 0xB9, 0xDE, 0xED, 0xB8, 0xBA, 0xEE, - 0x73, 0x21, 0xEE, 0x4B, 0xBF, 0x6D, 0xAD, 0xFF, 0x00, 0x79, - 0x7E, 0xE5, 0xE2, 0xA7, 0xF7, 0x1A, 0x6B, 0x5C, 0xB8, 0x95, - 0xAD, 0x31, 0x8D, 0x63, 0x55, 0x11, 0x7F, 0xDA, 0x64, 0xF4, - 0x5E, 0x75, 0x3E, 0xEF, 0xA2, 0x90, 0x72, 0x85, 0xB8, 0xD2, - 0xB7, 0x8B, 0x77, 0x70, 0xF0, 0x6A, 0x6F, 0x84, 0x5C, 0x59, - 0x0D, 0x1F, 0xE2, 0xE6, 0x92, 0x85, 0x57, 0xB4, 0x04, 0xE1, - 0x2F, 0xFE, 0x83, 0xB7, 0xBB, 0xD3, 0x79, 0x8C, 0x15, 0x1A, - 0x86, 0xAE, 0xAE, 0xBF, 0xD8, 0x90, 0xED, 0x77, 0x23, 0xC0, - 0x7B, 0x93, 0xFB, 0xE9, 0x9C, 0xC7, 0x34, 0xED, 0xC0, 0x8A, - 0x43, 0x96, 0x82, 0xA2, 0x0E, 0x60, 0x9A, 0x51, 0x43, 0xF0, - 0x8A, 0xE1, 0x87, 0xB4, 0x65, 0x8E, 0x5D, 0xAC, 0x3E, 0x83, - 0xCD, 0x6F, 0x23, 0xB8, 0xF2, 0xE5, 0x5E, 0xEA, 0x2D, 0xEE, - 0x01, 0x12, 0x53, 0xED, 0xCD, 0x26, 0x6F, 0xFD, 0xCF, 0x70, - 0x89, 0xB8, 0xEE, 0x30, 0x50, 0x52, 0x62, 0x25, 0x64, 0x06, - 0x16, 0x94, 0xAD, 0xBF, 0xD5, 0x50, 0x20, 0x7A, 0x31, 0x6A, - 0xB5, 0xDB, 0xA1, 0x70, 0x12, 0x69, 0x01, 0xFC, 0x46, 0x07, - 0xE6, 0x12, 0xA9, 0xA6, 0x70, 0x24, 0x57, 0x05, 0x3C, 0xB5, - 0xEF, 0xDB, 0xB6, 0xD5, 0xDC, 0x29, 0xBA, 0xDB, 0xC8, 0x48, - 0x2A, 0xF6, 0xD1, 0xC6, 0x48, 0x52, 0x49, 0xE8, 0xA6, 0x1C, - 0xBE, 0xD5, 0xB2, 0xB3, 0x49, 0x42, 0x36, 0x62, 0xC7, 0x54, - 0x2A, 0xEE, 0xCD, 0xE6, 0xCD, 0x86, 0x4E, 0xE6, 0x7E, 0xE6, - 0xC9, 0x31, 0x21, 0x5F, 0x5A, 0x4A, 0x6E, 0x51, 0x8D, 0x7D, - 0x8C, 0xF6, 0xC5, 0x12, 0xEA, 0x48, 0xC8, 0x25, 0xE6, 0xEA, - 0x14, 0x7E, 0x70, 0xFA, 0x58, 0xA6, 0xEE, 0xFB, 0x5B, 0xA2, - 0xC4, 0xE5, 0x95, 0x53, 0x7B, 0x6B, 0xA0, 0xF3, 0x44, 0x6E, - 0xE0, 0xB7, 0x9A, 0x51, 0x37, 0x07, 0x00, 0x52, 0x16, 0xE1, - 0x05, 0xBF, 0x5D, 0x49, 0x07, 0xBA, 0xB3, 0x99, 0xE9, 0xE8, - 0x1E, 0x6C, 0x73, 0xDB, 0xB8, 0x74, 0x9A, 0x2B, 0x95, 0x94, - 0x9A, 0x86, 0x1C, 0x02, 0x56, 0xDC, 0x91, 0xE3, 0xBF, 0x09, - 0xD7, 0xD3, 0x9A, 0x9A, 0x06, 0x80, 0x74, 0xF6, 0x7A, 0x73, - 0xC0, 0x82, 0xAA, 0xC1, 0x6A, 0xF3, 0x92, 0x07, 0xB9, 0xA2, - 0x2E, 0xEB, 0x14, 0xCA, 0x81, 0x6D, 0x42, 0xD9, 0x0C, 0xB0, - 0xC2, 0xDF, 0x69, 0x14, 0x3C, 0x56, 0xDB, 0x00, 0x26, 0xA9, - 0x19, 0x95, 0x61, 0x84, 0x4F, 0x2E, 0xC7, 0x82, 0x00, 0x06, - 0xC4, 0x48, 0x27, 0xC5, 0x53, 0xF5, 0x4A, 0xAA, 0xBB, 0x6E, - 0x4D, 0xBA, 0xEC, 0x66, 0x6E, 0x70, 0x43, 0xED, 0xB2, 0x50, - 0xE3, 0x2D, 0xBE, 0x08, 0x5E, 0x8A, 0x82, 0x34, 0xA8, 0x67, - 0x4C, 0x36, 0x82, 0x47, 0x34, 0xAD, 0x9B, 0x76, 0xE6, 0x37, - 0xF2, 0xDD, 0x81, 0x55, 0x29, 0xFF, 0x00, 0x12, 0x5B, 0x2A, - 0xE3, 0xB7, 0xDC, 0xB7, 0xAD, 0x72, 0x2C, 0xD7, 0x42, 0x80, - 0x19, 0x53, 0x89, 0x0E, 0x36, 0x14, 0x9F, 0xA6, 0x83, 0xAB, - 0xF6, 0x70, 0xE4, 0x5C, 0x6A, 0x6E, 0x44, 0x15, 0x5C, 0xB5, - 0x8D, 0x91, 0x5C, 0x07, 0x3C, 0x87, 0x32, 0xB8, 0xFF, 0x00, - 0x82, 0x31, 0xB4, 0x39, 0xF1, 0x6C, 0x76, 0x0B, 0x6D, 0xDC, - 0x1E, 0x66, 0x52, 0xD2, 0x00, 0x0F, 0xC7, 0x71, 0x24, 0xAB, - 0xCE, 0x82, 0x42, 0xBF, 0x16, 0x37, 0x6C, 0xA7, 0xA4, 0x23, - 0xAE, 0x76, 0x9B, 0x79, 0x9D, 0xAA, 0xDE, 0x46, 0xE3, 0xD0, - 0x57, 0x2D, 0xE1, 0xCF, 0xE8, 0x8D, 0xC4, 0x72, 0x35, 0x9A, - 0x3A, 0xFC, 0x4A, 0xC1, 0x4F, 0x15, 0xCC, 0x82, 0x6B, 0x8D, - 0x5D, 0x71, 0xC1, 0x37, 0xDA, 0xFD, 0x98, 0xE2, 0xE0, 0xE9, - 0x48, 0xD3, 0xC0, 0x28, 0x4F, 0xBE, 0x6E, 0x3E, 0xFA, 0xF7, - 0xA7, 0x19, 0x5E, 0x37, 0x5F, 0x13, 0x8B, 0x5C, 0xF5, 0x56, - 0xB8, 0x1E, 0xA7, 0x35, 0x7E, 0xF4, 0xB1, 0xE9, 0xF2, 0xE9, - 0xC9, 0x4A, 0x2F, 0x7B, 0x7A, 0xF5, 0x22, 0xD1, 0x72, 0x66, - 0x63, 0x0A, 0x29, 0x53, 0x6A, 0x0A, 0xA8, 0xF2, 0x1C, 0x5E, - 0xAE, 0xAD, 0xDB, 0x34, 0x65, 0x8F, 0x15, 0x6B, 0x85, 0x0A, - 0xF9, 0x96, 0x37, 0x96, 0x9A, 0x85, 0x72, 0xB1, 0xF3, 0x0A, - 0xD3, 0xB9, 0xB7, 0x3D, 0x81, 0x86, 0x1A, 0x28, 0x98, 0xC9, - 0x52, 0x9E, 0x26, 0x94, 0x04, 0xA6, 0x84, 0x0F, 0x26, 0x55, - 0xC5, 0x47, 0x64, 0xF6, 0xDB, 0xF6, 0xD6, 0x4C, 0x4B, 0xB5, - 0x31, 0xE4, 0x53, 0xB0, 0x65, 0x5E, 0xBE, 0x82, 0x9C, 0x9B, - 0x91, 0x2D, 0x0A, 0x9E, 0x73, 0x39, 0xC1, 0xF6, 0xCA, 0xE6, - 0x3F, 0xE4, 0x38, 0xB8, 0xD9, 0x0F, 0xCB, 0x09, 0x54, 0xFE, - 0x32, 0xA5, 0xF7, 0xC3, 0x55, 0xE1, 0xA4, 0x48, 0x47, 0xAE, - 0x16, 0x7B, 0xA2, 0xE0, 0x48, 0xD5, 0x4D, 0x6C, 0xAF, 0xBA, - 0xEB, 0x67, 0xA1, 0x49, 0xC6, 0xB7, 0x10, 0x36, 0x56, 0x96, - 0x95, 0x88, 0xDE, 0x5A, 0x6A, 0x15, 0x4B, 0x6B, 0xEE, 0x99, - 0x4F, 0xA1, 0xA8, 0x89, 0x71, 0x77, 0x26, 0x56, 0x38, 0x2C, - 0x6A, 0x71, 0x09, 0x7D, 0xA4, 0xAF, 0xA4, 0x50, 0xE9, 0xD5, - 0xA4, 0x0A, 0x02, 0x3B, 0x71, 0xCF, 0x77, 0x3F, 0x6E, 0xBC, - 0x12, 0x5A, 0x2A, 0x15, 0x9A, 0xC7, 0x75, 0x0D, 0xA5, 0x4A, - 0x78, 0x79, 0xAB, 0x65, 0xB5, 0xB7, 0x5A, 0xBA, 0xB6, 0xB6, - 0x22, 0xBE, 0x95, 0x38, 0xED, 0xC5, 0xC2, 0x28, 0xCA, 0x05, - 0x28, 0xDA, 0x5A, 0x24, 0x29, 0x6A, 0x57, 0x9B, 0x09, 0x20, - 0xF6, 0xEC, 0xB3, 0x1A, 0x52, 0x89, 0xBC, 0x9B, 0xF7, 0x97, - 0x88, 0x28, 0x8E, 0xDF, 0xDD, 0xBB, 0x6E, 0xFD, 0x01, 0x7B, - 0x3F, 0x66, 0x30, 0x94, 0x21, 0xA4, 0xF1, 0x9C, 0x95, 0x30, - 0x77, 0x94, 0xA4, 0x9A, 0x95, 0xD1, 0x3A, 0xBB, 0xDD, 0x95, - 0xC3, 0xAB, 0xBF, 0x6E, 0xBA, 0x2B, 0x7D, 0x20, 0xE9, 0xA9, - 0xC7, 0x89, 0x4B, 0xAD, 0xF7, 0x83, 0x2D, 0xC6, 0xB7, 0x62, - 0x52, 0x05, 0xCE, 0xF6, 0xCB, 0xD7, 0x14, 0x5A, 0xEF, 0x0F, - 0xA6, 0x61, 0x65, 0x7C, 0x07, 0x17, 0xC2, 0x45, 0x07, 0x7E, - 0xA4, 0x82, 0xE6, 0xBC, 0x25, 0x86, 0xC4, 0x46, 0x73, 0x2B, - 0xA2, 0xB7, 0xDB, 0xCE, 0x96, 0x2F, 0x30, 0xD0, 0x54, 0x56, - 0x80, 0x26, 0xBD, 0xDF, 0xC9, 0xDE, 0x4D, 0x9D, 0xA3, 0x26, - 0xE9, 0x1E, 0x3A, 0xA4, 0x4B, 0x6D, 0x01, 0xC4, 0xA9, 0x12, - 0xDC, 0x14, 0x24, 0x66, 0x02, 0x12, 0x42, 0x29, 0xE4, 0xD3, - 0x87, 0x00, 0x35, 0x8D, 0xC1, 0x53, 0xED, 0x76, 0xD9, 0x26, - 0xB9, 0x11, 0x4A, 0x1C, 0x1A, 0x4A, 0x89, 0xC4, 0xB1, 0xED, - 0x38, 0x2E, 0x71, 0x62, 0xC4, 0x74, 0xAB, 0x3A, 0xB4, 0xFA, - 0xD0, 0xF3, 0x64, 0x1E, 0xAD, 0x2B, 0x41, 0xA7, 0xA3, 0x11, - 0x0B, 0x87, 0x0C, 0xA8, 0xAE, 0xF1, 0xFB, 0x1A, 0xDC, 0x38, - 0x12, 0xE7, 0x11, 0xC0, 0xD2, 0x9F, 0x82, 0xD0, 0xF3, 0xA1, - 0x64, 0x04, 0xA0, 0x21, 0x03, 0x24, 0xA1, 0x3D, 0x00, 0x76, - 0x0C, 0x42, 0xE7, 0x12, 0x6A, 0x55, 0xC2, 0xD2, 0xD2, 0x3B, - 0x76, 0x06, 0x30, 0x51, 0xA1, 0x65, 0xAF, 0xB6, 0xC7, 0x96, - 0xDF, 0x7A, 0xE7, 0x8E, 0x84, 0xBE, 0x5A, 0x4E, 0x5C, 0x98, - 0xFF, 0x00, 0xE9, 0x76, 0xFF, 0x00, 0x4F, 0xE4, 0xC6, 0x2F, - 0x3F, 0xA6, 0x28, 0xFB, 0x45, 0xA3, 0x9A, 0x1F, 0xE6, 0xB7, - 0x4F, 0xEA, 0x1C, 0x62, 0xCB, 0xF4, 0x82, 0x16, 0x7F, 0x19, - 0x53, 0x5B, 0xBF, 0xAF, 0x86, 0x51, 0xA1, 0x5C, 0x85, 0xE2, - 0x55, 0xA2, 0x33, 0xB6, 0x7F, 0xB8, 0xB1, 0xF5, 0xC6, 0x20, - 0x9F, 0xC2, 0xA4, 0x8F, 0x34, 0xCB, 0xBE, 0xBA, 0xF0, 0x35, - 0xAA, 0x96, 0x64, 0xC5, 0xF0, 0xD1, 0xFE, 0x65, 0x2B, 0xFF, - 0x00, 0x32, 0xF0, 0x36, 0xF5, 0xFA, 0x48, 0x8D, 0xB7, 0xF5, - 0x10, 0x2D, 0xCD, 0xFE, 0x47, 0x3F, 0xFA, 0xEB, 0xFF, 0x00, - 0x76, 0x28, 0x4E, 0xCD, 0x7D, 0x2D, 0xB7, 0xFF, 0x00, 0x4E, - 0xCF, 0xE5, 0x08, 0xAC, 0x6F, 0xEC, 0x52, 0x7E, 0xAE, 0x33, - 0xD0, 0x82, 0x93, 0xF5, 0x9A, 0x95, 0x71, 0xA2, 0x74, 0xBC, - 0xC7, 0x97, 0x97, 0x0F, 0xE3, 0x63, 0x28, 0x6F, 0xBD, 0x7F, - 0xFF, 0xD9 -}; - -struct fsdata_file const file_img_logo_lwip_qp_jpg[] = { - { - file_img_footer_jpg, - data_img_logo_lwip_qp_jpg, - data_img_logo_lwip_qp_jpg + 22, - sizeof(data_img_logo_lwip_qp_jpg) - 22 - } -}; - -/* /img/logo_ql.jpg */ -static unsigned char const data_img_logo_ql_jpg[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, - 0x71, 0x6C, 0x2E, 0x6A, 0x70, 0x67, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, - 0x67, 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, - 0x00, 0x01, 0x02, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, - 0xFF, 0xEC, 0x00, 0x11, 0x44, 0x75, 0x63, 0x6B, 0x79, 0x00, - 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xFF, - 0xEE, 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x00, 0x64, - 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xDB, 0x00, 0x84, 0x00, - 0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x06, - 0x09, 0x06, 0x05, 0x06, 0x09, 0x0B, 0x08, 0x06, 0x06, 0x08, - 0x0B, 0x0C, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0C, 0x10, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0x0C, 0x0E, 0x0F, 0x10, - 0x0F, 0x0E, 0x0C, 0x13, 0x13, 0x14, 0x14, 0x13, 0x13, 0x1C, - 0x1B, 0x1B, 0x1B, 0x1C, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x01, 0x07, 0x07, 0x07, 0x0D, 0x0C, - 0x0D, 0x18, 0x10, 0x10, 0x18, 0x1A, 0x15, 0x11, 0x15, 0x1A, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, - 0xC0, 0x00, 0x11, 0x08, 0x00, 0x35, 0x01, 0x2C, 0x03, 0x01, - 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, - 0x00, 0xC1, 0x00, 0x00, 0x01, 0x04, 0x03, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x04, 0x06, 0x07, 0x01, 0x02, 0x03, 0x08, 0x01, 0x00, - 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x02, 0x04, - 0x05, 0x06, 0x07, 0x10, 0x00, 0x01, 0x03, 0x02, 0x03, 0x05, - 0x03, 0x0A, 0x01, 0x07, 0x06, 0x0A, 0x0B, 0x01, 0x00, 0x00, - 0x02, 0x01, 0x03, 0x04, 0x11, 0x05, 0x00, 0x12, 0x06, 0x21, - 0x13, 0x14, 0x15, 0x07, 0x31, 0x41, 0x22, 0x51, 0x61, 0x32, - 0x23, 0x94, 0xD4, 0x55, 0x16, 0x17, 0x08, 0x33, 0x71, 0x81, - 0xA1, 0x42, 0x53, 0xA3, 0x24, 0x91, 0xD1, 0x52, 0xB3, 0x34, - 0x35, 0xC1, 0x62, 0x72, 0x43, 0x74, 0x75, 0x26, 0x36, 0x66, - 0x27, 0xE1, 0x92, 0x63, 0x73, 0xC3, 0x54, 0x64, 0xA4, 0xB4, - 0x25, 0x65, 0x37, 0x11, 0x00, 0x01, 0x03, 0x02, 0x02, 0x07, - 0x06, 0x02, 0x08, 0x05, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x11, 0x02, 0x03, 0x04, 0x21, 0x12, 0x31, 0x41, - 0x51, 0x91, 0xE1, 0x13, 0x05, 0x61, 0x71, 0x81, 0x22, 0x32, - 0x14, 0xA1, 0x06, 0xF0, 0xB1, 0xC1, 0xD1, 0xF1, 0x42, 0x72, - 0x23, 0x62, 0x92, 0x33, 0x24, 0x34, 0xB2, 0xC2, 0xE2, 0x15, - 0x52, 0x82, 0xA2, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, - 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xF5, 0x24, 0xA9, - 0x4C, 0xC5, 0x8E, 0x6F, 0xBC, 0xB4, 0x6D, 0xB4, 0xAA, 0xAF, - 0xF8, 0x13, 0x13, 0x10, 0xE5, 0x90, 0x98, 0x32, 0xE5, 0xDA, - 0x52, 0x23, 0xCA, 0xE0, 0x42, 0x68, 0xF6, 0xB6, 0xDE, 0x54, - 0x33, 0x54, 0xEE, 0x52, 0xAE, 0xC4, 0xC3, 0x08, 0x88, 0xED, - 0x50, 0xB7, 0x38, 0xD7, 0x44, 0xDA, 0x97, 0x05, 0xA7, 0x95, - 0x19, 0x05, 0xC4, 0x03, 0x1D, 0x88, 0x5C, 0xB7, 0x77, 0x1F, - 0x8A, 0x7E, 0xE0, 0x3F, 0x9F, 0x13, 0x86, 0xC4, 0x25, 0xBB, - 0xB8, 0xFC, 0x53, 0xF7, 0x01, 0xFC, 0xF8, 0x30, 0xD8, 0x85, - 0x91, 0x66, 0xE8, 0x5B, 0x06, 0xE6, 0xAB, 0xF9, 0x18, 0x05, - 0xC0, 0xF1, 0xD9, 0xF1, 0x42, 0xC3, 0xB0, 0xEF, 0x68, 0x0A, - 0xA3, 0x76, 0x40, 0x2E, 0xE4, 0x26, 0x1B, 0xA7, 0xE7, 0xA2, - 0xE0, 0xCF, 0x0D, 0x9F, 0x15, 0x22, 0x24, 0xA6, 0x96, 0xED, - 0x43, 0x31, 0xAB, 0xB0, 0x59, 0x6F, 0x4D, 0x83, 0x72, 0xDF, - 0x15, 0x38, 0x32, 0x9A, 0xAE, 0xE5, 0xF1, 0x1F, 0x49, 0x12, - 0xBE, 0x89, 0x27, 0x93, 0x16, 0x95, 0x20, 0x63, 0x9A, 0x3A, - 0x14, 0x76, 0x15, 0x21, 0xC2, 0x14, 0xA0, 0xFA, 0x9B, 0x54, - 0xDA, 0xB4, 0xF4, 0x13, 0x97, 0x70, 0x78, 0x1A, 0x00, 0x05, - 0x35, 0x53, 0x24, 0x11, 0x41, 0x1E, 0xD2, 0x25, 0xEE, 0x4C, - 0x3A, 0x8D, 0x19, 0x4C, 0xB0, 0x54, 0x9C, 0xC4, 0x74, 0xAA, - 0x4E, 0x57, 0xDD, 0x8D, 0x95, 0x27, 0x2A, 0xC2, 0x60, 0xE4, - 0x5B, 0xC0, 0xD0, 0x1D, 0x92, 0x51, 0xDC, 0x16, 0x69, 0x5F, - 0xDA, 0x21, 0x2A, 0xA7, 0xE7, 0x1C, 0x6C, 0x8D, 0xA5, 0x3D, - 0x06, 0x58, 0xA4, 0x1A, 0xD3, 0xD2, 0x02, 0x3F, 0x70, 0xFB, - 0x8C, 0xB3, 0x15, 0xE7, 0x4F, 0xDB, 0xAC, 0xA8, 0xC4, 0xE5, - 0xBD, 0xCD, 0x8F, 0x14, 0xB6, 0x95, 0x5A, 0x07, 0x8C, 0x40, - 0x89, 0x55, 0x36, 0x55, 0x33, 0x6C, 0xC1, 0x2B, 0x0C, 0x90, - 0x32, 0x9F, 0x87, 0x6A, 0x05, 0xC6, 0x69, 0x01, 0x15, 0x72, - 0xE3, 0x9A, 0xB5, 0x25, 0x81, 0x09, 0x60, 0x42, 0x58, 0x10, - 0x96, 0x04, 0x25, 0x81, 0x09, 0x60, 0x42, 0x13, 0x0B, 0x55, - 0x58, 0xA6, 0xDE, 0x5D, 0xB3, 0x46, 0x94, 0x8E, 0x5C, 0x59, - 0x67, 0x89, 0x71, 0x84, 0x12, 0x4A, 0x35, 0x9F, 0x77, 0x9B, - 0x32, 0xA6, 0x5F, 0x4B, 0x67, 0x6E, 0x1B, 0x2A, 0x32, 0x8C, - 0x73, 0x1D, 0x05, 0x50, 0x4C, 0x12, 0xC1, 0x16, 0xC2, 0x95, - 0xD2, 0xC0, 0x84, 0xB0, 0x21, 0x2C, 0x08, 0x4B, 0x02, 0x15, - 0x55, 0x7E, 0xEA, 0x55, 0xD0, 0x9D, 0x59, 0x51, 0xA5, 0x15, - 0xBA, 0xD2, 0x69, 0x34, 0xA0, 0x2B, 0x11, 0x9A, 0x94, 0xFB, - 0xCD, 0x5B, 0x4F, 0x77, 0x26, 0x43, 0x8A, 0xFB, 0xAC, 0x80, - 0x02, 0x1D, 0x50, 0x1B, 0x04, 0x53, 0x24, 0xDB, 0x5D, 0xB4, - 0xC6, 0xFA, 0x76, 0xBA, 0x99, 0xCE, 0x0E, 0xEF, 0xAF, 0xBB, - 0xEB, 0x59, 0xE5, 0x57, 0xE9, 0xDC, 0x8B, 0xC1, 0xD7, 0xF7, - 0x16, 0x6D, 0x17, 0x71, 0xBB, 0xB6, 0x0B, 0x73, 0xB3, 0x84, - 0x59, 0x1B, 0xF6, 0x40, 0x9B, 0x6A, 0x4C, 0x49, 0xAB, 0xEA, - 0x1F, 0x16, 0x9C, 0x55, 0x26, 0xCB, 0x61, 0x09, 0xB6, 0xAA, - 0xB9, 0x49, 0x3B, 0x55, 0x31, 0x9A, 0xE6, 0x11, 0x84, 0x44, - 0xA3, 0xA0, 0xFC, 0x08, 0x5D, 0x0E, 0x97, 0x40, 0xDC, 0x57, - 0x14, 0x8E, 0x93, 0xF7, 0x12, 0xB9, 0x74, 0x8F, 0xA8, 0xD3, - 0x75, 0xAB, 0xDA, 0x8C, 0x9F, 0x11, 0x18, 0xF6, 0xB9, 0xA3, - 0x16, 0x25, 0x07, 0x29, 0x28, 0xE4, 0xAA, 0xA9, 0x6D, 0x5C, - 0x66, 0x84, 0x89, 0x0E, 0xB7, 0xF5, 0x8B, 0x4A, 0x76, 0xF5, - 0x05, 0x38, 0x3B, 0x81, 0xE6, 0xFD, 0x5D, 0x9D, 0x89, 0xD6, - 0xB3, 0xEA, 0x4B, 0x96, 0x99, 0xAC, 0xD9, 0xEC, 0x76, 0xE7, - 0xAF, 0x57, 0xD9, 0x2A, 0x62, 0xC4, 0x28, 0xC8, 0x95, 0xF5, - 0x7E, 0x99, 0x99, 0x92, 0x88, 0x36, 0x01, 0x5A, 0x29, 0x12, - 0xF6, 0xE0, 0x33, 0xC5, 0x82, 0x8B, 0x7E, 0x9F, 0x11, 0x4F, - 0x9B, 0x58, 0xE5, 0x87, 0xD6, 0xA3, 0xAD, 0x75, 0x83, 0x53, - 0x58, 0xEE, 0x2D, 0x33, 0xAE, 0x2C, 0x0E, 0x59, 0xE1, 0xBA, - 0x42, 0x25, 0x25, 0x48, 0x1C, 0x10, 0x42, 0x5A, 0x6F, 0x11, - 0xC6, 0x88, 0xDB, 0x31, 0x15, 0x54, 0xCC, 0x9B, 0x09, 0x3B, - 0x71, 0x4E, 0x61, 0x05, 0x8A, 0xE9, 0xC3, 0xA2, 0xD0, 0xB9, - 0xB7, 0x95, 0x4B, 0x79, 0x9C, 0xF0, 0xFC, 0xA7, 0x5F, 0xD3, - 0x52, 0xB6, 0xD1, 0x50, 0x91, 0x08, 0x56, 0xA8, 0xBB, 0x51, - 0x53, 0xB1, 0x53, 0x0E, 0x5E, 0x59, 0x2C, 0x08, 0x55, 0x8F, - 0x56, 0x3A, 0x95, 0x23, 0x49, 0x49, 0x26, 0x91, 0x4C, 0x1A, - 0xE1, 0x81, 0xFD, 0xE0, 0x65, 0xD8, 0xAA, 0xE1, 0x0A, 0xFA, - 0x48, 0xBD, 0xC3, 0x84, 0xD4, 0x99, 0x05, 0x97, 0xAB, 0xE8, - 0x5D, 0x22, 0x9D, 0xC5, 0x23, 0x52, 0x64, 0x34, 0x49, 0x77, - 0xD8, 0x00, 0x2A, 0x21, 0x1B, 0xAA, 0xDD, 0x5C, 0xD5, 0x96, - 0xC4, 0xB9, 0x69, 0x4D, 0x21, 0x26, 0x45, 0xA9, 0x11, 0x72, - 0xCD, 0x71, 0xF6, 0xE3, 0x6F, 0x72, 0xF8, 0x49, 0x59, 0x12, - 0x51, 0x23, 0xDB, 0xDE, 0x95, 0xC4, 0xF9, 0x8A, 0xCC, 0xD6, - 0x54, 0x66, 0xD8, 0xCF, 0xE9, 0xE3, 0xF6, 0x2C, 0x68, 0x2E, - 0xBE, 0x5C, 0x86, 0xFE, 0xCD, 0xA3, 0x54, 0x32, 0xE4, 0x76, - 0x5F, 0x7D, 0x21, 0xBA, 0x92, 0x47, 0x23, 0xF1, 0x24, 0xA9, - 0x65, 0x41, 0x72, 0xA8, 0x39, 0x81, 0x4B, 0x62, 0xE6, 0xDA, - 0x9D, 0xB8, 0xA4, 0x6A, 0x11, 0x26, 0x2B, 0xAB, 0xD4, 0x3A, - 0x25, 0xBD, 0x5B, 0x3F, 0x73, 0x6F, 0x81, 0x1A, 0x46, 0xDE, - 0x3D, 0xD8, 0x15, 0x7E, 0x91, 0x08, 0xA2, 0xA9, 0x2A, 0x22, - 0x27, 0x6A, 0xAE, 0xC4, 0xC6, 0x85, 0xE2, 0x40, 0x74, 0x80, - 0xC0, 0xC7, 0x30, 0x12, 0x10, 0xAF, 0x62, 0xA2, 0xD5, 0x30, - 0x20, 0x82, 0x34, 0xAC, 0xE0, 0x50, 0x83, 0xEA, 0x93, 0x41, - 0xB7, 0x35, 0x9B, 0xD1, 0x29, 0x2C, 0x0A, 0xA7, 0x95, 0x14, - 0xD1, 0x30, 0xEA, 0x3A, 0x7C, 0x14, 0x14, 0xDA, 0x6D, 0xCC, - 0xD6, 0xE0, 0x51, 0x5A, 0xF1, 0x3A, 0xA7, 0x90, 0x01, 0x3C, - 0xB8, 0xB4, 0x61, 0x83, 0xA5, 0x99, 0x62, 0x9E, 0xAD, 0xBE, - 0xE4, 0x2D, 0xE6, 0x6E, 0x42, 0x23, 0xBF, 0xD0, 0xA2, 0xA0, - 0xFE, 0x4A, 0xFF, 0x00, 0xD1, 0x8A, 0x67, 0x8E, 0xC5, 0x6C, - 0xA5, 0x09, 0x99, 0x78, 0xB8, 0xC3, 0x8A, 0x92, 0x67, 0xC7, - 0x05, 0x61, 0x4D, 0x5B, 0xCC, 0x54, 0x42, 0x42, 0x45, 0x54, - 0xA7, 0x85, 0x51, 0x7F, 0x55, 0x70, 0xE8, 0xD3, 0x04, 0xB0, - 0x2A, 0x86, 0x64, 0x69, 0x5B, 0xC9, 0xBC, 0xC4, 0x8E, 0xB1, - 0x51, 0xB6, 0x90, 0x8E, 0x5B, 0x40, 0xE8, 0x67, 0x25, 0x24, - 0x4D, 0xE6, 0xC4, 0x44, 0x4D, 0x98, 0xCD, 0x52, 0x64, 0x16, - 0x5D, 0x4B, 0x4B, 0x3E, 0x6C, 0x33, 0xEA, 0x58, 0xB9, 0xDE, - 0x26, 0xC0, 0x30, 0x6A, 0x51, 0x23, 0x64, 0x63, 0x98, 0x40, - 0x15, 0x29, 0x4A, 0xD3, 0xBB, 0x0A, 0x32, 0x2B, 0x55, 0xBD, - 0xAC, 0x2A, 0x07, 0x86, 0xA4, 0x28, 0xF5, 0x38, 0xA9, 0x51, - 0x0F, 0x14, 0xCC, 0xB6, 0xFB, 0x06, 0x0B, 0x8C, 0xDB, 0x98, - 0x4B, 0xB8, 0xE9, 0x95, 0x5D, 0xA4, 0x37, 0x4C, 0x82, 0xBD, - 0xE8, 0x8A, 0xC1, 0x2A, 0xA7, 0xE8, 0xC6, 0xAB, 0x73, 0xE5, - 0x97, 0x72, 0xE2, 0xDF, 0x52, 0xC9, 0x30, 0xAC, 0x3C, 0x2D, - 0x64, 0x5E, 0x55, 0xFB, 0x89, 0xBC, 0xBB, 0x77, 0xD7, 0x6C, - 0xE9, 0x67, 0xDF, 0x56, 0xA0, 0x39, 0x70, 0x83, 0x16, 0x5A, - 0x8A, 0xD3, 0x2B, 0x0E, 0x08, 0x12, 0xAA, 0xFE, 0x77, 0x14, - 0xB1, 0xDB, 0xA5, 0x4C, 0xC6, 0xDB, 0x30, 0xD6, 0xB0, 0x4A, - 0x6F, 0x55, 0x8A, 0xF4, 0xD5, 0xBB, 0x4F, 0xD9, 0x2D, 0xB6, - 0x66, 0xAC, 0xB0, 0xA0, 0xB2, 0xCD, 0xA9, 0xA6, 0xF7, 0x21, - 0x08, 0x40, 0x77, 0x59, 0x29, 0x45, 0x42, 0x15, 0x4A, 0x15, - 0x7B, 0xEB, 0xDB, 0xDF, 0x8E, 0x29, 0x2B, 0x7B, 0x2F, 0x22, - 0xEA, 0xDD, 0x17, 0x07, 0x4B, 0x75, 0xD6, 0xC9, 0x1A, 0xDC, - 0x08, 0xCD, 0xB1, 0xCD, 0x43, 0x0C, 0xA1, 0xB0, 0x35, 0xCA, - 0x02, 0x6E, 0x34, 0xE1, 0x00, 0xD7, 0xB8, 0x48, 0xD4, 0x53, - 0x1D, 0xCA, 0xB5, 0x33, 0x5A, 0x47, 0x6A, 0xE7, 0xC2, 0x2D, - 0x58, 0xAF, 0x47, 0xF5, 0x17, 0xAA, 0x31, 0xB4, 0x7C, 0xEB, - 0x74, 0x15, 0x60, 0x5F, 0x95, 0x71, 0x7A, 0x33, 0x2D, 0x36, - 0x44, 0xA3, 0xB2, 0x43, 0xFB, 0x95, 0x24, 0xA2, 0x2F, 0xA3, - 0x4A, 0xE3, 0x9B, 0x42, 0xDB, 0x3C, 0x0C, 0xC9, 0xC0, 0x2D, - 0x55, 0x2A, 0xB4, 0x80, 0x1A, 0xD1, 0x3E, 0xA2, 0x6B, 0xA8, - 0x9A, 0x32, 0xC2, 0x57, 0x59, 0x20, 0x86, 0x3E, 0x34, 0x00, - 0x25, 0x54, 0x45, 0x21, 0x6C, 0x9C, 0x41, 0xD9, 0xE5, 0xCB, - 0x4C, 0x56, 0xDA, 0xDF, 0x9B, 0x26, 0x53, 0x56, 0xA6, 0x40, - 0xE9, 0x7C, 0xFD, 0x6C, 0x8D, 0xA2, 0x2D, 0xDA, 0xA2, 0xE8, - 0x41, 0x11, 0xA9, 0xD0, 0x99, 0x9A, 0x40, 0xA5, 0xE1, 0x0D, - 0xE3, 0x22, 0xE9, 0x26, 0x65, 0xEE, 0x1C, 0xD8, 0xA4, 0x28, - 0x99, 0x48, 0x88, 0xA9, 0x33, 0x60, 0xE5, 0x57, 0xF1, 0xFE, - 0xE2, 0xD0, 0x95, 0xBB, 0x94, 0x9D, 0x3F, 0x70, 0x8F, 0xA5, - 0x1E, 0x5C, 0xAD, 0x5F, 0x9D, 0x88, 0xF3, 0x71, 0x8B, 0x32, - 0xD0, 0x09, 0x1C, 0xF1, 0x26, 0x55, 0x5E, 0xC5, 0x54, 0x4A, - 0xE3, 0x48, 0xB5, 0x84, 0xB0, 0x12, 0xF3, 0x25, 0x9A, 0xD2, - 0x18, 0x91, 0x82, 0x90, 0x68, 0x3E, 0xB1, 0x44, 0xD5, 0x76, - 0xBD, 0x4F, 0x74, 0x6A, 0x38, 0xB7, 0x0B, 0x4F, 0x1E, 0x51, - 0x74, 0x49, 0x57, 0x7A, 0x28, 0xD2, 0xB8, 0x45, 0xB5, 0x36, - 0x7A, 0x3B, 0x31, 0x4A, 0xD6, 0xA2, 0x33, 0x10, 0x05, 0xC9, - 0x53, 0x0A, 0xAF, 0x13, 0x22, 0x83, 0x97, 0xDC, 0x3D, 0xBE, - 0x4C, 0xD9, 0x96, 0xFB, 0x2D, 0xA6, 0x65, 0xEA, 0x64, 0x24, - 0xDE, 0x48, 0x5B, 0x74, 0x77, 0x64, 0x83, 0x6D, 0xD1, 0x36, - 0xB9, 0x97, 0x2D, 0x36, 0xD7, 0x0C, 0x95, 0x9C, 0x60, 0x5A, - 0x52, 0x65, 0x51, 0x5C, 0xCB, 0x40, 0x4E, 0x74, 0x37, 0x5E, - 0x61, 0x6A, 0xAB, 0x75, 0xF1, 0x63, 0x5B, 0x9D, 0x7A, 0xEB, - 0x66, 0x65, 0x25, 0x37, 0x0E, 0x30, 0x9B, 0x85, 0x25, 0x92, - 0x5A, 0x22, 0xB6, 0xDA, 0x22, 0x9A, 0x12, 0x16, 0xC5, 0x1D, - 0xB8, 0x9B, 0x8B, 0x11, 0x4E, 0x51, 0x19, 0xB0, 0x97, 0xC1, - 0x14, 0xEE, 0x0C, 0x81, 0xC3, 0x10, 0xAA, 0xCE, 0x9C, 0xF5, - 0x06, 0x71, 0x75, 0xB1, 0xD7, 0x6C, 0x96, 0x49, 0x53, 0x1B, - 0xBA, 0x23, 0x50, 0x2E, 0x68, 0x62, 0xE2, 0xAC, 0x16, 0x4E, - 0x4A, 0x2B, 0x8F, 0x1A, 0x0A, 0x2E, 0x44, 0x02, 0x5A, 0x78, - 0xA8, 0x98, 0xD5, 0x7D, 0x08, 0x08, 0x44, 0x13, 0xE6, 0x03, - 0x57, 0xC1, 0x26, 0xDE, 0x52, 0x32, 0x24, 0x0C, 0x15, 0xE1, - 0xA6, 0x7A, 0xA1, 0x16, 0xFF, 0x00, 0xAF, 0xAE, 0x1A, 0x56, - 0x2B, 0x22, 0xA1, 0x6F, 0x86, 0x72, 0x9D, 0x92, 0x8A, 0xB5, - 0x43, 0x09, 0x08, 0xC6, 0xEF, 0x2A, 0xA7, 0x9E, 0xB8, 0xE7, - 0xD7, 0xB6, 0xE5, 0xC0, 0x13, 0xA4, 0xFD, 0x4B, 0x4D, 0x3A, - 0xB9, 0x89, 0x1A, 0x82, 0xE7, 0x7A, 0xEA, 0xAC, 0x6B, 0x7F, - 0x50, 0xED, 0x3A, 0x35, 0xB6, 0x05, 0xD9, 0x37, 0x09, 0x2A, - 0xC3, 0xA6, 0xA4, 0xA8, 0xAD, 0x82, 0x46, 0xDF, 0xE7, 0x44, - 0xA5, 0x17, 0xC9, 0x80, 0x5B, 0x7E, 0xD7, 0x30, 0x9E, 0xE4, - 0x73, 0x7C, 0xF9, 0x42, 0x65, 0xAC, 0x7A, 0xE3, 0x61, 0xD2, - 0xF7, 0xB5, 0xB4, 0xC9, 0x65, 0xC9, 0x33, 0x37, 0xDC, 0x33, - 0x50, 0xE3, 0x01, 0xBB, 0x21, 0xC7, 0x08, 0x10, 0x83, 0x20, - 0x0A, 0x6D, 0xAA, 0x92, 0x26, 0x2F, 0x0B, 0x37, 0x80, 0x99, - 0x2C, 0x0A, 0xA9, 0xAF, 0xE6, 0x60, 0x1D, 0x05, 0x1F, 0xB8, - 0xDB, 0x6C, 0x1B, 0xC3, 0xB1, 0x35, 0x1D, 0xBD, 0xFB, 0x2B, - 0x2C, 0x86, 0x67, 0xDB, 0x9A, 0xCB, 0x91, 0xE4, 0x86, 0x64, - 0xA8, 0x16, 0xEC, 0xF3, 0x67, 0x12, 0xF3, 0x61, 0xA2, 0xC0, - 0x4A, 0x19, 0xA1, 0x27, 0x65, 0x53, 0x70, 0x44, 0x98, 0x84, - 0xDB, 0x50, 0x7D, 0xC9, 0x8D, 0xA4, 0x23, 0xCC, 0x3B, 0x04, - 0xD6, 0xAD, 0xD2, 0x53, 0x79, 0x11, 0xC9, 0x91, 0xDD, 0x8A, - 0x92, 0x59, 0x4A, 0x66, 0x26, 0x1C, 0x3F, 0x0A, 0xAA, 0x0A, - 0xD7, 0x68, 0xE0, 0xA1, 0x63, 0x0A, 0x8E, 0x04, 0xB1, 0x0A, - 0x2A, 0x5C, 0x4A, 0x2D, 0x82, 0x73, 0xF2, 0x38, 0x5C, 0x21, - 0xC4, 0x75, 0x2D, 0x0E, 0xEA, 0x4D, 0x32, 0xFB, 0x32, 0x64, - 0xE9, 0xE7, 0x63, 0x3F, 0x1E, 0x3B, 0xF1, 0x9A, 0xBA, 0x90, - 0xC9, 0x54, 0x70, 0x64, 0x28, 0x78, 0xDA, 0x3D, 0xAC, 0xB8, - 0xDB, 0x95, 0x44, 0xD8, 0xA3, 0x88, 0xF7, 0x5A, 0xC1, 0xCB, - 0x2C, 0x1F, 0x58, 0x2D, 0x87, 0xE2, 0x14, 0xF2, 0xBB, 0x1C, - 0x6A, 0x45, 0xAF, 0x7A, 0x76, 0xEB, 0x07, 0x45, 0x6A, 0x0B, - 0xAD, 0xE9, 0xDD, 0xED, 0xDA, 0x73, 0x10, 0xE3, 0xA8, 0xE7, - 0x47, 0x55, 0xA8, 0xD1, 0x1C, 0x44, 0x64, 0x0D, 0xD4, 0x16, - 0xD1, 0xC7, 0x49, 0x5C, 0x33, 0x70, 0xD0, 0x51, 0x2A, 0xB4, - 0x44, 0xA2, 0x55, 0x70, 0x5D, 0x54, 0x12, 0x8B, 0x0D, 0x01, - 0x77, 0xFE, 0x5C, 0x8B, 0x5E, 0xC0, 0x9D, 0x38, 0xFF, 0x00, - 0xA4, 0xA8, 0xC7, 0xDA, 0xC7, 0xE0, 0x6B, 0x3F, 0xF5, 0xA8, - 0xFF, 0x00, 0x56, 0xB8, 0x45, 0x2D, 0x0B, 0x4F, 0xCC, 0x7F, - 0xE5, 0x4B, 0xBD, 0x43, 0x5E, 0x89, 0x75, 0x9F, 0xD5, 0xE9, - 0xF6, 0x6B, 0x86, 0xA1, 0x7B, 0x4C, 0xC9, 0x88, 0x4F, 0x0C, - 0x79, 0x60, 0xD6, 0xF5, 0x0D, 0x49, 0xD4, 0x71, 0xB4, 0x34, - 0x53, 0x0A, 0x03, 0x80, 0xB9, 0x90, 0xBB, 0x30, 0x90, 0x3C, - 0xD8, 0xAF, 0x4F, 0x5E, 0xBC, 0xE7, 0x69, 0x09, 0x5B, 0x46, - 0x33, 0x88, 0x8F, 0x9E, 0x25, 0x89, 0x76, 0x6D, 0x1F, 0x72, - 0x3F, 0xAE, 0x3A, 0x68, 0xDD, 0xC1, 0x60, 0xDA, 0xF5, 0x3F, - 0x55, 0x1D, 0x26, 0xE6, 0xB8, 0x8D, 0x43, 0x60, 0xA2, 0x02, - 0x01, 0xB8, 0x54, 0x41, 0x1F, 0x03, 0xD4, 0xDA, 0xBE, 0x5C, - 0x34, 0x80, 0xFA, 0x57, 0x02, 0x17, 0x37, 0x26, 0x9C, 0x8C, - 0x29, 0x88, 0x47, 0xF3, 0x37, 0x94, 0x9F, 0xB7, 0xC0, 0x2B, - 0xC8, 0x66, 0x5B, 0x34, 0xF5, 0x9E, 0x2C, 0x69, 0xB2, 0xD3, - 0x2C, 0x36, 0x1B, 0x64, 0x9E, 0x3D, 0x8A, 0x5B, 0xB0, 0x41, - 0xCC, 0xA9, 0xB6, 0x99, 0xA9, 0x5C, 0x30, 0x90, 0x17, 0x0A, - 0x8D, 0xB5, 0x4A, 0xD2, 0xF2, 0x07, 0x75, 0xC9, 0xED, 0x6F, - 0xA5, 0x19, 0xB6, 0x25, 0xCD, 0xEB, 0x8B, 0x61, 0x07, 0xF6, - 0xCB, 0x9A, 0x89, 0xF9, 0x51, 0x12, 0xB8, 0x8C, 0xE1, 0x3C, - 0x74, 0xAB, 0x93, 0x3C, 0x99, 0x0E, 0x65, 0x46, 0xFD, 0xD2, - 0xB0, 0xE4, 0x97, 0x14, 0x19, 0xDA, 0x45, 0x09, 0x95, 0x4A, - 0x77, 0xA6, 0xF9, 0xCC, 0x26, 0xA9, 0x69, 0x05, 0xEA, 0xFE, - 0x5F, 0xA5, 0x2A, 0x9D, 0x3E, 0xA4, 0x63, 0xA4, 0xC8, 0xFD, - 0x51, 0x57, 0xBE, 0x90, 0x3B, 0x69, 0xE9, 0x4B, 0x39, 0x5B, - 0x32, 0x25, 0xBF, 0x82, 0x61, 0x22, 0xA3, 0x74, 0xCA, 0x8D, - 0xA3, 0x62, 0x82, 0x89, 0x4F, 0x27, 0x66, 0x1E, 0x17, 0x89, - 0xAF, 0x09, 0x46, 0x64, 0x4B, 0x09, 0x02, 0xBC, 0xEB, 0xF7, - 0x49, 0x6E, 0x8A, 0xC5, 0xDD, 0x67, 0xC4, 0x44, 0x49, 0xD3, - 0x78, 0x66, 0x11, 0x03, 0xD2, 0x37, 0xC1, 0x57, 0x6E, 0xCE, - 0xD5, 0x40, 0xCA, 0x98, 0x44, 0xC7, 0x9D, 0x7B, 0x2E, 0x99, - 0x74, 0x63, 0xD3, 0x25, 0x03, 0xFF, 0x00, 0x96, 0x1E, 0x2D, - 0xC5, 0x4A, 0xBA, 0xB9, 0xD4, 0x2B, 0xF4, 0x1B, 0xFC, 0x3D, - 0x2A, 0x32, 0x56, 0xD4, 0xE3, 0xE3, 0x15, 0x5D, 0xB9, 0xAB, - 0x5C, 0x46, 0x56, 0x5C, 0x1F, 0x5C, 0xF3, 0x4C, 0xD4, 0x77, - 0x8A, 0x27, 0x54, 0xA5, 0x7B, 0xB1, 0x35, 0x26, 0xC5, 0x8E, - 0x84, 0xAE, 0x8D, 0xD3, 0x63, 0x52, 0xDC, 0xD4, 0xA7, 0x96, - 0x75, 0xB1, 0xF2, 0x92, 0xDF, 0x4C, 0x11, 0x6E, 0x91, 0x68, - 0x9D, 0x63, 0x03, 0x52, 0xCD, 0xBD, 0x4B, 0xD6, 0x0D, 0x5E, - 0xB4, 0xF1, 0x36, 0x8D, 0xC5, 0x66, 0x28, 0x20, 0x24, 0x83, - 0x24, 0xAA, 0x94, 0x86, 0x96, 0xBB, 0x93, 0x6F, 0xC8, 0x2B, - 0x55, 0xF2, 0xA2, 0x6C, 0x5B, 0xC2, 0x23, 0x48, 0x5C, 0xAE, - 0xAF, 0x79, 0x56, 0x60, 0x53, 0xAB, 0x0C, 0x92, 0x8F, 0x63, - 0x7C, 0x75, 0x8F, 0x82, 0xB8, 0x70, 0xC5, 0xC2, 0x40, 0x35, - 0xAA, 0xAA, 0x5A, 0x98, 0x54, 0xFF, 0x00, 0xCE, 0x46, 0xFE, - 0xB5, 0x30, 0xFB, 0x7F, 0x57, 0x81, 0x50, 0x54, 0x6B, 0x4E, - 0x5D, 0xC2, 0x5F, 0x53, 0x2E, 0x90, 0x5C, 0xD8, 0xE4, 0x4D, - 0xF9, 0x02, 0x77, 0x2A, 0x21, 0x88, 0xD5, 0x3F, 0x31, 0x63, - 0x4D, 0x5A, 0x6D, 0x40, 0x1D, 0xAC, 0xB3, 0xC2, 0x4F, 0x50, - 0x85, 0x0C, 0xEB, 0x57, 0x50, 0x9D, 0xB6, 0x6A, 0xD1, 0xB5, - 0xA4, 0xE2, 0x8A, 0x11, 0x58, 0x69, 0xC1, 0x00, 0x32, 0x0F, - 0x1B, 0x95, 0x2C, 0xFB, 0x3B, 0xFB, 0x13, 0x1B, 0x7A, 0x75, - 0xA6, 0x6A, 0x79, 0x99, 0xDD, 0x22, 0xEA, 0xB3, 0x49, 0x9D, - 0x15, 0xD7, 0x1A, 0xCC, 0x64, 0xF4, 0x6A, 0xC9, 0x7F, 0x90, - 0xFA, 0x21, 0x4B, 0x79, 0x84, 0x37, 0xBB, 0x10, 0x89, 0x05, - 0xC1, 0x55, 0xFC, 0xEA, 0x15, 0xC2, 0xAD, 0xAD, 0xDA, 0xE6, - 0x50, 0x1A, 0x9D, 0x5E, 0xAD, 0x47, 0xA4, 0x0A, 0x8D, 0x2D, - 0xD5, 0xFB, 0x6C, 0x9D, 0x3E, 0x33, 0x27, 0x0B, 0xCB, 0x73, - 0x62, 0x2C, 0xC8, 0xD4, 0x52, 0x5A, 0x32, 0xF9, 0xF8, 0x07, - 0xC5, 0xE4, 0xF3, 0x6C, 0xC7, 0x1F, 0xA8, 0x48, 0x0A, 0xE4, - 0x76, 0xAF, 0xA2, 0xFC, 0xB7, 0x6D, 0xCD, 0xE9, 0xE6, 0x40, - 0x7A, 0x73, 0x3E, 0xE7, 0xFA, 0x8A, 0x94, 0x75, 0x9E, 0xFE, - 0xCD, 0xB6, 0xFD, 0x05, 0xA7, 0x1E, 0x46, 0xD4, 0xE2, 0xE6, - 0xA2, 0xFF, 0x00, 0xDE, 0x12, 0x63, 0x35, 0x69, 0x31, 0x56, - 0xF9, 0x56, 0xCC, 0xD5, 0xA1, 0x32, 0x03, 0xF9, 0xFE, 0xC5, - 0x5E, 0x0E, 0xB4, 0x84, 0x85, 0xB6, 0x48, 0xFE, 0x9C, 0x2F, - 0x3A, 0xEF, 0x56, 0xE9, 0xB3, 0x03, 0x42, 0x94, 0x69, 0x0B, - 0xE7, 0x35, 0xB9, 0x58, 0x4C, 0x6B, 0xBA, 0x6A, 0xF2, 0x20, - 0x0A, 0xBD, 0xAB, 0xFC, 0x31, 0xAA, 0xAD, 0x31, 0xBA, 0xD0, - 0xBC, 0x65, 0xDC, 0xBC, 0x1F, 0xCC, 0x14, 0x39, 0x75, 0x62, - 0x3F, 0x87, 0xED, 0x57, 0xD6, 0x21, 0x70, 0xD7, 0x9F, 0x3E, - 0xE5, 0x3A, 0x47, 0x7B, 0xBB, 0x49, 0x0D, 0x63, 0xA7, 0x63, - 0x1C, 0xF7, 0xDA, 0x68, 0x5A, 0xBA, 0xDB, 0x5A, 0x45, 0x57, - 0x8C, 0x1B, 0xF4, 0x1F, 0x64, 0x53, 0x69, 0x10, 0xA7, 0x84, - 0x85, 0x36, 0xD2, 0x94, 0xEF, 0xC7, 0x56, 0xC7, 0xA8, 0x72, - 0xC6, 0x49, 0x07, 0x8A, 0xC7, 0x71, 0x6D, 0x98, 0xE6, 0x1A, - 0x50, 0x5D, 0x27, 0xF7, 0x49, 0x3A, 0x2D, 0xAD, 0x9B, 0x34, - 0xDB, 0x74, 0xEB, 0xAD, 0xF1, 0xA4, 0x46, 0x1A, 0x68, 0x23, - 0xAA, 0xC9, 0x32, 0x14, 0xA2, 0x21, 0xD1, 0x7C, 0x45, 0xE7, - 0xCB, 0x5F, 0x2E, 0xDC, 0x15, 0xA8, 0xD0, 0x27, 0x34, 0x4B, - 0x0D, 0x9F, 0x4F, 0xBD, 0x4D, 0x39, 0xD4, 0x01, 0x8E, 0x2A, - 0x13, 0x7C, 0xBF, 0xEA, 0x3B, 0xBF, 0x59, 0xF4, 0xBF, 0x3D, - 0xB7, 0xAD, 0xB2, 0x5C, 0x7B, 0xCC, 0x14, 0x38, 0x44, 0x48, - 0x66, 0x04, 0xEB, 0xAD, 0x3B, 0xE3, 0x24, 0xD9, 0x9B, 0x29, - 0x25, 0x7C, 0x9D, 0x98, 0xD3, 0x5E, 0x31, 0xF6, 0xC0, 0xC7, - 0x42, 0x55, 0x32, 0x79, 0xA4, 0x15, 0x63, 0x7D, 0xCE, 0x3E, - 0x31, 0x35, 0x96, 0x94, 0x94, 0xFA, 0x2A, 0x30, 0xD9, 0xC7, - 0x7F, 0x3A, 0x27, 0x6A, 0x45, 0x95, 0x9D, 0xD1, 0x4F, 0x3A, - 0x09, 0xA2, 0xE1, 0x56, 0x14, 0xF9, 0x94, 0x27, 0x11, 0xEA, - 0x75, 0x6B, 0x89, 0x65, 0xA9, 0x12, 0x74, 0x23, 0x9F, 0x74, - 0x17, 0x8B, 0x5B, 0xFD, 0x35, 0x69, 0xF6, 0x25, 0xB4, 0xEB, - 0x6E, 0x39, 0x99, 0x85, 0x02, 0x42, 0xCE, 0xAE, 0x02, 0x80, - 0xE5, 0xA2, 0xFF, 0x00, 0x8F, 0x5C, 0x26, 0xC5, 0xE0, 0x64, - 0xE1, 0xBC, 0xA9, 0x97, 0x0D, 0x20, 0x1B, 0x6A, 0x89, 0x75, - 0xFE, 0x3D, 0xD2, 0xD9, 0xA0, 0x34, 0x35, 0xBD, 0xF6, 0xCD, - 0x2D, 0xFC, 0x04, 0x78, 0x92, 0x85, 0x76, 0x7A, 0xE6, 0x1B, - 0x64, 0x95, 0xA3, 0xEE, 0xA9, 0x88, 0x2F, 0xF2, 0x2E, 0x1B, - 0xD3, 0xE2, 0x27, 0x19, 0xC5, 0xFC, 0xC7, 0x42, 0x5D, 0xC9, - 0x31, 0x31, 0x3A, 0x95, 0xE9, 0x26, 0xF5, 0xA4, 0xAF, 0x7A, - 0x15, 0xF3, 0x8E, 0xF3, 0x0E, 0xD9, 0xE6, 0x41, 0x26, 0x85, - 0x8F, 0x08, 0xA2, 0x36, 0x6D, 0xE5, 0x46, 0xC8, 0x17, 0xD0, - 0x51, 0xAD, 0x28, 0xA9, 0xB3, 0x18, 0x23, 0x46, 0x70, 0xA8, - 0x01, 0x18, 0x82, 0xB4, 0x99, 0xC6, 0x51, 0x77, 0xC1, 0x52, - 0x3D, 0x0D, 0x62, 0x24, 0x6D, 0x09, 0xD5, 0x26, 0x22, 0x38, - 0x8E, 0x46, 0x64, 0xDD, 0x6D, 0xB7, 0x11, 0x6A, 0x84, 0x83, - 0x14, 0xD2, 0xB5, 0xC6, 0xEB, 0x82, 0xF7, 0x31, 0xEF, 0x0B, - 0x3D, 0x30, 0xD4, 0x8F, 0x71, 0x52, 0x2F, 0xB4, 0xD6, 0x99, - 0x4B, 0x26, 0xAC, 0x78, 0x45, 0x37, 0xA7, 0x79, 0x20, 0x27, - 0x13, 0xB5, 0x44, 0x19, 0x05, 0x14, 0xAF, 0x91, 0x14, 0xD6, - 0x9F, 0x97, 0x19, 0xFA, 0x97, 0xF5, 0x8A, 0x65, 0xAF, 0xA0, - 0x20, 0xFD, 0x09, 0x8B, 0x1E, 0x37, 0x5D, 0x75, 0x7B, 0x4C, - 0x22, 0x0B, 0x69, 0x09, 0xE5, 0xCA, 0x9D, 0x89, 0xFC, 0x70, - 0xEC, 0xC3, 0xFA, 0x91, 0x78, 0xC3, 0xF4, 0x85, 0x4B, 0x5D, - 0x32, 0xEF, 0x5B, 0xF4, 0x1D, 0xB6, 0x9B, 0xEB, 0x6E, 0xB1, - 0x46, 0x91, 0x11, 0x16, 0x19, 0x29, 0x22, 0x79, 0x56, 0x66, - 0xDC, 0x1D, 0x4F, 0x44, 0x3F, 0x48, 0x45, 0xAF, 0xE6, 0xEF, - 0x4D, 0xFA, 0x49, 0x74, 0x85, 0x6E, 0xEB, 0xFE, 0xA7, 0x66, - 0x7B, 0x83, 0x15, 0xC9, 0x0C, 0xCB, 0x88, 0xDA, 0x38, 0xA8, - 0x29, 0xBE, 0x6E, 0x62, 0x39, 0x96, 0xAB, 0xFD, 0x20, 0x4A, - 0x8F, 0x97, 0x0D, 0xBE, 0xA2, 0x67, 0x4A, 0x13, 0x8E, 0x20, - 0x00, 0xA9, 0x6F, 0x30, 0x27, 0x28, 0x9C, 0x31, 0x4E, 0xAF, - 0x4C, 0x37, 0x3B, 0xEE, 0xAA, 0xC2, 0x31, 0x5C, 0x47, 0x95, - 0xBD, 0xEC, 0xC7, 0xD1, 0xB5, 0x45, 0xDD, 0x83, 0x70, 0x95, - 0xB4, 0x52, 0xF2, 0x54, 0x87, 0x19, 0xEA, 0x49, 0xAD, 0xA3, - 0x13, 0xA5, 0x32, 0x03, 0xF7, 0x49, 0x5A, 0x70, 0xF1, 0xDF, - 0xFB, 0xB2, 0x85, 0xBD, 0x11, 0x3D, 0xD7, 0x16, 0xE0, 0x0A, - 0xED, 0xCA, 0x63, 0x07, 0xC2, 0x5F, 0x95, 0x31, 0x6A, 0xFF, - 0x00, 0xE2, 0xC3, 0xC5, 0x45, 0x3F, 0xEA, 0xC9, 0x34, 0xFB, - 0xA5, 0x83, 0x0D, 0xED, 0x67, 0xA6, 0x8D, 0xD0, 0x12, 0x27, - 0x38, 0x46, 0x8D, 0x16, 0x9E, 0x20, 0x59, 0x67, 0x51, 0x5F, - 0x2A, 0x6D, 0xC5, 0xAD, 0x4F, 0xF6, 0xD3, 0xEF, 0xFB, 0x94, - 0x56, 0xFE, 0xAC, 0x7B, 0x94, 0xCB, 0xEE, 0x9E, 0x24, 0x67, - 0x7A, 0x74, 0xC9, 0x38, 0x23, 0x99, 0x89, 0x75, 0x69, 0x7B, - 0x28, 0xBC, 0x3B, 0xBB, 0x13, 0x14, 0xE9, 0x47, 0xCF, 0x2F, - 0xD2, 0x55, 0xAF, 0x3D, 0x23, 0xBD, 0x4E, 0xBA, 0x4F, 0xFF, - 0x00, 0xF3, 0x0D, 0x27, 0xFE, 0xA9, 0x85, 0xFD, 0x40, 0x63, - 0x9B, 0x3D, 0x25, 0x6A, 0x8E, 0x85, 0xBF, 0x53, 0xBF, 0xDC, - 0x5B, 0xAF, 0xF9, 0x0D, 0xFF, 0x00, 0x5C, 0x18, 0x55, 0x4F, - 0x49, 0x5D, 0xAF, 0x97, 0xFF, 0x00, 0xCD, 0xA7, 0xE3, 0xFE, - 0x92, 0xAB, 0x3F, 0xB5, 0xA0, 0x31, 0x63, 0x59, 0x66, 0x45, - 0x4A, 0xDD, 0x05, 0x53, 0xCF, 0xEA, 0xD7, 0x15, 0xA5, 0xA1, - 0x3F, 0xE6, 0x58, 0x91, 0x75, 0x27, 0xDA, 0xAC, 0x9D, 0x6B, - 0xD2, 0xED, 0x15, 0xAC, 0x89, 0xA7, 0xAF, 0x90, 0x33, 0xCD, - 0x8E, 0x99, 0x58, 0x9E, 0xC1, 0x9B, 0x12, 0x00, 0x6B, 0x5C, - 0xBB, 0xC6, 0xD4, 0x55, 0x47, 0xCC, 0x55, 0x4C, 0x30, 0x80, - 0x57, 0x1A, 0x85, 0xD5, 0x4A, 0x45, 0xE0, 0x48, 0x43, 0x74, - 0xB7, 0x44, 0xBA, 0x7D, 0xA6, 0x6E, 0x41, 0x77, 0x8B, 0x0D, - 0xE9, 0xD7, 0x56, 0x76, 0xB1, 0x36, 0x7B, 0xC7, 0x29, 0xC6, - 0xD5, 0x3B, 0xDB, 0x43, 0x5C, 0x82, 0x5E, 0x74, 0x1A, 0xE2, - 0x04, 0x40, 0x4C, 0xAF, 0x7B, 0x56, 0xB6, 0x13, 0x91, 0x2A, - 0xB9, 0xD2, 0x50, 0x21, 0x75, 0x53, 0xA8, 0x77, 0x65, 0xD4, - 0xE4, 0x72, 0xAC, 0xB6, 0x68, 0xEC, 0xB9, 0x12, 0xD3, 0xBC, - 0x36, 0xDA, 0x75, 0xE9, 0x24, 0x68, 0x4E, 0xB8, 0x80, 0xA2, - 0xA5, 0xBB, 0x46, 0xF2, 0xA2, 0x57, 0x0B, 0xA7, 0xE6, 0xC4, - 0xAF, 0x43, 0xD6, 0xE9, 0xCE, 0xC8, 0x42, 0x94, 0x3C, 0xA0, - 0x8D, 0x3B, 0x50, 0x1F, 0xB8, 0x3E, 0x9D, 0xC2, 0xD2, 0xB0, - 0x19, 0x77, 0x4E, 0x1B, 0xD0, 0xEC, 0xB2, 0x68, 0x52, 0x6D, - 0x88, 0xE9, 0x9B, 0x00, 0xEB, 0x6E, 0x08, 0xA1, 0x02, 0x1A, - 0x92, 0xA6, 0x74, 0x3D, 0xA9, 0xD9, 0xB3, 0x11, 0x38, 0xB4, - 0x82, 0x77, 0x49, 0xBB, 0x9D, 0x5B, 0x4A, 0xC2, 0x72, 0xF3, - 0x44, 0x06, 0xDA, 0xDA, 0xC3, 0xA2, 0xBF, 0x73, 0x33, 0x0E, - 0x1B, 0x81, 0x20, 0x12, 0xA4, 0x10, 0x18, 0xA2, 0x2F, 0x9D, - 0xE3, 0xC5, 0x6B, 0x07, 0x90, 0x0B, 0x77, 0xCB, 0x37, 0x26, - 0x85, 0x95, 0x4A, 0x83, 0x4C, 0x64, 0x7E, 0xA8, 0xAE, 0x56, - 0x28, 0xFD, 0x79, 0xD1, 0x76, 0xD6, 0x23, 0xDA, 0x6C, 0xC1, - 0xA8, 0x2D, 0x32, 0x9B, 0x09, 0x11, 0x24, 0x44, 0x7F, 0x76, - 0x29, 0xBE, 0x14, 0x3A, 0x1B, 0x26, 0x48, 0x40, 0x49, 0x9B, - 0x6D, 0x12, 0x9E, 0x7C, 0x5C, 0x40, 0xC7, 0x42, 0xE5, 0x5D, - 0x75, 0x7B, 0x7B, 0xB3, 0x9A, 0xB4, 0x07, 0x33, 0x68, 0xC3, - 0xEC, 0x28, 0xCE, 0x88, 0xE9, 0x2E, 0xB7, 0xD4, 0x7A, 0xBE, - 0x36, 0xB4, 0xEA, 0x62, 0x37, 0x1D, 0x2D, 0xC4, 0x8E, 0xDA, - 0x6C, 0x0D, 0x10, 0xB8, 0x82, 0xEA, 0x2E, 0x61, 0x71, 0xE5, - 0x15, 0x31, 0xA0, 0xAE, 0xDA, 0x66, 0x55, 0x55, 0xED, 0xA2, - 0x25, 0x16, 0xD1, 0x86, 0xB2, 0xB9, 0x97, 0xBD, 0x48, 0x4E, - 0x02, 0x9D, 0x30, 0xD0, 0x1F, 0x4F, 0x13, 0xF4, 0x0A, 0x61, - 0xD4, 0xA6, 0xFA, 0x57, 0xA9, 0x9F, 0x0B, 0x06, 0xA6, 0x36, - 0xCA, 0x64, 0x63, 0xA3, 0x72, 0x5A, 0x71, 0x1B, 0x95, 0x11, - 0xC3, 0x44, 0x24, 0x50, 0x24, 0xF1, 0xA2, 0x2A, 0x52, 0xBB, - 0x14, 0x7B, 0x2A, 0x98, 0x25, 0x28, 0xE8, 0x2A, 0xD6, 0x5D, - 0x3E, 0xEF, 0x27, 0x36, 0x98, 0x23, 0x58, 0xED, 0x55, 0x6E, - 0x82, 0x7E, 0x6E, 0x9B, 0xEB, 0x7D, 0xB3, 0x4B, 0xD8, 0xAE, - 0xE5, 0x7A, 0xB7, 0xBC, 0x0F, 0x0D, 0xC5, 0xDA, 0xA2, 0xD6, - 0x30, 0xB4, 0x46, 0xDA, 0xBD, 0x97, 0xC3, 0x9C, 0x0D, 0x13, - 0x6F, 0xF3, 0xD3, 0x0B, 0xA7, 0x16, 0x91, 0x6D, 0x0B, 0xBB, - 0xD7, 0x2F, 0x39, 0xB6, 0x54, 0xE3, 0x50, 0x35, 0x51, 0x89, - 0x7D, 0x23, 0xF1, 0x5E, 0x9A, 0xC6, 0x85, 0xE2, 0x14, 0x7F, - 0x5B, 0x7F, 0x74, 0xB1, 0xFE, 0x99, 0x17, 0xFA, 0xD4, 0xC6, - 0x8B, 0x6F, 0x57, 0x81, 0x50, 0x55, 0x44, 0xFE, 0xA9, 0x8F, - 0xA6, 0xBA, 0xC1, 0x2E, 0xE3, 0x2C, 0xB2, 0xC1, 0x39, 0x2F, - 0x47, 0x96, 0x7F, 0xD1, 0x6D, 0xDA, 0x26, 0x7F, 0xC8, 0x24, - 0x88, 0xAB, 0xE6, 0xC7, 0x5A, 0x34, 0x0D, 0x4B, 0x71, 0x11, - 0xA5, 0x97, 0x3C, 0xD4, 0xC9, 0x55, 0xCA, 0x3F, 0xD5, 0xBE, - 0x88, 0xB1, 0xAF, 0xAE, 0x70, 0xB5, 0x05, 0xBA, 0xEC, 0xD4, - 0x12, 0xDC, 0x8B, 0x52, 0xDD, 0x31, 0xDE, 0xB4, 0xE3, 0x02, - 0xAA, 0x60, 0xE8, 0x10, 0x92, 0x78, 0x91, 0x09, 0x7B, 0xE8, - 0xA9, 0x4C, 0x22, 0xC3, 0xA9, 0x1A, 0x11, 0x30, 0x31, 0x74, - 0xDB, 0x8B, 0x51, 0x50, 0x89, 0x02, 0x80, 0x75, 0xC6, 0x35, - 0x8E, 0x2F, 0x42, 0x2C, 0x91, 0x6C, 0x4F, 0x24, 0x8B, 0x4C, - 0x69, 0x91, 0x58, 0x89, 0x21, 0x36, 0xA3, 0x82, 0xD3, 0x6F, - 0x02, 0x9D, 0x7B, 0xF3, 0x10, 0xAA, 0xD7, 0xBF, 0x1A, 0x3A, - 0x69, 0x91, 0xBA, 0x91, 0x9E, 0x12, 0x20, 0xFD, 0x89, 0x77, - 0x40, 0x0A, 0x41, 0xB4, 0x2A, 0xE9, 0x2D, 0xFA, 0x82, 0x24, - 0xAD, 0x1C, 0x77, 0x99, 0xA9, 0x33, 0x8A, 0x89, 0x09, 0xFB, - 0x75, 0x15, 0x57, 0x75, 0x10, 0x9D, 0xF5, 0x4D, 0x2D, 0x44, - 0x68, 0xA3, 0xF9, 0xFF, 0x00, 0x2E, 0x3C, 0xFF, 0x00, 0x58, - 0x23, 0xDD, 0x49, 0xB4, 0x3F, 0xE3, 0xF1, 0x5F, 0x5F, 0xF9, - 0x32, 0x71, 0x3D, 0x20, 0x80, 0x3C, 0xC3, 0x3E, 0x6E, 0xD2, - 0xCE, 0x3F, 0xF9, 0x61, 0xE0, 0xA7, 0x5F, 0x72, 0x9F, 0xEF, - 0x4D, 0xAF, 0xFD, 0x07, 0xFF, 0x00, 0x18, 0xF1, 0x8E, 0xE7, - 0xD4, 0x3B, 0x93, 0x3E, 0x43, 0xFF, 0x00, 0x1A, 0xA7, 0xEB, - 0xFF, 0x00, 0x68, 0x54, 0xF3, 0x7E, 0x9E, 0x12, 0x17, 0xAA, - 0xBA, 0xD0, 0xAD, 0x7E, 0x96, 0x7E, 0x35, 0x8F, 0xFD, 0x76, - 0x3F, 0xFC, 0x52, 0xC7, 0x4A, 0xCB, 0xD3, 0x2E, 0xE5, 0xF2, - 0x6F, 0x9A, 0x7F, 0xC8, 0x8F, 0xE9, 0xFB, 0x4A, 0xF4, 0x96, - 0x25, 0x79, 0xB4, 0xB0, 0x21, 0x6A, 0x8D, 0x36, 0x86, 0xA6, - 0x80, 0x28, 0x6B, 0xDA, 0x54, 0x4A, 0xFF, 0x00, 0x2E, 0x04, - 0x2F, 0x30, 0x6B, 0xCD, 0x1D, 0xAE, 0x2E, 0x1D, 0x7C, 0x83, - 0x3E, 0x26, 0x9D, 0x98, 0x76, 0x68, 0xD7, 0xA8, 0x32, 0x8E, - 0xE8, 0x0D, 0x12, 0xB2, 0xAD, 0x8E, 0xE7, 0x39, 0xE6, 0xA5, - 0x28, 0x39, 0x56, 0xAB, 0x8E, 0xA4, 0xAE, 0x62, 0x68, 0x46, - 0x1A, 0xC7, 0x15, 0x90, 0x52, 0x3C, 0xC3, 0x25, 0x7E, 0xEB, - 0xCE, 0x9E, 0xE9, 0x8D, 0x73, 0x67, 0x4B, 0x55, 0xFE, 0x39, - 0x38, 0xD3, 0x65, 0xBC, 0x8D, 0x21, 0xA2, 0x56, 0xDF, 0x65, - 0xCA, 0x53, 0x3B, 0x66, 0x9D, 0x9B, 0x3B, 0x51, 0x51, 0x51, - 0x7B, 0xD3, 0x1C, 0xE8, 0x54, 0x94, 0x4B, 0x82, 0xB4, 0xCA, - 0x20, 0xE9, 0x50, 0x8D, 0x3B, 0xF6, 0xCF, 0xA0, 0xED, 0x57, - 0x68, 0xB7, 0x29, 0xB2, 0xEE, 0x37, 0xD2, 0x82, 0x48, 0x70, - 0xA2, 0xDC, 0xDF, 0x17, 0x63, 0xB6, 0x62, 0xB5, 0x12, 0xDD, - 0x80, 0x06, 0x6A, 0x79, 0x17, 0x67, 0x9B, 0x0D, 0xA9, 0x75, - 0x39, 0x8C, 0x4A, 0xAC, 0x69, 0x44, 0x68, 0x56, 0x36, 0xA8, - 0xD2, 0xD6, 0x2D, 0x51, 0x65, 0x91, 0x65, 0xBE, 0x44, 0x19, - 0x96, 0xF9, 0x29, 0xE3, 0x68, 0xAA, 0x8A, 0x84, 0x9E, 0x89, - 0x81, 0x25, 0x08, 0x48, 0x7B, 0x89, 0x16, 0xB8, 0x4C, 0x64, - 0x41, 0x70, 0xAE, 0x43, 0xAA, 0xCA, 0xDD, 0xF6, 0xB9, 0xA0, - 0x62, 0xBC, 0x49, 0x22, 0xE3, 0x77, 0x9F, 0x6F, 0xA1, 0x20, - 0x5B, 0x24, 0x4B, 0xA4, 0x71, 0xCC, 0x8A, 0x88, 0xB4, 0x6C, - 0x1B, 0x22, 0xCB, 0xDD, 0x55, 0xFC, 0xB5, 0xC6, 0x83, 0x79, - 0x50, 0x8D, 0x29, 0x62, 0x84, 0x46, 0xA5, 0x25, 0xD2, 0x5D, - 0x15, 0xD1, 0xDA, 0x5B, 0x4D, 0x5E, 0xB4, 0xED, 0xAC, 0xA5, - 0xF0, 0x17, 0xE0, 0x20, 0x9C, 0x4E, 0xBA, 0x24, 0xE2, 0x21, - 0x36, 0xAD, 0x2E, 0xEC, 0x90, 0x07, 0x2F, 0x84, 0xBC, 0x98, - 0x57, 0x3A, 0x59, 0x84, 0xB5, 0x85, 0x6C, 0x81, 0x99, 0x12, - 0xE9, 0xD7, 0x4C, 0xF4, 0xDE, 0x80, 0xB6, 0x4A, 0xB6, 0xD8, - 0x56, 0x41, 0x47, 0x96, 0xFF, 0x00, 0x12, 0xF2, 0xC9, 0x71, - 0x1D, 0x2D, 0xE2, 0x80, 0x86, 0xC5, 0x41, 0x1D, 0x94, 0x04, - 0xC5, 0x67, 0x33, 0x22, 0xE5, 0x4C, 0x62, 0x06, 0x84, 0xD7, - 0x47, 0xF4, 0x8B, 0x4A, 0x69, 0x3D, 0x4F, 0x74, 0xD4, 0x96, - 0xB2, 0x94, 0x57, 0x2B, 0xBA, 0x38, 0x92, 0xF7, 0xEE, 0xA1, - 0xB7, 0x47, 0x5D, 0x47, 0x8B, 0x20, 0xA0, 0x8D, 0x3C, 0x49, - 0xB3, 0x6F, 0x66, 0x2D, 0x52, 0xB4, 0xA7, 0xA5, 0x44, 0x60, - 0x23, 0xA1, 0x63, 0x46, 0x74, 0x8B, 0x4A, 0x69, 0x0D, 0x47, - 0x74, 0xD4, 0x16, 0xA2, 0x94, 0x57, 0x0B, 0xBA, 0x12, 0x4B, - 0xE2, 0x1D, 0x43, 0x0A, 0x1B, 0x9B, 0xD5, 0xC8, 0x28, 0x23, - 0x4F, 0x17, 0x9F, 0x05, 0x4A, 0xD2, 0x9E, 0x94, 0x46, 0x02, - 0x3A, 0x10, 0xDD, 0x79, 0xD0, 0x5D, 0x15, 0xAC, 0x2F, 0x29, - 0x7D, 0x79, 0xC9, 0x96, 0x9B, 0xD2, 0xA2, 0x0B, 0xD3, 0xAD, - 0xAF, 0x23, 0x24, 0xEA, 0x0A, 0x50, 0x77, 0x82, 0x42, 0x62, - 0xAA, 0x88, 0x94, 0xCC, 0x88, 0x8B, 0x8B, 0x53, 0xB9, 0x9C, - 0x30, 0x05, 0x44, 0xA9, 0x46, 0x5A, 0x51, 0x1E, 0x9D, 0xF4, - 0x7F, 0x48, 0x68, 0x47, 0x24, 0xCB, 0xB5, 0xA3, 0xF2, 0xEE, - 0xB3, 0x13, 0x24, 0xAB, 0xAC, 0xE7, 0x37, 0xD2, 0x4C, 0x2A, - 0x8B, 0x93, 0x32, 0x20, 0x88, 0x8D, 0x52, 0xBB, 0x13, 0x6F, - 0x7D, 0x68, 0x98, 0xA5, 0x4A, 0xB2, 0x9E, 0x95, 0x68, 0xC0, - 0x0D, 0x0B, 0x68, 0xDD, 0x23, 0xD2, 0x91, 0xFA, 0x8A, 0xE7, - 0x50, 0x00, 0xA5, 0x2D, 0xF9, 0xCC, 0xC8, 0xA2, 0x4E, 0xA2, - 0xB0, 0x99, 0xD9, 0xDC, 0xAD, 0x1B, 0xCB, 0x5F, 0x47, 0xFC, - 0x6E, 0xDC, 0x4C, 0xAB, 0x48, 0xC4, 0x44, 0xE8, 0x0A, 0x04, - 0x00, 0x2E, 0xB4, 0xD7, 0x3D, 0x1E, 0xD2, 0x5A, 0xD2, 0xFB, - 0x6E, 0xBD, 0xDE, 0x4A, 0x52, 0x4C, 0xB5, 0xA0, 0x0C, 0x61, - 0x61, 0xD4, 0x6D, 0xBF, 0x03, 0x9B, 0xD4, 0xCC, 0x2A, 0x25, - 0x5F, 0x12, 0xF9, 0x70, 0x46, 0xB4, 0x84, 0x72, 0xEA, 0x41, - 0x80, 0x25, 0xD1, 0x1E, 0xA1, 0x74, 0xEE, 0xC1, 0xAF, 0x2C, - 0xAD, 0xD9, 0xEF, 0x84, 0xF8, 0xC3, 0x69, 0xF1, 0x90, 0x3C, - 0x33, 0x88, 0xD9, 0xA9, 0x88, 0x90, 0x25, 0x55, 0x44, 0xB6, - 0x50, 0xD7, 0x11, 0x4E, 0xAC, 0xA0, 0xED, 0xAD, 0x4C, 0xA0, - 0x0E, 0x94, 0x66, 0xC3, 0x66, 0x87, 0x64, 0xB2, 0xC0, 0xB3, - 0xC2, 0xCD, 0xC1, 0xDB, 0x98, 0x6E, 0x2C, 0x7D, 0xE2, 0xE6, - 0x3D, 0xDB, 0x42, 0x80, 0x39, 0x96, 0x89, 0x55, 0xA2, 0x62, - 0x84, 0xB9, 0x56, 0x08, 0x47, 0x52, 0x2D, 0xF7, 0x8B, 0x86, - 0x89, 0xBA, 0xC3, 0xB3, 0x47, 0x49, 0x77, 0x37, 0x5B, 0x0E, - 0x16, 0x3A, 0x90, 0xB6, 0x86, 0x42, 0xE0, 0x95, 0x33, 0x1A, - 0x88, 0xA6, 0xC4, 0x5E, 0xD5, 0xC5, 0x26, 0x1C, 0x32, 0xE8, - 0x74, 0xAB, 0xA8, 0xD0, 0xB8, 0x8D, 0x49, 0x7A, 0x62, 0xFF, - 0x00, 0x51, 0x54, 0x0E, 0x9E, 0xD2, 0x1F, 0x71, 0x96, 0x17, - 0x24, 0x1C, 0x1D, 0x39, 0x14, 0x78, 0x93, 0xCE, 0xE0, 0xF1, - 0xAC, 0x8A, 0x2A, 0xF9, 0x55, 0x05, 0xF4, 0xC2, 0xA3, 0x48, - 0x85, 0xE8, 0xEF, 0x3E, 0x62, 0xA5, 0x70, 0xD9, 0xE1, 0x1C, - 0x34, 0x7D, 0x19, 0x5B, 0xFD, 0x15, 0xB6, 0x75, 0x12, 0x15, - 0x9E, 0xEA, 0x5A, 0xE9, 0xB5, 0x6A, 0xE3, 0x26, 0x72, 0xBB, - 0x19, 0xAD, 0xF0, 0xBE, 0x22, 0xC6, 0xE8, 0x11, 0x10, 0x54, - 0x0D, 0xC4, 0x14, 0xCC, 0x85, 0xB2, 0xB8, 0x6C, 0x03, 0x2F, - 0x3B, 0xD4, 0xAE, 0xE3, 0x5E, 0x60, 0xC4, 0x08, 0x80, 0x19, - 0x80, 0x6F, 0xC7, 0xBD, 0x58, 0x98, 0xB2, 0xE7, 0x2A, 0x2A, - 0xFF, 0x00, 0xD2, 0xDE, 0xA2, 0xE9, 0x5D, 0x6A, 0xFE, 0xA7, - 0xE9, 0xE2, 0x31, 0x3A, 0x24, 0xD5, 0x32, 0x76, 0xD8, 0xEB, - 0xA8, 0xC3, 0xAD, 0x2B, 0x8B, 0x98, 0xDB, 0x12, 0x3F, 0x56, - 0x6D, 0x29, 0x6D, 0x44, 0x55, 0xAA, 0x7E, 0x6A, 0xE1, 0x26, - 0x9B, 0x17, 0x0B, 0xD3, 0xD3, 0xEB, 0xE2, 0xAD, 0x01, 0x46, - 0xE6, 0x39, 0xE2, 0x34, 0x1D, 0x63, 0xC5, 0x0A, 0xEA, 0x17, - 0x4F, 0xBA, 0xFD, 0xAD, 0xAD, 0xD0, 0xC2, 0xE0, 0xDD, 0xB1, - 0x96, 0xCD, 0xCC, 0xD2, 0x20, 0x32, 0xF7, 0x89, 0xB1, 0x6D, - 0x51, 0x43, 0x3B, 0xAB, 0xE1, 0x25, 0x25, 0x55, 0xD8, 0x1B, - 0x12, 0x98, 0x9C, 0x84, 0xE9, 0x59, 0xE1, 0xD4, 0xA8, 0xD3, - 0x84, 0xA1, 0x4E, 0x39, 0x44, 0xB5, 0xE9, 0x3F, 0x62, 0x35, - 0xD7, 0x7E, 0x94, 0xF5, 0x03, 0x5A, 0xCF, 0x8C, 0x3A, 0x7D, - 0x61, 0x0D, 0xBF, 0x84, 0x6D, 0x99, 0x2B, 0x25, 0xD2, 0x07, - 0x37, 0x80, 0xE1, 0x95, 0x05, 0x10, 0x0B, 0x65, 0x09, 0x36, - 0xD7, 0x13, 0x28, 0x39, 0x75, 0x16, 0x5D, 0x5C, 0x51, 0xB6, - 0x95, 0x16, 0xF5, 0x49, 0xC9, 0xEC, 0xC3, 0xEE, 0x57, 0x25, - 0x96, 0x23, 0xB0, 0xAC, 0xD0, 0x21, 0xBD, 0x45, 0x76, 0x34, - 0x76, 0x99, 0x71, 0x47, 0x6A, 0x66, 0x6C, 0x10, 0x56, 0x8B, - 0xE4, 0xAA, 0x61, 0x8B, 0x85, 0x22, 0xE5, 0x3C, 0xC0, 0xA1, - 0x44, 0x75, 0xA7, 0x49, 0xF4, 0x16, 0xB3, 0x75, 0xB9, 0x17, - 0xFB, 0x58, 0xBF, 0x31, 0xA1, 0xCA, 0x13, 0x1B, 0x33, 0x61, - 0xF4, 0x14, 0xEC, 0x15, 0x71, 0xA2, 0x15, 0x24, 0x4E, 0xE4, - 0x2A, 0xE2, 0x08, 0x05, 0x3E, 0x95, 0xCD, 0x48, 0x7A, 0x4A, - 0xEB, 0xA2, 0x7A, 0x63, 0xA2, 0x34, 0x50, 0xBD, 0xF2, 0xED, - 0xB0, 0x22, 0xBD, 0x21, 0x32, 0xBF, 0x28, 0x88, 0xDD, 0x7C, - 0xC5, 0x16, 0xB9, 0x55, 0xC7, 0x14, 0x8B, 0x2D, 0x7F, 0x55, - 0x36, 0x60, 0x01, 0x95, 0x6A, 0xD6, 0x9C, 0xFD, 0x45, 0x4A, - 0x71, 0x29, 0x4A, 0x3B, 0xAE, 0x8B, 0x2D, 0x9D, 0x85, 0xFF, - 0x00, 0xD6, 0xC5, 0x4F, 0xDF, 0x0E, 0x34, 0x5B, 0x7A, 0xBC, - 0x0A, 0x82, 0xBC, 0xD5, 0xD5, 0xEB, 0x90, 0xB5, 0xAC, 0x6F, - 0x41, 0x4A, 0xAA, 0x4A, 0x71, 0x3F, 0x4E, 0x3D, 0x1F, 0x4F, - 0x87, 0xED, 0xC7, 0xB9, 0x71, 0xEE, 0x4F, 0x98, 0xAA, 0xCA, - 0x46, 0xA2, 0xBC, 0x14, 0x52, 0x82, 0x13, 0xA4, 0x84, 0x05, - 0xAA, 0x2C, 0x34, 0x79, 0xC4, 0x65, 0x51, 0x7F, 0xEC, 0xD0, - 0xB2, 0x7E, 0x8C, 0x74, 0xF2, 0x40, 0x17, 0x60, 0xFB, 0x56, - 0x5C, 0xD2, 0x66, 0x7C, 0x15, 0xA1, 0xAC, 0xF5, 0xB6, 0x97, - 0x95, 0xD0, 0x2D, 0x33, 0xA6, 0xA3, 0x5C, 0x1B, 0x7A, 0xF7, - 0x19, 0xC6, 0x1C, 0x91, 0x08, 0x33, 0x29, 0x36, 0x20, 0x8E, - 0xA1, 0x67, 0x54, 0x4C, 0xA8, 0xA9, 0x9D, 0x36, 0x56, 0xB8, - 0xE5, 0x5B, 0xD2, 0x98, 0xBB, 0x9C, 0xC8, 0xF2, 0x97, 0xC7, - 0x72, 0xDD, 0x56, 0x60, 0xD1, 0x01, 0xF1, 0x42, 0x9E, 0x0B, - 0xA5, 0xB1, 0x74, 0x8B, 0xF7, 0x9B, 0x8A, 0x4D, 0x64, 0xE1, - 0x44, 0x95, 0x11, 0x53, 0x32, 0xF0, 0xF1, 0x15, 0xC5, 0x50, - 0x67, 0x6A, 0x27, 0xA0, 0x88, 0xBD, 0x98, 0xF2, 0xBD, 0x5C, - 0x83, 0x73, 0x22, 0x34, 0x3F, 0xE2, 0xBE, 0xC5, 0xF2, 0x5C, - 0xE2, 0x7A, 0x51, 0x84, 0x47, 0x9F, 0xCC, 0x0F, 0x69, 0x23, - 0x0F, 0x81, 0x03, 0xC1, 0x5E, 0x9A, 0x92, 0x2F, 0x49, 0xFA, - 0x87, 0x25, 0x99, 0x4E, 0x5E, 0x44, 0xE5, 0xB2, 0xD6, 0xE5, - 0x9E, 0x1E, 0x40, 0x34, 0x79, 0x73, 0x29, 0x6D, 0x69, 0xD1, - 0xAF, 0x6A, 0xF9, 0x30, 0x99, 0x46, 0x13, 0x2E, 0xEB, 0xCE, - 0xD8, 0xDE, 0xF5, 0x2E, 0x97, 0x13, 0x11, 0x4F, 0xCA, 0x4B, - 0x97, 0x89, 0x3F, 0x10, 0xA0, 0x9A, 0x9B, 0xA3, 0x16, 0x6B, - 0x6C, 0x19, 0x53, 0xA0, 0x5D, 0x9F, 0x21, 0x8C, 0xD1, 0xBC, - 0x8D, 0x3C, 0xD0, 0x16, 0x6C, 0x82, 0xA5, 0x4C, 0xE0, 0xA3, - 0xDB, 0x4F, 0x26, 0x28, 0x6D, 0xD8, 0x3B, 0xAE, 0x95, 0x0F, - 0x9C, 0xEA, 0x56, 0x9C, 0x61, 0x3A, 0x71, 0xF3, 0x10, 0x1C, - 0x13, 0xAF, 0xB0, 0xBA, 0x6F, 0xD2, 0x97, 0xB3, 0x4A, 0xB1, - 0x0F, 0xFF, 0x00, 0xB4, 0x2B, 0xFF, 0x00, 0xB5, 0x2C, 0x69, - 0xB3, 0xF4, 0xCB, 0xB9, 0x71, 0x3E, 0x67, 0x93, 0xD7, 0x8F, - 0xE9, 0xFB, 0x4A, 0xF4, 0xC6, 0x25, 0x79, 0xD4, 0x22, 0xFB, - 0x33, 0x51, 0x47, 0x26, 0xB9, 0x4C, 0x48, 0xB2, 0x41, 0x51, - 0x77, 0xAB, 0x25, 0xE7, 0x1A, 0x54, 0x5E, 0xEC, 0xA8, 0x0D, - 0x3B, 0x5C, 0x5E, 0x22, 0x3A, 0xC9, 0xDD, 0xC4, 0x2A, 0x97, - 0xD4, 0x85, 0x73, 0x9D, 0x7B, 0xF0, 0xAB, 0x77, 0xB5, 0x48, - 0xF7, 0x6C, 0x59, 0xA9, 0xED, 0x3B, 0xB8, 0xA8, 0x79, 0x6C, - 0x1B, 0xF8, 0x25, 0xCE, 0x75, 0xEF, 0xC2, 0xAD, 0xDE, 0xD5, - 0x23, 0xDD, 0xB0, 0x35, 0x3D, 0xA7, 0x77, 0x14, 0x3C, 0xB6, - 0x0D, 0xFC, 0x12, 0xE7, 0x3A, 0xF7, 0xE1, 0x56, 0xEF, 0x6A, - 0x91, 0xEE, 0xD8, 0x1A, 0x9E, 0xD3, 0xBB, 0x8A, 0x1E, 0x5B, - 0x06, 0xFE, 0x09, 0x73, 0x9D, 0x7B, 0xF0, 0xAB, 0x77, 0xB5, - 0x48, 0xF7, 0x6C, 0x0D, 0x4F, 0x69, 0xDD, 0xC5, 0x0F, 0x2D, - 0x83, 0x7F, 0x04, 0xB9, 0xCE, 0xBD, 0xF8, 0x55, 0xBB, 0xDA, - 0xA4, 0x7B, 0xB6, 0x06, 0xA7, 0xB4, 0xEE, 0xE2, 0x87, 0x96, - 0xC1, 0xBF, 0x82, 0xCF, 0x39, 0xD7, 0xDF, 0x0A, 0xB7, 0x7B, - 0x54, 0x8F, 0x76, 0xC0, 0xD4, 0xF6, 0x9D, 0xDC, 0x50, 0xF2, - 0xD8, 0x37, 0xF0, 0x58, 0xE7, 0x3A, 0xFB, 0xE1, 0x56, 0xEF, - 0x6A, 0x91, 0xEE, 0xD8, 0x1A, 0x9E, 0xD3, 0xBB, 0x8A, 0x1E, - 0x5B, 0x06, 0xFE, 0x09, 0x73, 0x9D, 0x7B, 0xF0, 0xAB, 0x77, - 0xB5, 0x48, 0xF7, 0x6C, 0x0D, 0x4F, 0x69, 0xDD, 0xC5, 0x0F, - 0x2D, 0x83, 0x7F, 0x04, 0xB9, 0xCE, 0xBD, 0xF8, 0x55, 0xBB, - 0xDA, 0xA4, 0x7B, 0xB6, 0x06, 0xA7, 0xB4, 0xEE, 0xE2, 0x87, - 0x96, 0xC1, 0xBF, 0x82, 0x5C, 0xE7, 0x5E, 0xFC, 0x2A, 0xDD, - 0xED, 0x52, 0x3D, 0xDB, 0x03, 0x53, 0xDA, 0x77, 0x71, 0x43, - 0xCB, 0x60, 0xDF, 0xC1, 0x2E, 0x73, 0xAF, 0x7E, 0x15, 0x6E, - 0xF6, 0xA9, 0x1E, 0xED, 0x81, 0xA9, 0xED, 0x3B, 0xB8, 0xA1, - 0xE5, 0xB0, 0x6F, 0xE0, 0x97, 0x39, 0xD7, 0xBF, 0x0A, 0xB7, - 0x7B, 0x54, 0x8F, 0x76, 0xC0, 0xD4, 0xF6, 0x9D, 0xDC, 0x50, - 0xF2, 0xD8, 0x37, 0xF0, 0x4B, 0x9C, 0xEB, 0xEF, 0x85, 0x5B, - 0xBD, 0xAA, 0x47, 0xBB, 0x60, 0x6A, 0x7B, 0x4E, 0xEE, 0x28, - 0x79, 0x6C, 0x1B, 0xF8, 0x25, 0xCE, 0x75, 0xEF, 0xC2, 0xAD, - 0xDE, 0xD5, 0x23, 0xDD, 0xB0, 0x35, 0x3D, 0xA7, 0x77, 0x14, - 0x3C, 0xB6, 0x0D, 0xFC, 0x12, 0xE7, 0x3A, 0xF7, 0xE1, 0x56, - 0xEF, 0x6A, 0x91, 0xEE, 0xD8, 0x1A, 0x9E, 0xD3, 0xBB, 0x8A, - 0x1E, 0x5B, 0x06, 0xFE, 0x09, 0x73, 0x9D, 0x7B, 0xF0, 0xAB, - 0x77, 0xB5, 0x48, 0xF7, 0x6C, 0x0D, 0x4F, 0x69, 0xDD, 0xC5, - 0x0F, 0x2D, 0x83, 0x7F, 0x04, 0xB9, 0xCE, 0xBD, 0xF8, 0x55, - 0xBB, 0xDA, 0xA4, 0x7B, 0xB6, 0x06, 0xA7, 0xB4, 0xEE, 0xE2, - 0x87, 0x96, 0xC1, 0xBF, 0x82, 0x5C, 0xE7, 0x5E, 0xFC, 0x2A, - 0xDD, 0xED, 0x52, 0x3D, 0xDB, 0x03, 0x53, 0xDA, 0x77, 0x71, - 0x43, 0xCB, 0x60, 0xDF, 0xC1, 0x2E, 0x73, 0xAF, 0xBE, 0x15, - 0x6E, 0xF6, 0xA9, 0x1E, 0xED, 0x81, 0xA9, 0xED, 0x3B, 0xB8, - 0xA1, 0xE5, 0xB0, 0x6F, 0xE0, 0x97, 0x39, 0xD7, 0xBF, 0x0A, - 0xB7, 0x7B, 0x54, 0x8F, 0x76, 0xC0, 0xD4, 0xF6, 0x9D, 0xDC, - 0x50, 0xF2, 0xD8, 0x37, 0xF0, 0x4B, 0x9C, 0xEB, 0xDF, 0x85, - 0x5B, 0xBD, 0xAA, 0x47, 0xBB, 0x60, 0x6A, 0x7B, 0x4E, 0xEE, - 0x28, 0x79, 0x6C, 0x1B, 0xF8, 0x25, 0xCE, 0x75, 0xEF, 0xC2, - 0xAD, 0xDE, 0xD5, 0x23, 0xDD, 0xB0, 0x35, 0x3D, 0xA7, 0x77, - 0x14, 0x3C, 0xB6, 0x0D, 0xFC, 0x16, 0x79, 0xCE, 0xBE, 0xF8, - 0x55, 0xBB, 0xDA, 0xA4, 0x7B, 0xB6, 0x06, 0xA7, 0xB4, 0xEE, - 0xE2, 0x87, 0x96, 0xC1, 0xBF, 0x82, 0xC7, 0x39, 0xD7, 0xBF, - 0x0A, 0xB7, 0x7B, 0x54, 0x8F, 0x76, 0xC0, 0xD4, 0xF6, 0x9D, - 0xDC, 0x50, 0xF2, 0xD8, 0x37, 0xF0, 0x4B, 0x9C, 0xEB, 0xDF, - 0x85, 0x5B, 0xBD, 0xAA, 0x47, 0xBB, 0x60, 0x6A, 0x7B, 0x4E, - 0xEE, 0x28, 0x79, 0x6C, 0x1B, 0xF8, 0x25, 0xCE, 0x75, 0xEF, - 0xC2, 0xAD, 0xDE, 0xD5, 0x23, 0xDD, 0xB0, 0x35, 0x3D, 0xA7, - 0x77, 0x14, 0x3C, 0xB6, 0x0D, 0xFC, 0x17, 0x78, 0x57, 0x6D, - 0x66, 0x72, 0xDA, 0x09, 0x76, 0xD8, 0x2D, 0xC6, 0x22, 0x44, - 0x78, 0xDA, 0x92, 0xF1, 0x9A, 0x0F, 0x7A, 0x88, 0x93, 0x00, - 0x8A, 0xBF, 0x95, 0x53, 0x10, 0x44, 0x1B, 0x02, 0x77, 0x71, - 0x52, 0x0C, 0xB6, 0x7D, 0x37, 0x29, 0x2D, 0x76, 0x57, 0x0B, - 0x56, 0x51, 0xBE, 0xA0, 0xB5, 0x24, 0xB4, 0xD3, 0x8F, 0xC7, - 0x6D, 0x5D, 0x38, 0x6F, 0x33, 0x28, 0x9B, 0x4E, 0xD5, 0x06, - 0x4D, 0x08, 0xA9, 0xF9, 0xB6, 0xE3, 0x45, 0xB1, 0x02, 0x78, - 0xEB, 0x50, 0x55, 0x09, 0xD4, 0x2D, 0x0B, 0x72, 0xD4, 0x7A, - 0x82, 0x4D, 0xE2, 0xCB, 0xBB, 0x93, 0x6D, 0xB9, 0xAF, 0x14, - 0x12, 0x09, 0xC1, 0x01, 0x6D, 0x49, 0x3C, 0x60, 0xE5, 0x56, - 0xA8, 0x42, 0xBE, 0x6C, 0x74, 0xED, 0xEF, 0x85, 0x38, 0xE5, - 0x96, 0x04, 0x2C, 0x35, 0x6D, 0x8C, 0xA4, 0xE3, 0x5A, 0x80, - 0xCA, 0xD1, 0x7A, 0x4E, 0xD6, 0x4B, 0xCE, 0xB5, 0x06, 0xFD, - 0xD1, 0xF4, 0xA1, 0xDA, 0x59, 0x29, 0x07, 0x5F, 0x26, 0xF4, - 0xF2, 0xB6, 0x98, 0xD3, 0xEF, 0x6A, 0x4F, 0xD3, 0x1F, 0x19, - 0x16, 0x55, 0x8D, 0x98, 0x1A, 0x4A, 0x6C, 0x5A, 0x8F, 0x4D, - 0xDB, 0x52, 0x96, 0x0D, 0x26, 0xDB, 0xAF, 0x27, 0xA3, 0x36, - 0xF4, 0x65, 0x2C, 0xAB, 0xE5, 0x46, 0x03, 0x23, 0x29, 0xFA, - 0x71, 0x61, 0x19, 0xCB, 0xD7, 0x53, 0xC2, 0x38, 0x7C, 0x74, - 0xA7, 0x46, 0x8C, 0x06, 0x81, 0xBD, 0x6E, 0xDF, 0x53, 0x75, - 0x6B, 0xEA, 0x8D, 0xDE, 0xED, 0xF0, 0x2F, 0x51, 0x05, 0x32, - 0xB5, 0x1D, 0xF8, 0x82, 0xCA, 0xB4, 0x1D, 0xC0, 0xCB, 0x8C, - 0x23, 0x64, 0xD8, 0xA7, 0x72, 0x6D, 0xC2, 0x6B, 0x74, 0xFB, - 0x79, 0x8D, 0x87, 0xBD, 0xFE, 0xB5, 0xD0, 0xB5, 0xEA, 0x17, - 0x16, 0xFF, 0x00, 0xD2, 0x99, 0x8F, 0x76, 0x8D, 0xDA, 0x13, - 0xB0, 0xB8, 0x68, 0x0B, 0x9F, 0xE2, 0x45, 0x9F, 0xA7, 0xDF, - 0x5E, 0xF4, 0xFE, 0x36, 0x35, 0x7F, 0x90, 0x5D, 0x44, 0xC7, - 0x26, 0xB7, 0x47, 0x6F, 0x49, 0x05, 0x7A, 0x2B, 0x6F, 0x9C, - 0x2E, 0x63, 0x85, 0x40, 0x27, 0xF0, 0x3F, 0x0C, 0x3E, 0x08, - 0x84, 0x7B, 0x25, 0xEC, 0x59, 0x3E, 0x49, 0x7A, 0x1B, 0x84, - 0x33, 0x15, 0x13, 0x6E, 0x3B, 0xE6, 0x0A, 0xA2, 0x49, 0x45, - 0x12, 0x64, 0xD5, 0x3B, 0x71, 0xCE, 0x9D, 0xBC, 0xE1, 0x81, - 0x5B, 0x0F, 0x5E, 0xB5, 0xAC, 0x5E, 0x70, 0xCB, 0x2E, 0xD0, - 0x0F, 0xC4, 0x29, 0xB7, 0x4B, 0xED, 0x72, 0x9B, 0xD4, 0xB6, - 0x2B, 0x63, 0x61, 0xBC, 0x94, 0xCC, 0x92, 0xB8, 0xCF, 0x11, - 0xDA, 0x8C, 0x34, 0x0D, 0x28, 0x0A, 0x1A, 0xA7, 0x62, 0xAD, - 0x71, 0xA6, 0xDE, 0x06, 0x30, 0x24, 0xEB, 0x5E, 0x73, 0xAA, - 0x5D, 0x8A, 0xF5, 0x5C, 0x68, 0x18, 0x2F, 0x49, 0x62, 0xAB, - 0x9E, 0xA1, 0x3A, 0xCA, 0x73, 0x0C, 0xEB, 0x9D, 0x19, 0x18, - 0xE3, 0xEF, 0x5C, 0x95, 0x26, 0x48, 0x83, 0xCA, 0xE3, 0xA2, - 0x8D, 0xE4, 0x8E, 0x47, 0x5C, 0x80, 0x62, 0x06, 0xAB, 0x4F, - 0xD7, 0x15, 0xA7, 0x76, 0x29, 0x2F, 0x50, 0x5D, 0x8B, 0x3A, - 0x6F, 0x69, 0x5A, 0x4E, 0x70, 0xC9, 0x86, 0x18, 0xB9, 0xD7, - 0x83, 0xA8, 0xE3, 0x9D, 0x54, 0xD5, 0xA3, 0x01, 0x2F, 0x49, - 0x06, 0x17, 0x29, 0x0B, 0xC8, 0xDA, 0x1D, 0x6B, 0x33, 0x9C, - 0x42, 0xA2, 0x92, 0x0A, 0xB9, 0xD9, 0x91, 0x3B, 0x76, 0x6D, - 0xC5, 0x33, 0x9D, 0x3D, 0xAB, 0xA1, 0xFF, 0x00, 0x53, 0x6E, - 0x27, 0x3A, 0x64, 0xCF, 0x3C, 0x29, 0x67, 0x7C, 0x19, 0xD8, - 0x16, 0xD1, 0xDA, 0x9D, 0xEA, 0x1E, 0xA2, 0xEA, 0xD8, 0xF2, - 0x35, 0x57, 0x2B, 0x89, 0x08, 0xA2, 0xE9, 0x8D, 0xC9, 0x3A, - 0xAF, 0x93, 0x9B, 0xD7, 0x51, 0xEC, 0xDB, 0x05, 0x07, 0xC3, - 0xB1, 0x07, 0x6D, 0x57, 0x13, 0x29, 0x9C, 0x5B, 0x52, 0xA5, - 0xA7, 0x4B, 0xB7, 0x94, 0xA8, 0xC6, 0x66, 0x6F, 0x5A, 0x24, - 0xE0, 0xCC, 0x34, 0xF6, 0x76, 0x27, 0x6F, 0xEB, 0xEB, 0xFD, - 0xCA, 0xE4, 0xB6, 0xEB, 0x03, 0x11, 0x9A, 0x7E, 0x35, 0xA5, - 0xBB, 0xBC, 0xB2, 0x97, 0x9C, 0x90, 0xB7, 0xA0, 0x26, 0x0C, - 0x37, 0x91, 0x47, 0xB7, 0x3E, 0xD2, 0x5E, 0xCF, 0x26, 0x24, - 0xC8, 0xEA, 0x59, 0xE9, 0x74, 0xEA, 0x50, 0x84, 0x27, 0x57, - 0x31, 0x8D, 0x49, 0x98, 0x86, 0xC1, 0x98, 0xB3, 0x9C, 0x0E, - 0xE4, 0xDE, 0xDF, 0xD5, 0xA7, 0x9C, 0x1B, 0x05, 0xC2, 0x74, - 0x56, 0xE3, 0x59, 0xAF, 0x30, 0xA5, 0xBA, 0x6F, 0xAA, 0xAF, - 0xAB, 0x95, 0x09, 0x49, 0x0C, 0x33, 0x2A, 0xD3, 0x21, 0x6E, - 0xFC, 0x3E, 0x5A, 0xA6, 0x23, 0x99, 0xA1, 0xF5, 0xAD, 0x27, - 0xA1, 0x42, 0x42, 0xAC, 0x69, 0x48, 0xCA, 0xA5, 0x2A, 0x82, - 0x3F, 0xFA, 0x9C, 0x1F, 0x7E, 0x95, 0xD7, 0xE7, 0x9D, 0x44, - 0xEE, 0x9F, 0xB3, 0x4E, 0x23, 0x8F, 0x12, 0xE1, 0x77, 0x6D, - 0xC9, 0x4D, 0x5B, 0x82, 0x1C, 0x89, 0xB2, 0x09, 0x92, 0x55, - 0x26, 0x10, 0x5A, 0x68, 0xC5, 0x47, 0xD4, 0xF8, 0x9C, 0x32, - 0xD8, 0x8B, 0xDD, 0x89, 0xCC, 0x56, 0x5A, 0x76, 0x54, 0x4C, - 0xE7, 0x84, 0x8D, 0x38, 0xC8, 0x47, 0x36, 0x61, 0x11, 0xF5, - 0x1D, 0x3A, 0x86, 0xC5, 0x1E, 0x99, 0xAF, 0xF5, 0x7D, 0xF6, - 0xCF, 0xA4, 0x67, 0xDB, 0xB7, 0x10, 0x64, 0xDC, 0x2E, 0xA7, - 0x09, 0xF0, 0x24, 0x75, 0x43, 0x78, 0xCB, 0xCA, 0xDA, 0x29, - 0x0A, 0x10, 0x92, 0xB6, 0x48, 0x9E, 0x21, 0xAD, 0x71, 0x4C, - 0xC4, 0xB2, 0xEA, 0x0E, 0x9F, 0x6D, 0x6F, 0x2B, 0x98, 0x98, - 0xCA, 0xA7, 0x2E, 0x21, 0xB4, 0x6B, 0xD2, 0x5D, 0x8E, 0x23, - 0x51, 0x46, 0x5E, 0xD4, 0x2F, 0x5A, 0x75, 0x6E, 0xA6, 0x7D, - 0xD8, 0xAD, 0xBB, 0x74, 0xB6, 0x59, 0x63, 0x48, 0x93, 0x20, - 0x0D, 0xED, 0xDB, 0xAE, 0x51, 0x14, 0x84, 0x1A, 0x33, 0x20, - 0x6C, 0x2A, 0x9D, 0xC9, 0x5F, 0x2A, 0xAE, 0x2C, 0x64, 0xC4, - 0xAC, 0x74, 0xEC, 0xE3, 0x5A, 0x9D, 0x08, 0xB9, 0x11, 0xA9, - 0x39, 0x0D, 0x58, 0x07, 0xEE, 0xC4, 0xF6, 0xAD, 0xAD, 0x5D, - 0x47, 0xD4, 0xC3, 0x75, 0xB2, 0x05, 0xE6, 0x1C, 0x41, 0x81, - 0x7B, 0xB5, 0x39, 0x74, 0x69, 0x62, 0x93, 0x8A, 0x6D, 0xA0, - 0x30, 0xAF, 0xE4, 0x2C, 0xE8, 0x95, 0x5C, 0xA9, 0xB6, 0x9F, - 0xE0, 0xC1, 0x9C, 0xBE, 0x29, 0x72, 0xE9, 0xB4, 0x27, 0x44, - 0xCA, 0x9E, 0x61, 0x31, 0x54, 0x43, 0x16, 0xD7, 0xAD, 0x72, - 0x81, 0xD4, 0x8D, 0x57, 0x21, 0xBD, 0x3B, 0x72, 0x72, 0x3C, - 0x24, 0xB5, 0x6A, 0x3B, 0x8A, 0x43, 0x61, 0xA0, 0xDE, 0x13, - 0xCC, 0xB5, 0xBD, 0x56, 0xF3, 0x19, 0x55, 0x05, 0x48, 0x90, - 0x6B, 0x44, 0x4D, 0x9E, 0x7C, 0x02, 0x67, 0x0E, 0xD4, 0xCA, - 0xDD, 0x2E, 0x84, 0x05, 0x68, 0x9C, 0xE2, 0xA5, 0x11, 0xAD, - 0x9A, 0x5A, 0xB4, 0x36, 0x03, 0xC7, 0x15, 0x29, 0xEA, 0x06, - 0xB1, 0x2D, 0x31, 0x6C, 0x8C, 0xEB, 0x2D, 0x2B, 0xD3, 0x27, - 0xC9, 0x6E, 0x24, 0x51, 0xC8, 0x4E, 0xD0, 0xDC, 0x5A, 0x57, - 0x76, 0x14, 0x23, 0x54, 0x4E, 0xC1, 0x4D, 0xAB, 0x8B, 0x4E, - 0x4C, 0xB9, 0xFD, 0x2F, 0xA7, 0x8B, 0x99, 0x4B, 0x31, 0x68, - 0xC2, 0x26, 0x47, 0xE9, 0xF6, 0xA8, 0xBC, 0x9E, 0xA7, 0x6A, - 0x7B, 0x7E, 0x9A, 0xBF, 0xDC, 0xA6, 0xDA, 0x4D, 0x1C, 0xB4, - 0x1B, 0x09, 0x0A, 0x44, 0x88, 0xCF, 0xC1, 0x09, 0x60, 0xFD, - 0x51, 0x55, 0x1A, 0x79, 0x48, 0xC7, 0x22, 0x8E, 0xDD, 0xAB, - 0xDB, 0x8A, 0xE7, 0x20, 0x2D, 0xD4, 0xFA, 0x75, 0xB5, 0x5A, - 0xD1, 0x8C, 0x24, 0x58, 0xC2, 0x46, 0x58, 0xBB, 0x18, 0x87, - 0x60, 0x58, 0x3E, 0xE5, 0x89, 0xDA, 0xF7, 0x5F, 0x45, 0xB9, - 0xDF, 0x2D, 0x45, 0x0E, 0xDC, 0xB2, 0xAD, 0x10, 0x46, 0xE4, - 0x4F, 0x09, 0xBD, 0x90, 0x9B, 0x54, 0x45, 0xDD, 0x82, 0x28, - 0xD5, 0x4B, 0x6F, 0x69, 0x53, 0xB3, 0xCF, 0xB2, 0x0C, 0xE5, - 0x8F, 0x62, 0x6D, 0x0E, 0x9B, 0x69, 0x31, 0x46, 0x5E, 0x76, - 0xAD, 0x23, 0x1D, 0x58, 0x31, 0x64, 0xD1, 0xED, 0x41, 0xA8, - 0x6F, 0x5A, 0xB7, 0x45, 0xDC, 0x2D, 0x42, 0xC3, 0x32, 0xAE, - 0x96, 0x53, 0x96, 0x6C, 0xC8, 0x57, 0x16, 0x38, 0x11, 0xB6, - 0xA4, 0x5B, 0x03, 0xC4, 0xAA, 0x95, 0xA0, 0xD7, 0x03, 0x92, - 0x47, 0x72, 0x23, 0x46, 0x8D, 0x2B, 0x4A, 0xA2, 0x60, 0xC8, - 0x0A, 0xD9, 0x5C, 0x30, 0x38, 0x0E, 0xE2, 0xBA, 0xC6, 0xEB, - 0x05, 0xCE, 0x45, 0x9A, 0xD4, 0x05, 0x11, 0x1A, 0xBD, 0x5C, - 0x26, 0x4A, 0x86, 0xE6, 0xE1, 0x87, 0x66, 0x08, 0xF0, 0x6A, - 0xB9, 0xCD, 0xB6, 0x1A, 0x51, 0x71, 0xD5, 0xEC, 0x4A, 0x21, - 0x60, 0x15, 0x0B, 0x0D, 0xAA, 0xD5, 0x7A, 0x1D, 0x28, 0xD4, - 0xAB, 0x21, 0x27, 0xA5, 0x4C, 0x47, 0x49, 0x6C, 0x65, 0xA8, - 0x96, 0x2D, 0xB9, 0x3B, 0x1E, 0xA5, 0x6A, 0x7E, 0x4F, 0x0D, - 0xA7, 0xAD, 0x3C, 0x1D, 0xFA, 0xE3, 0x74, 0x5B, 0x5C, 0x24, - 0x9A, 0xD3, 0xB1, 0x9A, 0x30, 0xF0, 0x2A, 0x4A, 0x56, 0xCD, - 0x37, 0x88, 0x34, 0x73, 0xD1, 0xED, 0x55, 0x4C, 0x4E, 0x73, - 0xAF, 0x4A, 0xCD, 0xFF, 0x00, 0x5B, 0x42, 0x52, 0x9C, 0xE9, - 0x99, 0x4E, 0x95, 0x38, 0x09, 0x1D, 0xAE, 0x75, 0x3B, 0x68, - 0x1B, 0x59, 0x05, 0x87, 0xAC, 0xEF, 0x5A, 0x6E, 0x66, 0xB8, - 0x9B, 0x70, 0x06, 0xA5, 0xDC, 0x5B, 0x99, 0x06, 0x2C, 0x56, - 0x41, 0x48, 0x18, 0x57, 0x5D, 0x07, 0x32, 0xAF, 0x89, 0x48, - 0x80, 0x55, 0x7C, 0x4B, 0x8A, 0x89, 0x10, 0xFD, 0xEB, 0x65, - 0x5B, 0x18, 0x5C, 0x72, 0x63, 0x07, 0x10, 0x14, 0x4C, 0xCE, - 0xB9, 0x60, 0x71, 0xD8, 0xE7, 0x52, 0x72, 0x3A, 0x8E, 0xF9, - 0x61, 0xD7, 0x5A, 0x86, 0x76, 0xA0, 0x26, 0x5E, 0x5B, 0x7D, - 0x91, 0xA7, 0xB2, 0x44, 0x43, 0x06, 0x48, 0x89, 0xD0, 0x1A, - 0xA0, 0x9A, 0x92, 0xD6, 0xAA, 0x82, 0xAB, 0xE6, 0xC4, 0xE6, - 0x20, 0x92, 0x55, 0x45, 0x9C, 0x2E, 0x28, 0x50, 0xA7, 0x49, - 0xE3, 0x9E, 0x73, 0xD3, 0x89, 0xC3, 0xB5, 0x86, 0xA4, 0x42, - 0xCB, 0xD4, 0xBD, 0x42, 0xAE, 0x1C, 0x8B, 0x9D, 0xAD, 0xE2, - 0xB4, 0xAD, 0xB5, 0xCB, 0x81, 0x4E, 0x48, 0x52, 0x61, 0xB6, - 0xD3, 0x80, 0x88, 0x48, 0xC6, 0x77, 0x94, 0x85, 0xD4, 0x21, - 0x5D, 0x86, 0x34, 0xAF, 0x6D, 0x31, 0x22, 0x67, 0x5E, 0x85, - 0x9A, 0xA7, 0x4D, 0xB7, 0x91, 0x8D, 0x3A, 0x52, 0xFD, 0xD3, - 0x53, 0x2B, 0x3E, 0x6C, 0x36, 0xE8, 0x0C, 0x7B, 0x10, 0xC6, - 0xAF, 0xFA, 0xA6, 0xEB, 0xAA, 0xFA, 0x7B, 0x72, 0xB8, 0xA4, - 0x76, 0x20, 0xDE, 0x0E, 0x4C, 0x96, 0x23, 0xC6, 0x53, 0xCC, - 0x2D, 0xAC, 0x43, 0x36, 0xDB, 0x7C, 0x89, 0x72, 0x99, 0x22, - 0x2A, 0x2E, 0xC4, 0xD8, 0xB5, 0xFC, 0xB8, 0x87, 0x24, 0x84, - 0xF9, 0x50, 0xA5, 0x4E, 0xD6, 0xE2, 0x31, 0x12, 0x12, 0x84, - 0xA1, 0x13, 0x99, 0xB6, 0x9E, 0xCC, 0x31, 0x1D, 0xAA, 0x6B, - 0xD4, 0x0D, 0x51, 0x77, 0xB0, 0x44, 0x86, 0x76, 0xE8, 0x2E, - 0xC9, 0x49, 0x4F, 0x6E, 0xA4, 0x4B, 0x6E, 0x3B, 0x92, 0xC6, - 0x28, 0x6C, 0xF5, 0x8E, 0x32, 0xD2, 0x89, 0x92, 0x76, 0xF7, - 0xA2, 0x79, 0xF1, 0x79, 0xC8, 0x8D, 0x0B, 0x97, 0xD3, 0x2D, - 0x29, 0x56, 0x32, 0xE6, 0x48, 0x45, 0x86, 0x01, 0xDB, 0x31, - 0xD9, 0x99, 0x88, 0x08, 0x0B, 0x3D, 0x4C, 0x98, 0xC4, 0x6B, - 0x14, 0xE9, 0x0F, 0xC2, 0x9F, 0x69, 0x9D, 0x39, 0xF8, 0x17, - 0x1B, 0x8C, 0x60, 0x75, 0x91, 0x64, 0x85, 0x15, 0x5A, 0xA8, - 0x3A, 0xAA, 0xA0, 0x54, 0xF4, 0xD1, 0x55, 0x53, 0x66, 0xC5, - 0xDB, 0x8A, 0xF3, 0x34, 0x6C, 0x5D, 0x21, 0xD0, 0xC4, 0xCD, - 0x58, 0x01, 0x28, 0xD6, 0xA7, 0x11, 0x28, 0xC5, 0xC4, 0x9C, - 0x6B, 0xC4, 0x7C, 0x3B, 0xD7, 0x27, 0x7A, 0x95, 0xA9, 0x8F, - 0x4D, 0xC4, 0xBD, 0x47, 0xB6, 0x11, 0x44, 0xBA, 0xCD, 0x79, - 0xB8, 0xB2, 0x99, 0x8E, 0xEC, 0xB4, 0x8D, 0x09, 0xB2, 0x40, - 0x6E, 0x43, 0xCD, 0x34, 0x48, 0x65, 0xBC, 0x51, 0x22, 0x45, - 0x45, 0x44, 0xA5, 0x30, 0x19, 0x96, 0x49, 0xA5, 0xD3, 0xAD, - 0x8D, 0x59, 0x40, 0xCD, 0x8C, 0x00, 0xD2, 0x5B, 0x3C, 0xB5, - 0xB1, 0x66, 0x00, 0x21, 0xB7, 0x8D, 0x65, 0xAA, 0xEE, 0x23, - 0xA4, 0x9C, 0xB3, 0xDC, 0xA0, 0x48, 0x72, 0x75, 0xC9, 0xE8, - 0xCE, 0x48, 0x65, 0xB7, 0xC1, 0x95, 0x26, 0x8B, 0xC2, 0x8E, - 0xB4, 0xA5, 0x9E, 0x99, 0x15, 0x33, 0x0E, 0x6E, 0xDE, 0xFA, - 0x2E, 0x20, 0xC8, 0x96, 0x62, 0xB6, 0xD2, 0xB1, 0xA3, 0x46, - 0x37, 0x02, 0xA5, 0x39, 0x66, 0x84, 0x63, 0x86, 0x68, 0x96, - 0xCD, 0xAC, 0x49, 0xB4, 0xF8, 0x22, 0x37, 0xCE, 0xA5, 0x6A, - 0x36, 0x2E, 0xB7, 0x1B, 0x5D, 0xAA, 0x11, 0x4D, 0x99, 0x65, - 0x65, 0xAE, 0x29, 0xB8, 0xF0, 0x64, 0xCA, 0x49, 0x12, 0x1C, - 0x45, 0x52, 0x04, 0x26, 0x8B, 0xF8, 0x71, 0xF0, 0xD4, 0x54, - 0xF3, 0x57, 0xF4, 0xE2, 0x4C, 0xCB, 0xB0, 0x59, 0xA8, 0xF4, - 0xBB, 0x78, 0xD3, 0x85, 0x4A, 0xD2, 0xCB, 0x1A, 0xAE, 0x74, - 0xFA, 0x63, 0xAB, 0x57, 0x98, 0xEE, 0x5D, 0xEE, 0x7D, 0x42, - 0xD5, 0x47, 0x72, 0x72, 0x0D, 0xB6, 0xDF, 0x1D, 0x87, 0x19, - 0xB2, 0xA5, 0xEA, 0x43, 0x73, 0x54, 0xD1, 0xC0, 0xD8, 0x0A, - 0x4C, 0x50, 0x52, 0x99, 0xD1, 0x4E, 0x9B, 0x70, 0x19, 0x94, - 0xBB, 0x6E, 0x9D, 0x40, 0xC6, 0x9C, 0xA6, 0x64, 0x79, 0x95, - 0x0C, 0x30, 0x6E, 0xCC, 0x7E, 0x2B, 0x9D, 0x83, 0xA9, 0x3A, - 0x9E, 0x75, 0xD7, 0x4C, 0x0C, 0xC8, 0x11, 0x42, 0x06, 0xA6, - 0x8A, 0xFB, 0xEC, 0x03, 0x26, 0x6A, 0xEB, 0x64, 0xC3, 0x26, - 0xEA, 0x21, 0x29, 0xA0, 0x8F, 0x8B, 0x27, 0xE9, 0xF3, 0x6D, - 0x04, 0xCB, 0x8E, 0xD5, 0x37, 0x1D, 0x36, 0xDE, 0x34, 0xAA, - 0x4A, 0x26, 0x59, 0xA9, 0x54, 0x11, 0xC5, 0x99, 0x8B, 0xE3, - 0x82, 0xDF, 0x4B, 0x75, 0x16, 0xF1, 0x74, 0xD4, 0x71, 0xA0, - 0x5C, 0xF7, 0x56, 0x82, 0x92, 0xEB, 0xED, 0xA5, 0x9A, 0x64, - 0x49, 0x0C, 0x4A, 0x51, 0x68, 0x0C, 0x80, 0x99, 0x7C, 0xCB, - 0x76, 0xE2, 0xAE, 0x54, 0x25, 0xF0, 0xA2, 0x52, 0xB4, 0x55, - 0xC1, 0x19, 0x92, 0x71, 0x51, 0x7B, 0xD2, 0xE9, 0xD3, 0xA2, - 0x67, 0x4B, 0xF7, 0x23, 0x16, 0xF3, 0x89, 0x06, 0x73, 0xB6, - 0x2C, 0xFD, 0xD8, 0xF6, 0xAB, 0x27, 0x0D, 0x5E, 0x7D, 0x25, - 0xA5, 0x36, 0xF6, 0x77, 0xE0, 0x42, 0xA8, 0x75, 0x17, 0xD3, - 0x2E, 0x6C, 0xFF, 0x00, 0x2F, 0xE6, 0x7C, 0x56, 0x65, 0xE2, - 0xF9, 0x1D, 0x77, 0x39, 0xBB, 0xF3, 0x66, 0xF5, 0x5F, 0xF5, - 0x71, 0xAF, 0xCE, 0xDE, 0x66, 0xF1, 0x55, 0x40, 0x5E, 0xF9, - 0x16, 0xBE, 0x2F, 0x9B, 0x3F, 0x36, 0xE3, 0x15, 0xFE, 0x55, - 0x2B, 0x97, 0xFB, 0x03, 0xFF, 0x00, 0x16, 0xFE, 0xE3, 0x07, - 0xF2, 0xA1, 0x2F, 0xF6, 0x07, 0xFE, 0x2D, 0xFD, 0xC6, 0x0F, - 0xE5, 0x42, 0xC2, 0xFC, 0x81, 0xDF, 0xF3, 0x6F, 0xEE, 0x30, - 0x7F, 0x2A, 0x16, 0xAB, 0xF4, 0xDE, 0x8B, 0xBC, 0xF9, 0xAB, - 0x2F, 0xEB, 0x57, 0x73, 0xD9, 0xE7, 0xCB, 0xE2, 0xC1, 0xFC, - 0xA8, 0x56, 0x9F, 0x4D, 0x3E, 0x9F, 0xF2, 0xA7, 0x3E, 0x50, - 0xC9, 0x93, 0x32, 0x71, 0xB9, 0xB3, 0x71, 0x39, 0xFB, 0xB7, - 0xFB, 0xCF, 0x59, 0xE5, 0xA7, 0x77, 0x93, 0x0A, 0xA9, 0x99, - 0xF1, 0x40, 0x53, 0x1C, 0x2D, 0x4A, 0x8D, 0xDF, 0xFE, 0x4D, - 0xF9, 0xA7, 0x4E, 0xF3, 0x7F, 0xEF, 0xED, 0xE4, 0x8F, 0x97, - 0xFF, 0x00, 0x1F, 0xD3, 0xDD, 0x2E, 0xFB, 0xF0, 0xFD, 0x57, - 0xE1, 0xFE, 0xD3, 0xF3, 0x62, 0x0B, 0x3A, 0xD5, 0x4F, 0x9D, - 0xC9, 0x96, 0x57, 0xE5, 0xB8, 0xCD, 0xB1, 0xF1, 0x67, 0xF8, - 0xA8, 0xE7, 0xFC, 0x9C, 0xF9, 0x54, 0x7E, 0x01, 0xCE, 0x92, - 0x95, 0xE3, 0xBF, 0xBD, 0x77, 0x9D, 0xFF, 0x00, 0xE7, 0x7D, - 0x3F, 0x2F, 0xAB, 0xFC, 0xD8, 0xAF, 0x95, 0x96, 0xA9, 0x7B, - 0xBE, 0x64, 0xDF, 0x36, 0x7C, 0x9E, 0x6F, 0xD3, 0x87, 0xC3, - 0x42, 0x75, 0x3B, 0xE9, 0x5E, 0xE7, 0x5A, 0x71, 0x55, 0xC9, - 0x56, 0xBE, 0x6F, 0xFE, 0xD9, 0x5F, 0x45, 0x77, 0x54, 0xCB, - 0xE2, 0xEC, 0xAF, 0xE0, 0x60, 0xC3, 0x15, 0x10, 0xF7, 0x59, - 0xE9, 0xB3, 0xE6, 0xCB, 0xE4, 0xEE, 0xC7, 0x47, 0xC5, 0x0E, - 0xD5, 0x7F, 0x47, 0xB8, 0x8B, 0x77, 0x31, 0xDF, 0xF1, 0x5C, - 0xBC, 0x38, 0x7E, 0x5D, 0xC7, 0xEF, 0xB9, 0x6E, 0x54, 0xCB, - 0xBF, 0xE0, 0xFC, 0x7B, 0xAA, 0x7E, 0xD7, 0x11, 0x2C, 0xAF, - 0x8A, 0x75, 0x9F, 0xBD, 0xE5, 0x9E, 0x5E, 0x6C, 0x99, 0xBB, - 0x1B, 0x37, 0x63, 0xFE, 0x6E, 0xEC, 0x53, 0xDD, 0x63, 0xF4, - 0x77, 0xE4, 0x7B, 0x57, 0xCC, 0x1C, 0x3F, 0xCA, 0x55, 0x6B, - 0x94, 0xEE, 0x77, 0xFB, 0xAA, 0x6E, 0xD7, 0x26, 0x4E, 0x17, - 0xC7, 0x93, 0x25, 0x6B, 0x5F, 0x0F, 0x97, 0x16, 0x2D, 0xAD, - 0x66, 0xB5, 0xF7, 0x59, 0xA7, 0xCA, 0xCD, 0x99, 0xBC, 0xCD, - 0xB3, 0xB5, 0x75, 0xD6, 0x9F, 0x4D, 0x39, 0xC5, 0x8B, 0x9D, - 0xEF, 0x79, 0x9E, 0x42, 0xE5, 0x3C, 0x07, 0x19, 0x9F, 0x71, - 0x4F, 0x16, 0x6E, 0x0B, 0xFC, 0xCF, 0xF9, 0x7E, 0x1F, 0xD3, - 0x88, 0x96, 0x57, 0xC5, 0x36, 0xCB, 0xDD, 0xF2, 0xE5, 0xCA, - 0x7E, 0x5B, 0xE3, 0xB1, 0xFC, 0x75, 0xA1, 0x12, 0xBE, 0x89, - 0x7C, 0x8D, 0x6F, 0xF4, 0xFE, 0x5E, 0xE3, 0xDD, 0xE5, 0x9B, - 0x8E, 0x61, 0xC4, 0xF1, 0xBB, 0xC2, 0xDE, 0xEE, 0xB2, 0x7F, - 0x15, 0x9B, 0x3E, 0x6A, 0xF7, 0x7E, 0x8C, 0x41, 0xCA, 0xC9, - 0xB4, 0x7D, 0xFF, 0x00, 0x3A, 0x79, 0x73, 0xF3, 0x1B, 0xCF, - 0xDD, 0xFC, 0x5C, 0x51, 0x07, 0x3E, 0x93, 0x66, 0xBD, 0xEF, - 0xB3, 0xEF, 0x79, 0x44, 0x6E, 0x75, 0x9F, 0x8F, 0xDE, 0x72, - 0xDD, 0xDA, 0x6E, 0x2B, 0x5F, 0x15, 0x72, 0xD2, 0xB9, 0x3D, - 0x65, 0x7D, 0x2D, 0xB8, 0x9F, 0x2A, 0x50, 0xF7, 0x99, 0xA0, - 0xD9, 0x9D, 0xE5, 0x93, 0xBD, 0xCE, 0x66, 0xF1, 0x4F, 0xE3, - 0xFD, 0x36, 0xE7, 0x1A, 0x67, 0x71, 0x97, 0x98, 0xF2, 0xC2, - 0xF9, 0x6E, 0xBC, 0x4E, 0x4E, 0x5F, 0xB9, 0x4C, 0xDE, 0x97, - 0xAA, 0xFC, 0x2F, 0xDA, 0xF8, 0xA9, 0x89, 0xC1, 0xD6, 0x7F, - 0xDF, 0xE5, 0x9D, 0x3C, 0xBC, 0xF8, 0xFE, 0xAF, 0xBD, 0x55, - 0x96, 0x66, 0xF4, 0x9F, 0xCE, 0x7A, 0x7C, 0x99, 0x91, 0x0F, - 0x84, 0x1B, 0xB7, 0xA9, 0x6E, 0xCC, 0xC3, 0xB9, 0x4E, 0x55, - 0x17, 0x75, 0xBC, 0x37, 0xDD, 0xDD, 0x83, 0x28, 0x54, 0xFC, - 0x01, 0x24, 0x55, 0xF2, 0x61, 0x51, 0x67, 0x0B, 0xD2, 0xDD, - 0xCA, 0xE4, 0xDA, 0xD4, 0xC2, 0x62, 0x2D, 0x17, 0xCF, 0x27, - 0x2C, 0xFF, 0x00, 0x97, 0xCA, 0x3C, 0x5D, 0x5C, 0x7D, 0x40, - 0xF9, 0x2F, 0xE5, 0xE3, 0xF9, 0xBF, 0x27, 0x2B, 0xDE, 0x06, - 0x4A, 0xEF, 0x37, 0x9B, 0xED, 0xB9, 0x37, 0x3B, 0x9F, 0x5B, - 0xBC, 0xED, 0xA6, 0x4D, 0xBD, 0xB8, 0x6C, 0x99, 0xB1, 0x5E, - 0x6A, 0xC3, 0xDC, 0x73, 0x3F, 0x63, 0x36, 0x7E, 0xCD, 0x9F, - 0x72, 0x89, 0xFF, 0x00, 0xCA, 0x0F, 0x95, 0xEE, 0xDC, 0xC3, - 0x8D, 0xE5, 0x59, 0xE2, 0xF3, 0x6E, 0x65, 0xCD, 0x37, 0xF5, - 0xCC, 0xBC, 0x35, 0x77, 0xDE, 0xBB, 0x25, 0x6B, 0x4C, 0x9E, - 0x1E, 0xDA, 0xF7, 0xE2, 0x3C, 0xAB, 0x64, 0xFD, 0xEE, 0x71, - 0xB7, 0x2C, 0x9B, 0x2E, 0x56, 0x6F, 0xCC, 0xCD, 0x87, 0x7E, - 0xB4, 0x6E, 0xE5, 0xF4, 0xDB, 0x9E, 0x6A, 0x3E, 0x36, 0xBC, - 0xD7, 0x96, 0x0F, 0xCC, 0x1F, 0xDA, 0xEB, 0xCB, 0xF2, 0xAE, - 0x5A, 0x64, 0xF0, 0x76, 0x7E, 0xCB, 0xC7, 0x89, 0x2D, 0x8A, - 0xCF, 0x4B, 0xDC, 0xB5, 0x2C, 0xAF, 0xA7, 0xF6, 0xFB, 0xDF, - 0x57, 0x8A, 0x07, 0x79, 0xFA, 0x31, 0xC3, 0xD8, 0x78, 0x8E, - 0x27, 0xFB, 0xB0, 0x79, 0x07, 0x05, 0xCD, 0x37, 0xBC, 0x05, - 0x36, 0x64, 0xE1, 0xBC, 0x7E, 0x8F, 0xF4, 0xFC, 0x54, 0xED, - 0xC5, 0x4E, 0x55, 0xA2, 0xDB, 0xDE, 0xE5, 0x97, 0x2D, 0xF2, - 0xE6, 0xF3, 0x68, 0x6C, 0xDD, 0xAE, 0x9C, 0x5D, 0x3E, 0x8D, - 0xFC, 0x9D, 0x64, 0xCF, 0x93, 0x93, 0x6F, 0x0B, 0x90, 0x70, - 0x5C, 0x4F, 0x15, 0xBE, 0xCC, 0xBB, 0xCD, 0xCE, 0xE3, 0xF8, - 0x9D, 0xE6, 0x7F, 0xC4, 0xAE, 0xDC, 0xDE, 0x96, 0xDC, 0x49, - 0xCA, 0xCA, 0x96, 0xBE, 0xF7, 0x99, 0x3E, 0x5E, 0x6C, 0xFF, - 0x00, 0x9F, 0xFE, 0x4F, 0x86, 0xF4, 0xDE, 0xE7, 0xF4, 0x7F, - 0xE4, 0xDF, 0xFE, 0xCB, 0x8B, 0xE5, 0x9C, 0xC3, 0xC3, 0xBF, - 0xE6, 0x5C, 0xC7, 0x98, 0x64, 0x1F, 0x47, 0x3F, 0xF1, 0x99, - 0xF2, 0x65, 0xF4, 0x76, 0x65, 0xC4, 0x1C, 0xAD, 0x8A, 0x75, - 0x2F, 0x7F, 0xCD, 0x39, 0x33, 0x67, 0xCB, 0xF9, 0x59, 0xB2, - 0xF8, 0x79, 0x72, 0xAC, 0x07, 0xD0, 0xFF, 0x00, 0x97, 0xB5, - 0x2F, 0x6F, 0x2D, 0xCF, 0x1F, 0x9F, 0xEF, 0x78, 0xFD, 0xF6, - 0xFB, 0x2F, 0xF0, 0xF9, 0x77, 0xBE, 0xBB, 0x79, 0xE4, 0xDD, - 0x6D, 0xAF, 0x6F, 0x7E, 0x0F, 0x2B, 0x76, 0x2A, 0xC7, 0xDF, - 0xF3, 0xE2, 0xD9, 0xF9, 0xAD, 0xE5, 0xDA, 0xDF, 0x72, 0xED, - 0xA6, 0xFE, 0x8C, 0x6F, 0x2E, 0x7C, 0x0D, 0x77, 0xDC, 0xAC, - 0x79, 0xBF, 0x31, 0xE3, 0xAB, 0xCB, 0xEB, 0xB3, 0x7B, 0xC6, - 0xEC, 0xED, 0xED, 0xFD, 0x6C, 0x48, 0xCA, 0x97, 0x71, 0xEF, - 0x73, 0x47, 0x3E, 0x6C, 0xCF, 0xE5, 0xEF, 0xEC, 0x65, 0x8D, - 0x25, 0xF4, 0x93, 0x78, 0x7C, 0xB3, 0x8C, 0xE1, 0xF8, 0x39, - 0x1B, 0xAE, 0x61, 0xCC, 0xB8, 0x3E, 0x0A, 0x89, 0xBF, 0xDC, - 0xF1, 0x9E, 0xA3, 0x26, 0x5E, 0xDA, 0x6D, 0xA7, 0x9B, 0x10, - 0x32, 0xA6, 0xDC, 0xFB, 0xE7, 0x19, 0xDF, 0x36, 0x61, 0xA1, - 0x9F, 0x37, 0xE5, 0x76, 0xC5, 0xF6, 0x3A, 0x6B, 0xA3, 0x7E, - 0x88, 0x73, 0x8B, 0x2F, 0x23, 0xE2, 0x39, 0x96, 0xF6, 0x47, - 0x23, 0xE2, 0x79, 0x9D, 0x33, 0x6E, 0xCB, 0x7B, 0xBA, 0xE2, - 0x3D, 0x5E, 0x4D, 0xDE, 0x6A, 0x57, 0x67, 0x6D, 0x36, 0xE0, - 0x8E, 0x5D, 0x4A, 0x2F, 0xBD, 0xFE, 0x53, 0xCE, 0xCD, 0x97, - 0x07, 0x7F, 0x83, 0xF6, 0xA9, 0x6E, 0xBB, 0xF9, 0x5F, 0x24, - 0x2E, 0x77, 0xC7, 0xEF, 0x73, 0x39, 0xC1, 0xF2, 0xCE, 0x3B, - 0x7D, 0xD8, 0x9B, 0xCA, 0xF0, 0x3E, 0x2C, 0xB4, 0xA7, 0xA5, - 0xB3, 0x16, 0x93, 0x6B, 0x59, 0x6C, 0x79, 0xED, 0x2E, 0x53, - 0x36, 0x0E, 0xF9, 0x5B, 0xB3, 0xD4, 0xA0, 0xFA, 0xE4, 0x74, - 0x39, 0x74, 0x55, 0xF4, 0xD3, 0x2E, 0x34, 0xD6, 0x9F, 0xDF, - 0xA6, 0xF4, 0xDB, 0x02, 0x72, 0x4A, 0x1E, 0xF3, 0xD7, 0x65, - 0x17, 0xCD, 0xB7, 0x16, 0x4E, 0x6E, 0xDD, 0xE1, 0x57, 0xCB, - 0x8A, 0x4D, 0xB2, 0xF6, 0x2E, 0x9F, 0x4A, 0x37, 0x3E, 0xF2, - 0x5A, 0x79, 0xD9, 0x65, 0xA7, 0xBB, 0x5E, 0x9F, 0x0E, 0xD6, - 0x52, 0x7B, 0xDF, 0xC8, 0x3F, 0x2F, 0xD8, 0x37, 0x9C, 0x77, - 0x01, 0xC3, 0x0F, 0x25, 0xE5, 0x5C, 0x76, 0xF3, 0x87, 0xDD, - 0x05, 0x3F, 0xB0, 0xED, 0xCB, 0x93, 0x2F, 0xA7, 0x8B, 0x49, - 0x97, 0x3E, 0xCF, 0xDC, 0x79, 0xB9, 0x6D, 0xFC, 0x4F, 0x97, - 0xFD, 0xC8, 0x45, 0xC3, 0xE8, 0x87, 0xC9, 0x56, 0x9A, 0xFF, - 0x00, 0x71, 0xF1, 0x47, 0xCA, 0xB8, 0x2E, 0x37, 0x8B, 0xE2, - 0xEA, 0xBB, 0xDF, 0xC0, 0xFE, 0x2B, 0x79, 0x5F, 0x4F, 0x3E, - 0xDF, 0x2F, 0x76, 0x20, 0xE5, 0x64, 0xEB, 0x7F, 0x7D, 0xCD, - 0x9E, 0x4C, 0xF9, 0xFF, 0x00, 0x3F, 0xFC, 0xB5, 0x2D, 0xB5, - 0x07, 0xD2, 0x1E, 0x6C, 0x1C, 0x47, 0x1B, 0xCD, 0x38, 0x36, - 0x78, 0x9E, 0x5B, 0xCC, 0xF7, 0xDC, 0x26, 0x44, 0xDD, 0x71, - 0x7C, 0x27, 0x8B, 0xD0, 0xA7, 0xE2, 0xF8, 0xE9, 0x80, 0xE5, - 0x57, 0xA1, 0xEF, 0xB2, 0x79, 0x5F, 0x26, 0x6D, 0x6C, 0xD9, - 0xBF, 0x87, 0x36, 0xB7, 0xD8, 0x8B, 0x87, 0xD2, 0xFE, 0x6B, - 0x3B, 0x27, 0xF6, 0xFE, 0x44, 0x3C, 0x5D, 0x38, 0xBA, 0x72, - 0x7C, 0xA9, 0x97, 0x2F, 0xEA, 0x76, 0x53, 0xD0, 0xF5, 0x98, - 0x9F, 0x2A, 0xCB, 0xFD, 0xD7, 0x93, 0xD5, 0xEB, 0x39, 0x7F, - 0x5B, 0xE3, 0xE2, 0xEB, 0x95, 0xBF, 0xE9, 0x4E, 0xF3, 0x49, - 0xF0, 0x7E, 0x9F, 0x05, 0x23, 0xE5, 0x6F, 0xED, 0x94, 0xE1, - 0x77, 0x2B, 0xBF, 0xF4, 0xB6, 0x57, 0x75, 0x5F, 0xC5, 0xF1, - 0x79, 0x36, 0xE2, 0x70, 0x55, 0xFE, 0xE7, 0x2C, 0xB4, 0xB6, - 0x71, 0x9B, 0xF5, 0x6A, 0x7E, 0xD4, 0xD3, 0x4B, 0x7D, 0x2A, - 0xF9, 0xA2, 0x17, 0x03, 0xC6, 0x73, 0xBD, 0xDB, 0xBC, 0x9B, - 0x9A, 0xF3, 0x1F, 0xC3, 0xA2, 0xEF, 0x78, 0x3E, 0x3B, 0xC1, - 0xE8, 0xF6, 0xE4, 0xF1, 0x65, 0xF3, 0x62, 0x22, 0xDA, 0x93, - 0xAF, 0x7D, 0xDE, 0x4F, 0xDC, 0xF4, 0xBE, 0x2D, 0x97, 0x4F, - 0x6E, 0x5D, 0x7D, 0xEA, 0xC9, 0xC5, 0xD7, 0x25, 0x7F, 0xFF, - 0xD9 -}; - -struct fsdata_file const file_img_logo_ql_jpg[] = { - { - file_img_logo_lwip_qp_jpg, - data_img_logo_ql_jpg, - data_img_logo_ql_jpg + 17, - sizeof(data_img_logo_ql_jpg) - 17 - } -}; - -/* /img/logo_sics.gif */ -static unsigned char const data_img_logo_sics_gif[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, - 0x73, 0x69, 0x63, 0x73, 0x2E, 0x67, 0x69, 0x66, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x78, 0x00, 0x35, 0x00, - 0xE6, 0x00, 0x00, 0x95, 0x95, 0x95, 0x32, 0x32, 0x32, 0xE9, - 0x92, 0x9A, 0xDC, 0x1B, 0x2D, 0xEA, 0xEA, 0xEA, 0x8A, 0x8A, - 0x8A, 0xDF, 0x4B, 0x58, 0x6E, 0x6E, 0x6E, 0x2C, 0x2C, 0x2C, - 0x20, 0x20, 0x20, 0x72, 0x72, 0x72, 0xC2, 0xC2, 0xC2, 0x99, - 0x99, 0x99, 0xB1, 0xB1, 0xB1, 0x13, 0x13, 0x13, 0xA2, 0xA2, - 0xA2, 0xD8, 0xD8, 0xD8, 0x92, 0x92, 0x92, 0xAC, 0xAC, 0xAC, - 0x65, 0x65, 0x65, 0xFC, 0xFF, 0xFF, 0xE3, 0x43, 0x52, 0xA6, - 0xA6, 0xA6, 0x85, 0x85, 0x85, 0xB9, 0xB9, 0xB9, 0x0A, 0x0A, - 0x0A, 0xF8, 0xF1, 0xF2, 0x7D, 0x7D, 0x7D, 0xF4, 0xF4, 0xF4, - 0xA9, 0xA9, 0xA9, 0xB5, 0xB5, 0xB5, 0xD6, 0xD6, 0xD6, 0x5D, - 0x5D, 0x5D, 0x7A, 0x7A, 0x7A, 0xDE, 0xDE, 0xDE, 0x3D, 0x3D, - 0x3D, 0x6A, 0x6A, 0x6A, 0x58, 0x58, 0x58, 0x52, 0x52, 0x52, - 0xF5, 0xDE, 0xE1, 0x61, 0x61, 0x61, 0x1A, 0x1A, 0x1A, 0xDC, - 0xDC, 0xDC, 0xE3, 0xE3, 0xE3, 0x49, 0x49, 0x49, 0xEE, 0xB4, - 0xBA, 0xD0, 0xD0, 0xD0, 0xE5, 0x83, 0x8D, 0xED, 0xED, 0xED, - 0xE6, 0xE6, 0xE6, 0xDD, 0x33, 0x44, 0xF6, 0xE6, 0xE9, 0xFA, - 0xEE, 0xEE, 0x1D, 0x1D, 0x1D, 0xF1, 0xF1, 0xF1, 0xF5, 0xE1, - 0xE4, 0x45, 0x45, 0x45, 0xDA, 0xDA, 0xDA, 0xDF, 0x25, 0x36, - 0xCE, 0xCE, 0xCE, 0x4D, 0x4D, 0x4D, 0x25, 0x25, 0x25, 0x76, - 0x76, 0x76, 0xCB, 0xCB, 0xCB, 0x8E, 0x8E, 0x8E, 0xDD, 0x26, - 0x36, 0xC5, 0xC5, 0xC5, 0x9E, 0x9E, 0x9E, 0xE8, 0x8B, 0x94, - 0xD3, 0xD3, 0xD3, 0xED, 0xAA, 0xB1, 0xE0, 0xE0, 0xE0, 0xCC, - 0xCC, 0xCC, 0x38, 0x38, 0x38, 0xDF, 0x31, 0x44, 0xDC, 0x3D, - 0x4D, 0xFA, 0xFE, 0xFF, 0x41, 0x41, 0x41, 0x04, 0x04, 0x04, - 0x57, 0x57, 0x57, 0x82, 0x82, 0x82, 0x80, 0x80, 0x80, 0x9C, - 0x9C, 0x9C, 0xE4, 0x79, 0x83, 0xBC, 0xBC, 0xBC, 0xD2, 0xD2, - 0xD2, 0xE7, 0x97, 0xA0, 0xC8, 0xC8, 0xC8, 0xBF, 0xBF, 0xBF, - 0x8C, 0x8C, 0x8C, 0xDE, 0x21, 0x33, 0xFB, 0xFC, 0xFC, 0xDD, - 0x2D, 0x3F, 0xE4, 0xE4, 0xE4, 0xDF, 0x26, 0x38, 0xE3, 0x6B, - 0x76, 0xDE, 0x22, 0x34, 0xFB, 0xE6, 0xE7, 0xDF, 0x35, 0x48, - 0xDC, 0x1E, 0x2F, 0xF7, 0xF7, 0xF7, 0xF2, 0xF2, 0xF2, 0xFE, - 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xFA, 0xFA, 0xFA, 0xFD, 0xFD, - 0xFD, 0xEE, 0xEE, 0xEE, 0xF3, 0xF3, 0xF3, 0xF9, 0xF9, 0xF9, - 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xEF, - 0xEF, 0xEF, 0xF6, 0xF6, 0xF6, 0xFA, 0xFD, 0xFE, 0xFF, 0xFF, - 0xFE, 0xF9, 0xFC, 0xFE, 0xDF, 0x2F, 0x42, 0xFB, 0xF7, 0xF8, - 0xE9, 0xA4, 0xAA, 0xFC, 0xFC, 0xFD, 0xF2, 0xD7, 0xDB, 0xE0, - 0x20, 0x34, 0xE0, 0x4F, 0x5C, 0xE1, 0x52, 0x63, 0xDE, 0x29, - 0x3A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x21, 0xF9, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x35, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x7F, 0x82, - 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, - 0x8D, 0x8E, 0x8F, 0x8F, 0x6F, 0x1C, 0x1C, 0x6C, 0x90, 0x96, - 0x8F, 0x69, 0x67, 0x1C, 0x68, 0x6D, 0x97, 0x88, 0x6E, 0x93, - 0x95, 0x9E, 0x88, 0x68, 0x48, 0x40, 0x20, 0x23, 0x3D, 0x35, - 0x35, 0x3D, 0x01, 0x3C, 0x0A, 0x16, 0x10, 0x69, 0x9F, 0x16, - 0x00, 0x0C, 0xB7, 0xB8, 0x00, 0x0F, 0xA2, 0x8F, 0x2B, 0x0D, - 0x1B, 0x4F, 0x23, 0x08, 0x3D, 0x09, 0x3D, 0x08, 0x23, 0x25, - 0x51, 0x0D, 0x47, 0x90, 0x6E, 0x2E, 0x11, 0xA8, 0x08, 0x09, - 0xAC, 0x01, 0x2C, 0x07, 0x0F, 0x1F, 0x6E, 0xA3, 0x70, 0x40, - 0x08, 0x7E, 0xDF, 0xE0, 0xE1, 0xDF, 0x4E, 0x01, 0x50, 0x1F, - 0x86, 0x64, 0x09, 0xE2, 0xE0, 0x29, 0x65, 0x8E, 0x31, 0x00, - 0x4D, 0x19, 0xEB, 0xF4, 0x19, 0x49, 0x05, 0x22, 0x8B, 0x1C, - 0x00, 0x01, 0x4E, 0xF4, 0xE1, 0xE4, 0x42, 0xB8, 0xB0, 0xD4, - 0x41, 0xDD, 0xBF, 0x7F, 0x4E, 0x58, 0x34, 0x40, 0x33, 0x28, - 0xDD, 0xBF, 0x76, 0x8C, 0x8E, 0x1C, 0x70, 0x70, 0xB0, 0x62, - 0x06, 0x10, 0x03, 0x0F, 0x79, 0xE8, 0x51, 0x91, 0x9E, 0x93, - 0x26, 0x1D, 0xCE, 0x30, 0x4A, 0x73, 0xA0, 0x63, 0xC7, 0x00, - 0xE7, 0xFE, 0x38, 0xA4, 0x07, 0x31, 0x11, 0x9B, 0x02, 0x14, - 0x4D, 0x5A, 0x3C, 0xA0, 0xA6, 0xD0, 0x06, 0x99, 0x07, 0x7B, - 0x08, 0x59, 0x34, 0x01, 0x67, 0xC5, 0x0E, 0x82, 0x56, 0xAE, - 0x6B, 0x79, 0x28, 0xC7, 0x08, 0x9F, 0x26, 0x2F, 0x10, 0x52, - 0x80, 0xF4, 0x5F, 0x04, 0x45, 0x05, 0x9A, 0xFE, 0x93, 0x10, - 0xD4, 0xE0, 0x50, 0x77, 0x87, 0xA8, 0xC4, 0x94, 0xFA, 0x0F, - 0xCA, 0x20, 0x06, 0x5C, 0xD7, 0x3D, 0x45, 0x54, 0x64, 0x5E, - 0xD8, 0x70, 0x54, 0x55, 0x5A, 0x15, 0x47, 0x94, 0x50, 0x03, - 0xB3, 0x67, 0xFF, 0xD7, 0x79, 0xFD, 0x73, 0x64, 0x6B, 0xDC, - 0xB1, 0x87, 0x50, 0xC4, 0x45, 0x5B, 0xF5, 0x21, 0x56, 0x42, - 0x54, 0xE0, 0xEE, 0x0D, 0x37, 0x97, 0xE9, 0x60, 0x3F, 0x78, - 0x0B, 0xAD, 0xB0, 0xBB, 0xCE, 0x41, 0x89, 0x02, 0x43, 0x86, - 0x14, 0x20, 0x91, 0x44, 0x30, 0xB8, 0xB4, 0x42, 0xD9, 0xFE, - 0x15, 0x94, 0x23, 0xC5, 0x61, 0xB9, 0x7F, 0xE0, 0xD4, 0xA8, - 0xE8, 0xC0, 0xC4, 0x85, 0xC8, 0x40, 0x48, 0x8C, 0xB0, 0xFC, - 0x2D, 0x31, 0x21, 0x0B, 0x15, 0x27, 0x10, 0x38, 0xB4, 0x42, - 0x4A, 0x13, 0x7F, 0x97, 0xFB, 0xB2, 0xDC, 0xFC, 0xA6, 0x09, - 0x4E, 0x27, 0x09, 0x70, 0xA0, 0x38, 0x70, 0x60, 0x02, 0x8B, - 0x1E, 0xAC, 0xBF, 0x79, 0xC5, 0x50, 0xF1, 0x49, 0x8C, 0x43, - 0x31, 0x1E, 0xB0, 0x10, 0xEC, 0x7A, 0x50, 0xC9, 0x7F, 0x26, - 0x18, 0x55, 0x21, 0x11, 0x13, 0xF3, 0xDA, 0x70, 0x6D, 0xA3, - 0x9A, 0x4C, 0x10, 0xE2, 0x07, 0x19, 0x43, 0x6F, 0x54, 0x3C, - 0x30, 0x61, 0xD9, 0x2B, 0x94, 0x83, 0x4D, 0x66, 0x29, 0x82, - 0xA0, 0x20, 0x66, 0x75, 0x41, 0x3C, 0x0E, 0x36, 0x78, 0x17, - 0x22, 0x83, 0x05, 0xDD, 0x57, 0x0D, 0x22, 0x02, 0x63, 0x8D, - 0x15, 0xB0, 0x59, 0x22, 0x5D, 0x5C, 0x30, 0x9A, 0x72, 0x7F, - 0x80, 0x70, 0xD0, 0x03, 0x8E, 0x10, 0x00, 0x45, 0x06, 0x40, - 0x20, 0x72, 0xD4, 0x3F, 0x18, 0x40, 0x22, 0x42, 0x3E, 0x6A, - 0xF9, 0x65, 0xDD, 0x49, 0x10, 0x58, 0xB2, 0x46, 0x16, 0x9E, - 0x79, 0x95, 0xDF, 0x3F, 0x40, 0xF5, 0x12, 0xE2, 0x21, 0x17, - 0xD2, 0x73, 0xC0, 0x28, 0x99, 0x81, 0x87, 0xD5, 0x62, 0x15, - 0xE1, 0x60, 0xC3, 0x28, 0x31, 0x3C, 0xA1, 0x14, 0x0B, 0x07, - 0x81, 0x30, 0x8A, 0x21, 0x38, 0x1C, 0xE4, 0x44, 0x8A, 0x96, - 0xC4, 0xC8, 0x0E, 0x56, 0x40, 0x54, 0x14, 0x00, 0xFF, 0x0C, - 0x84, 0x98, 0xE1, 0x24, 0x05, 0x6F, 0xD8, 0x81, 0x07, 0x05, - 0x7F, 0x98, 0xF1, 0xC9, 0x8D, 0x25, 0x54, 0xC4, 0xC0, 0x8F, - 0x84, 0x38, 0x28, 0x64, 0x08, 0x6B, 0x14, 0xF9, 0xDD, 0x91, - 0x82, 0x24, 0x71, 0x50, 0x06, 0x57, 0x14, 0x62, 0x86, 0x06, - 0x46, 0x7C, 0x61, 0x40, 0x05, 0x06, 0x7C, 0x61, 0x84, 0x06, - 0x8B, 0x18, 0x76, 0x10, 0x4D, 0x5C, 0xFE, 0x21, 0x5E, 0x45, - 0x09, 0x00, 0x70, 0xA3, 0x23, 0x46, 0x7E, 0x93, 0x42, 0x98, - 0x1F, 0xE0, 0xE6, 0xE2, 0x20, 0x66, 0x50, 0x40, 0x41, 0x0B, - 0x4B, 0x0C, 0x30, 0x06, 0x18, 0x90, 0x8E, 0x31, 0xC0, 0x12, - 0x2D, 0x58, 0x89, 0x88, 0x14, 0x26, 0xA5, 0x50, 0x00, 0x93, - 0xA3, 0x2C, 0x80, 0x53, 0x0A, 0x21, 0x70, 0xB8, 0x48, 0xA0, - 0x7E, 0x40, 0x34, 0xC4, 0x99, 0x2A, 0x20, 0x4A, 0x81, 0x00, - 0x03, 0x80, 0xD1, 0xC7, 0xAB, 0xB0, 0xF6, 0xA1, 0xC5, 0x18, - 0x02, 0x58, 0x6A, 0x88, 0x0B, 0x86, 0x92, 0xA6, 0xC0, 0x8A, - 0x96, 0xC4, 0xC1, 0x11, 0x4E, 0x19, 0x3C, 0xB1, 0x93, 0x22, - 0xA4, 0x0E, 0xFA, 0x47, 0x4F, 0xD8, 0x35, 0x79, 0xC7, 0x00, - 0x5E, 0xC4, 0xEA, 0xAC, 0x17, 0x63, 0x18, 0x61, 0xC6, 0x1C, - 0x86, 0xB4, 0x61, 0x26, 0xB0, 0x26, 0x60, 0xD1, 0x09, 0x24, - 0x17, 0x48, 0x85, 0x03, 0x16, 0x89, 0x14, 0xCB, 0xC1, 0x1F, - 0x2D, 0xAE, 0xB3, 0xE5, 0x20, 0x37, 0xC8, 0xA0, 0x83, 0xB3, - 0xEC, 0x82, 0x21, 0xC6, 0x0C, 0x88, 0x80, 0xD5, 0xD4, 0x08, - 0x19, 0x3E, 0xA2, 0xC6, 0xAF, 0x4D, 0x99, 0x20, 0x2A, 0x21, - 0xC5, 0xC6, 0x81, 0xC6, 0x98, 0xE0, 0xFC, 0x20, 0x88, 0x95, - 0x44, 0x0C, 0xC0, 0xEE, 0xC1, 0x03, 0x08, 0x80, 0x08, 0x19, - 0x01, 0x70, 0xC5, 0x42, 0x11, 0x8F, 0x34, 0x10, 0x96, 0x03, - 0x52, 0xA0, 0x03, 0x70, 0xFF, 0xA9, 0x67, 0xC0, 0x40, 0xE0, - 0x37, 0x0E, 0x3C, 0x57, 0x25, 0x1D, 0x7B, 0x68, 0x71, 0x30, - 0xBB, 0x7A, 0xF0, 0x61, 0x6B, 0x21, 0x0B, 0x24, 0x67, 0x12, - 0x85, 0x8F, 0x64, 0x71, 0xD6, 0x01, 0xF2, 0x01, 0xC8, 0x16, - 0x1B, 0x2B, 0xA8, 0x5C, 0x43, 0x98, 0x82, 0xCC, 0x20, 0x43, - 0x10, 0x23, 0x3B, 0x1B, 0x84, 0x18, 0x34, 0x24, 0x82, 0x69, - 0x58, 0x28, 0xF0, 0xB2, 0x48, 0x92, 0x61, 0x4D, 0xC0, 0xEF, - 0xC5, 0x29, 0xA0, 0x71, 0x84, 0xCA, 0x09, 0xC4, 0x31, 0xC8, - 0x09, 0x5C, 0x34, 0xDB, 0x33, 0xAC, 0x41, 0xD4, 0x11, 0x86, - 0x22, 0x43, 0xE4, 0x8A, 0xD4, 0x13, 0xDA, 0x34, 0xE2, 0x81, - 0x67, 0x5C, 0x29, 0x25, 0x33, 0x78, 0x34, 0xAB, 0x9C, 0x02, - 0x1C, 0x83, 0xCC, 0xA0, 0x04, 0xCF, 0x57, 0xBF, 0xAA, 0x03, - 0xD0, 0x8B, 0x60, 0x81, 0x6F, 0x53, 0x0A, 0x3C, 0x42, 0xC0, - 0x04, 0x5E, 0xCB, 0xE4, 0x44, 0x9A, 0x1D, 0xB2, 0x94, 0xF1, - 0xC6, 0x7E, 0x64, 0xC0, 0xA1, 0x19, 0x67, 0x18, 0xE0, 0x6A, - 0xDC, 0x7D, 0xE8, 0xB1, 0x47, 0xCC, 0x89, 0xC0, 0xA1, 0x80, - 0xCA, 0x1D, 0xD5, 0xEB, 0x88, 0x0B, 0x4F, 0xF4, 0xDD, 0x11, - 0x0B, 0x67, 0xB3, 0x13, 0x07, 0x1B, 0x17, 0xFB, 0x41, 0x85, - 0x20, 0x6D, 0x30, 0xF1, 0x82, 0xC1, 0x8C, 0x0F, 0xF0, 0xC2, - 0x23, 0x10, 0xA0, 0x40, 0xF9, 0x3F, 0x23, 0x5C, 0x02, 0xC1, - 0x44, 0x3E, 0x39, 0x21, 0xB0, 0xB8, 0x7F, 0x5C, 0x4B, 0x4F, - 0x14, 0x88, 0xE6, 0xD1, 0x07, 0xDC, 0x3D, 0xEB, 0xC0, 0xC5, - 0x09, 0x96, 0x88, 0xE0, 0x03, 0xD9, 0x38, 0x8D, 0x7E, 0x09, - 0x0C, 0x0C, 0x34, 0x2C, 0xD3, 0x06, 0x81, 0x0F, 0x15, 0xA6, - 0x5E, 0xFF, 0x04, 0xD0, 0x24, 0xAB, 0x57, 0x7B, 0x31, 0x80, - 0x15, 0x54, 0x5E, 0x62, 0xC3, 0x10, 0xBA, 0x77, 0x44, 0xC2, - 0xFF, 0x8F, 0x6E, 0x60, 0x50, 0xEE, 0x3F, 0x4D, 0xFC, 0x71, - 0x06, 0xD3, 0xEE, 0x00, 0x50, 0x11, 0xB8, 0x83, 0xC8, 0x31, - 0x05, 0xB3, 0x07, 0xEB, 0x30, 0xC0, 0x14, 0x4C, 0x9C, 0x6C, - 0x49, 0x1B, 0x58, 0x04, 0x79, 0x52, 0x9E, 0x7F, 0xB0, 0x00, - 0xE1, 0xBE, 0x51, 0x83, 0x38, 0xBC, 0x81, 0x69, 0x61, 0x72, - 0x41, 0x45, 0x38, 0x87, 0x28, 0x39, 0x58, 0x81, 0x0B, 0x03, - 0xD0, 0x82, 0x17, 0xBC, 0xA0, 0x03, 0x2D, 0x0C, 0xA0, 0x0E, - 0x56, 0x60, 0x02, 0x00, 0x05, 0xD1, 0x80, 0x05, 0xFD, 0xC3, - 0x01, 0xB3, 0xC9, 0x53, 0x11, 0x3C, 0xB8, 0x8E, 0x0C, 0xC4, - 0x20, 0x0D, 0x08, 0xFC, 0xC3, 0x1B, 0xBC, 0x71, 0x90, 0x8A, - 0x11, 0x82, 0x02, 0x27, 0x20, 0xC2, 0x1E, 0xC4, 0xA0, 0x04, - 0x31, 0xEC, 0x81, 0x08, 0x37, 0xA0, 0x80, 0xFE, 0xB8, 0x74, - 0x84, 0xBB, 0x89, 0xC3, 0x09, 0x29, 0x21, 0x84, 0x0D, 0x32, - 0xF2, 0x88, 0x0E, 0x08, 0x29, 0x55, 0xEC, 0x13, 0xC4, 0x4D, - 0x0E, 0xE2, 0x00, 0xC0, 0x91, 0x2E, 0x51, 0x5B, 0xA0, 0x41, - 0x18, 0x68, 0x30, 0x8B, 0x44, 0x75, 0x8F, 0x10, 0x22, 0xD8, - 0xC0, 0x1A, 0xC8, 0xB0, 0x03, 0x4B, 0x30, 0xE7, 0x20, 0x02, - 0x2B, 0x04, 0x01, 0x6A, 0x90, 0x05, 0x48, 0xA8, 0x01, 0x79, - 0x3F, 0x14, 0x41, 0x1B, 0x92, 0xF8, 0x87, 0x0F, 0xBC, 0x2E, - 0x05, 0x61, 0xB4, 0x04, 0x1C, 0xA2, 0x90, 0x81, 0x14, 0x9C, - 0xE1, 0x0C, 0x3D, 0xD8, 0x00, 0xE4, 0x46, 0xE5, 0xC3, 0x70, - 0x20, 0xC1, 0x10, 0x6A, 0xA0, 0x08, 0x0F, 0x56, 0xE0, 0x08, - 0x0E, 0x90, 0x30, 0x1C, 0x20, 0x44, 0xA1, 0x87, 0x04, 0x91, - 0x25, 0xD2, 0x40, 0xE8, 0x11, 0x70, 0x20, 0x11, 0x01, 0xCF, - 0xF0, 0x2F, 0x3F, 0xE0, 0x20, 0x55, 0x8D, 0x48, 0x03, 0x0B, - 0xD7, 0xE1, 0x04, 0x5E, 0x0D, 0x22, 0xFF, 0x90, 0x1C, 0x63, - 0x40, 0xD8, 0x14, 0x51, 0x04, 0xCD, 0xF9, 0xA1, 0x07, 0x6F, - 0xA8, 0xE4, 0x6E, 0x06, 0xF1, 0x03, 0x53, 0x86, 0x83, 0x05, - 0x71, 0x4C, 0x84, 0x0A, 0x36, 0x80, 0xC6, 0x1A, 0x50, 0xD2, - 0x20, 0x0E, 0x00, 0x82, 0xD1, 0x10, 0xF1, 0xB4, 0x87, 0xB0, - 0xAD, 0x10, 0xA0, 0x04, 0x47, 0x12, 0x1A, 0xB0, 0xC7, 0x42, - 0x78, 0x89, 0x1E, 0x3C, 0x50, 0x1F, 0x1B, 0x05, 0x71, 0x9D, - 0x8E, 0x38, 0x61, 0x04, 0x40, 0xF8, 0x01, 0x01, 0x18, 0xD2, - 0x06, 0x32, 0xC4, 0x40, 0x08, 0x05, 0x90, 0xC7, 0x3A, 0x6C, - 0xA9, 0xCA, 0x6F, 0x20, 0xA0, 0x03, 0x0C, 0x49, 0x04, 0x09, - 0x0E, 0x12, 0x3B, 0x40, 0x12, 0x28, 0x00, 0x59, 0x28, 0x82, - 0x48, 0x06, 0x91, 0x86, 0x1D, 0x9C, 0xC8, 0x29, 0xD1, 0xD3, - 0x0C, 0x21, 0x60, 0xD0, 0x47, 0xD2, 0x18, 0x43, 0x1A, 0xAF, - 0xE3, 0xE6, 0x98, 0x10, 0x70, 0x81, 0x1D, 0x48, 0x6D, 0x10, - 0x6D, 0xF8, 0xC0, 0x31, 0xE9, 0x01, 0x3D, 0x73, 0x22, 0x24, - 0x01, 0x23, 0x30, 0x41, 0x09, 0x58, 0x80, 0x00, 0x57, 0x16, - 0x2E, 0x55, 0xC5, 0x3A, 0x10, 0x15, 0x1C, 0x7A, 0x16, 0x7D, - 0x22, 0xA4, 0x06, 0x09, 0x2D, 0x01, 0x0F, 0x1A, 0x5A, 0x11, - 0x27, 0x74, 0xD1, 0xA0, 0x87, 0x51, 0x5A, 0x3C, 0x65, 0x64, - 0x08, 0x79, 0x7D, 0x06, 0x1C, 0x16, 0x3D, 0x4C, 0x76, 0x0E, - 0x11, 0xCC, 0xBD, 0x38, 0x80, 0x43, 0x11, 0x3D, 0x04, 0xD2, - 0x4E, 0xEA, 0x87, 0x94, 0xEE, 0x25, 0x03, 0x44, 0x04, 0xE6, - 0x00, 0x91, 0xF2, 0x9F, 0xCE, 0x09, 0xEA, 0x40, 0x83, 0x90, - 0xC2, 0xEB, 0xA4, 0x62, 0xD3, 0xB8, 0x00, 0x20, 0x11, 0x69, - 0xF0, 0x01, 0x45, 0x4D, 0x52, 0x80, 0xA5, 0x2D, 0xF2, 0x10, - 0x0B, 0xA8, 0x27, 0x57, 0x6A, 0xF0, 0xC8, 0x09, 0xED, 0xA5, - 0xA0, 0x8A, 0xC5, 0x70, 0x01, 0x8F, 0xB8, 0x92, 0x81, 0x47, - 0x36, 0x64, 0x99, 0x87, 0xB0, 0xC1, 0xE4, 0xE2, 0x92, 0x82, - 0x0B, 0xFC, 0x49, 0x10, 0x1F, 0x30, 0x41, 0x58, 0x32, 0x70, - 0x54, 0x47, 0x50, 0x81, 0x05, 0x4B, 0x05, 0x87, 0x13, 0x4C, - 0xE0, 0x49, 0x9F, 0x96, 0x0A, 0xA8, 0x86, 0xC8, 0x01, 0x77, - 0xA4, 0x82, 0x00, 0x20, 0x70, 0xCA, 0x10, 0x42, 0xE0, 0x41, - 0x5C, 0xC1, 0xC1, 0x82, 0x9C, 0x5E, 0x2E, 0x04, 0x01, 0x78, - 0x5D, 0x02, 0x48, 0x10, 0x4B, 0x7E, 0x71, 0xC4, 0x09, 0x90, - 0x8D, 0x6C, 0x4D, 0xF1, 0x7A, 0x08, 0x02, 0x0C, 0xC1, 0x04, - 0x68, 0xAC, 0x07, 0x02, 0x0E, 0x80, 0x85, 0x5D, 0x1E, 0xE2, - 0x03, 0x50, 0xA8, 0x4C, 0x45, 0x6A, 0x30, 0x81, 0x05, 0x6C, - 0xCB, 0x13, 0x69, 0x10, 0x81, 0x07, 0x22, 0xE0, 0x83, 0x09, - 0x80, 0x00, 0x04, 0x24, 0xD8, 0xC0, 0x03, 0xFC, 0xA9, 0x88, - 0x36, 0xA8, 0x00, 0x02, 0xB8, 0xCD, 0x2D, 0x6E, 0x55, 0x50, - 0xCC, 0x45, 0xAC, 0x61, 0x07, 0x1D, 0x28, 0x80, 0x02, 0x5C, - 0x8B, 0x82, 0xD8, 0x02, 0x00, 0x03, 0x22, 0x18, 0xA5, 0x23, - 0xDA, 0xB0, 0x02, 0x0C, 0x00, 0x20, 0x04, 0xAE, 0x05, 0xC1, - 0x04, 0x42, 0x20, 0x85, 0x2B, 0xE0, 0x6C, 0x83, 0xD8, 0xCD, - 0xAE, 0x76, 0xB7, 0xCB, 0xDD, 0xEE, 0x7A, 0xF7, 0xBB, 0xE0, - 0x0D, 0xAF, 0x78, 0xC7, 0x4B, 0xDE, 0xF2, 0x32, 0x22, 0x10, - 0x00, 0x3B -}; - -struct fsdata_file const file_img_logo_sics_gif[] = { - { - file_img_logo_ql_jpg, - data_img_logo_sics_gif, - data_img_logo_sics_gif + 19, - sizeof(data_img_logo_sics_gif) - 19 - } -}; - -/* /img/PSiCC2.gif */ -static unsigned char const data_img_PSiCC2_gif[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x50, 0x53, 0x69, 0x43, 0x43, - 0x32, 0x2E, 0x67, 0x69, 0x66, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x64, 0x00, 0x7D, 0x00, - 0xE6, 0x00, 0x00, 0xA6, 0xAE, 0xB7, 0xFD, 0xFE, 0xFC, 0xE3, - 0x30, 0x33, 0xFB, 0xB7, 0xAA, 0x13, 0x28, 0x4A, 0xB4, 0x49, - 0x4A, 0x67, 0x76, 0x8B, 0x20, 0x03, 0x13, 0xF9, 0xC2, 0xB6, - 0xC8, 0x54, 0x51, 0xE3, 0x4C, 0x50, 0x90, 0x9A, 0xA5, 0xE3, - 0xE8, 0xEA, 0xE8, 0x19, 0x1C, 0x9B, 0xA5, 0xAF, 0xF6, 0xAB, - 0x9C, 0x74, 0x82, 0x93, 0xF5, 0x19, 0x1D, 0xEE, 0x1B, 0x1E, - 0xE1, 0x62, 0x64, 0xCF, 0x2F, 0x33, 0x36, 0x49, 0x69, 0x84, - 0x90, 0x9D, 0x74, 0x28, 0x33, 0xF0, 0x8A, 0x79, 0xF9, 0x97, - 0x88, 0xFE, 0xFE, 0xF9, 0xF9, 0x18, 0x1C, 0xCF, 0x70, 0x69, - 0x43, 0x57, 0x76, 0x8D, 0x34, 0x3B, 0xFB, 0xD8, 0xCD, 0x4F, - 0x16, 0x25, 0xB9, 0xC1, 0xC8, 0xD1, 0xD7, 0xDB, 0xB0, 0xB8, - 0xBF, 0xCE, 0xB1, 0xB3, 0xF2, 0xD6, 0xD3, 0xFA, 0x16, 0x1B, - 0x06, 0x1C, 0x48, 0xFB, 0xF1, 0xEB, 0xEA, 0x7D, 0x80, 0xF2, - 0xF3, 0xF3, 0xF5, 0x16, 0x18, 0xFA, 0xEA, 0xE4, 0xCD, 0xD2, - 0xD5, 0xE8, 0x84, 0x84, 0xFB, 0xFD, 0xF3, 0xE9, 0x62, 0x58, - 0xDE, 0xE3, 0xE6, 0xBE, 0x23, 0x2F, 0xFB, 0xFE, 0xFE, 0x9F, - 0x3D, 0x41, 0xAF, 0x70, 0x6C, 0xAD, 0x1E, 0x2F, 0xE5, 0x77, - 0x79, 0xC1, 0xC6, 0xCB, 0xFA, 0xE3, 0xD9, 0xCD, 0x8C, 0x87, - 0xC4, 0xCB, 0xD0, 0x23, 0x34, 0x52, 0xF0, 0x13, 0x17, 0x8E, - 0x4D, 0x4F, 0xEE, 0xF2, 0xF3, 0xE3, 0x3E, 0x43, 0xD6, 0xDC, - 0xE0, 0xFB, 0xFD, 0xFA, 0x4E, 0x61, 0x7C, 0xEE, 0xC8, 0xC3, - 0xF6, 0xFB, 0xFA, 0xFA, 0xFA, 0xF9, 0xF6, 0x8F, 0x80, 0xFB, - 0xCC, 0xBF, 0xE9, 0xEC, 0xEE, 0xEE, 0x0F, 0x12, 0xFD, 0xF6, - 0xF1, 0x72, 0x4E, 0x51, 0xEA, 0x92, 0x92, 0x50, 0x29, 0x32, - 0xE7, 0x59, 0x5C, 0xEC, 0xD0, 0xCC, 0xA7, 0x8E, 0x8E, 0xD7, - 0x61, 0x5A, 0xF7, 0xF8, 0xF6, 0xD9, 0xCC, 0xCA, 0xE5, 0x9F, - 0x97, 0x91, 0x11, 0x1C, 0xE7, 0x6A, 0x6D, 0x3C, 0x0D, 0x1E, - 0xE4, 0x72, 0x6F, 0xEE, 0xEF, 0xEE, 0xF3, 0x0F, 0x18, 0xE6, - 0xDA, 0xDB, 0xF3, 0xF6, 0xF7, 0xDD, 0x23, 0x28, 0x67, 0x36, - 0x3D, 0x5A, 0x42, 0x48, 0x8B, 0x1C, 0x30, 0x28, 0x3D, 0x60, - 0x61, 0x1F, 0x2D, 0xEF, 0x6A, 0x5F, 0xFE, 0xFA, 0xF8, 0xE4, - 0xBE, 0xBB, 0xFC, 0xFC, 0xFC, 0xF8, 0x14, 0x17, 0xF2, 0x19, - 0x18, 0xFA, 0x9E, 0x8D, 0x86, 0x66, 0x68, 0xF9, 0xFB, 0xFD, - 0xE1, 0x1B, 0x1D, 0x2C, 0x1C, 0x3F, 0xEF, 0x11, 0x0E, 0xF2, - 0x8A, 0x91, 0xC9, 0xCF, 0xD4, 0xB2, 0x61, 0x5E, 0xE9, 0x8B, - 0x8D, 0xF1, 0x0E, 0x0F, 0xDB, 0xE0, 0xE2, 0x18, 0x31, 0x58, - 0xE8, 0x09, 0x12, 0x5B, 0x6B, 0x84, 0x81, 0x5B, 0x60, 0xDB, - 0x5A, 0x55, 0xE5, 0x22, 0x27, 0x00, 0x26, 0x53, 0xFE, 0xFE, - 0xFE, 0xF8, 0x19, 0x1C, 0xFF, 0xFF, 0xFF, 0x21, 0xF9, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x7D, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x14, 0x02, - 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, - 0x87, 0x14, 0x62, 0x90, 0x91, 0x92, 0x93, 0x90, 0x3C, 0x05, - 0x88, 0x0D, 0x2B, 0x68, 0x2B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0x9D, 0x26, 0x5E, 0x6E, 0x27, - 0x7C, 0xAC, 0xAD, 0xAE, 0xAF, 0x6E, 0x36, 0x26, 0x2B, 0x69, - 0x9E, 0x0D, 0x7E, 0x1B, 0x7E, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, - 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xBA, 0x1B, 0x11, 0xA9, 0xAF, - 0xC9, 0xB0, 0x32, 0x1B, 0xB9, 0xB9, 0xBA, 0x0D, 0x11, 0x7E, - 0x11, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, - 0xDD, 0xD5, 0x7E, 0xC8, 0xCA, 0xE2, 0x27, 0x32, 0x26, 0x26, - 0xB8, 0xD5, 0xB7, 0xCE, 0xC5, 0x1B, 0x26, 0x68, 0x3D, 0xF0, - 0x68, 0xD2, 0xED, 0xC4, 0xF5, 0xF6, 0xF5, 0x1B, 0x2B, 0xE1, - 0xE2, 0xC9, 0x6E, 0x32, 0xE8, 0xCF, 0xFC, 0xA8, 0xC3, 0xD5, - 0xCC, 0x5D, 0x03, 0x20, 0x4F, 0x12, 0x02, 0x91, 0xB0, 0xA2, - 0x5A, 0xC0, 0x7B, 0x10, 0x21, 0xE6, 0x0A, 0x77, 0x62, 0x15, - 0x2B, 0x8B, 0xC9, 0xC8, 0x35, 0xC3, 0xB5, 0x6B, 0xA0, 0x39, - 0x3F, 0x69, 0x04, 0x4C, 0xD0, 0x03, 0x24, 0x0B, 0xC2, 0x27, - 0x7B, 0x14, 0xA4, 0xD9, 0x18, 0xB1, 0xA5, 0x3D, 0x63, 0xC8, - 0x3A, 0xE0, 0x19, 0x52, 0xA1, 0x66, 0x87, 0x21, 0x38, 0x3B, - 0xF0, 0x68, 0xE5, 0x8F, 0x63, 0x40, 0x8F, 0x26, 0x1A, 0x08, - 0xB8, 0x22, 0xE0, 0x8E, 0x1E, 0x33, 0x0D, 0x94, 0x78, 0x71, - 0xA1, 0xE0, 0x8D, 0x34, 0x97, 0x50, 0x87, 0x4D, 0x74, 0xC3, - 0xA7, 0xC2, 0xCD, 0x9A, 0x56, 0x3B, 0x68, 0xAD, 0x20, 0xC6, - 0x22, 0x39, 0x13, 0xEB, 0xA0, 0xA1, 0x93, 0x27, 0xE1, 0x8A, - 0x97, 0x2D, 0x5E, 0x88, 0xB0, 0x28, 0x7A, 0xA3, 0x8A, 0x82, - 0x3D, 0x4F, 0xFF, 0xA3, 0xCA, 0xFD, 0x75, 0xCC, 0x8D, 0x9D, - 0xBB, 0x04, 0xEE, 0xEA, 0xCD, 0xAB, 0xF7, 0xAE, 0x3F, 0x96, - 0x1D, 0x75, 0xAD, 0xEC, 0x01, 0x44, 0x41, 0xD2, 0x2B, 0x7D, - 0x54, 0x50, 0xD0, 0xA3, 0x45, 0x41, 0xE1, 0x2D, 0x73, 0x23, - 0xF7, 0x42, 0xB3, 0x87, 0x48, 0x92, 0xCB, 0x98, 0x19, 0x68, - 0xDE, 0xCC, 0x99, 0x0B, 0x90, 0x1E, 0x0F, 0x05, 0x0A, 0x4E, - 0xD3, 0xE3, 0x89, 0x80, 0x2D, 0x02, 0x4A, 0xF4, 0x29, 0xA3, - 0x23, 0x87, 0x99, 0x36, 0x02, 0xA4, 0xF4, 0x90, 0x4C, 0xDB, - 0xCF, 0x8A, 0xD4, 0x01, 0xE2, 0xC4, 0xD9, 0xD1, 0x22, 0x4E, - 0x97, 0x3F, 0xC0, 0x83, 0x03, 0x4F, 0xFC, 0x39, 0xF4, 0x2D, - 0x90, 0x26, 0x7A, 0x4C, 0xD8, 0x73, 0x67, 0xCE, 0x9F, 0x29, - 0x45, 0x96, 0xCC, 0xD0, 0x73, 0x67, 0xCF, 0x93, 0x06, 0xA1, - 0x6B, 0xBB, 0x34, 0xB1, 0xA7, 0x44, 0x91, 0x11, 0x00, 0x16, - 0x00, 0x70, 0xA0, 0xE5, 0x4F, 0x1F, 0xE1, 0xE6, 0x67, 0xA0, - 0x28, 0xDE, 0xEB, 0x38, 0xB5, 0xD2, 0x5E, 0x80, 0x2C, 0x21, - 0xA1, 0x63, 0x46, 0x9F, 0xD7, 0xDC, 0x27, 0x1C, 0xD7, 0x2E, - 0x57, 0x5F, 0x89, 0x19, 0x97, 0x31, 0x10, 0x43, 0x0C, 0x97, - 0xA9, 0x90, 0x84, 0x16, 0x2A, 0xA8, 0xA0, 0x45, 0x12, 0x5D, - 0xAC, 0x07, 0x5A, 0x7B, 0xBA, 0x44, 0xB0, 0xC2, 0x16, 0x40, - 0x00, 0xF1, 0xC0, 0x6B, 0x0A, 0x9C, 0x31, 0x83, 0x14, 0x5B, - 0x50, 0xA8, 0xC0, 0x6C, 0xFC, 0xF5, 0xE7, 0xC5, 0x07, 0x33, - 0x8C, 0xE7, 0x80, 0x78, 0x0E, 0x8C, 0xB0, 0x43, 0x78, 0x00, - 0x84, 0xB0, 0xC0, 0x02, 0x0C, 0x2C, 0xC1, 0x1E, 0x2F, 0xEE, - 0x35, 0xD4, 0xC0, 0x04, 0x24, 0x9C, 0x45, 0x01, 0x0B, 0x50, - 0x78, 0x81, 0x46, 0x03, 0x44, 0x9D, 0x13, 0x62, 0x54, 0x11, - 0x74, 0x37, 0x03, 0x03, 0x75, 0x6C, 0x56, 0x47, 0xFF, 0x0C, - 0x9A, 0x25, 0xB1, 0x64, 0x12, 0x31, 0x74, 0xA1, 0xC2, 0x8C, - 0x81, 0x4D, 0x63, 0xCE, 0x1E, 0x26, 0xB5, 0xD1, 0x43, 0x1B, - 0x44, 0xDC, 0x70, 0x47, 0x03, 0x4F, 0x7C, 0x48, 0xCD, 0x90, - 0x50, 0xF9, 0x37, 0x83, 0x03, 0x0E, 0x8C, 0x27, 0x1E, 0x00, - 0x00, 0x8C, 0x80, 0xA6, 0x08, 0xE9, 0x39, 0x68, 0x1C, 0x3A, - 0xB3, 0xEC, 0xB1, 0x07, 0x10, 0x57, 0x00, 0xE1, 0x45, 0x0A, - 0x02, 0xE0, 0xA9, 0xC0, 0x16, 0x1B, 0xA4, 0x41, 0x26, 0x54, - 0x69, 0x18, 0x19, 0x43, 0x10, 0x31, 0xD4, 0x11, 0x04, 0xA2, - 0x89, 0x0E, 0xD8, 0xC5, 0x0C, 0x90, 0x6A, 0xF1, 0x19, 0x58, - 0x34, 0x02, 0x94, 0x46, 0x04, 0x3D, 0x34, 0xE0, 0x85, 0x02, - 0x13, 0x4C, 0x20, 0x85, 0x1E, 0x7B, 0x6C, 0x91, 0x86, 0x04, - 0x11, 0x64, 0x37, 0xA8, 0x54, 0x66, 0x9E, 0x87, 0x1E, 0x7A, - 0x90, 0xAA, 0xF7, 0xA7, 0x90, 0x81, 0x05, 0x1A, 0x81, 0x09, - 0x6F, 0x84, 0x59, 0x21, 0x05, 0x14, 0x00, 0x31, 0x88, 0xAE, - 0x11, 0x48, 0x60, 0xEA, 0xA9, 0xC2, 0xF4, 0xAA, 0xC7, 0x15, - 0x9D, 0x16, 0xDB, 0x29, 0xB1, 0xC8, 0x1A, 0xBB, 0x07, 0xA5, - 0x95, 0x1A, 0x63, 0x8C, 0x72, 0x2E, 0x34, 0x91, 0x42, 0x0A, - 0x70, 0x64, 0x91, 0x45, 0x13, 0x2E, 0xA4, 0xF0, 0x20, 0xB0, - 0x10, 0xAD, 0xF4, 0x06, 0x1D, 0x6F, 0x84, 0xFB, 0xAD, 0x12, - 0x74, 0x94, 0x6B, 0x6E, 0xB8, 0x4A, 0x28, 0x31, 0x6B, 0x58, - 0x02, 0x95, 0x8A, 0x4E, 0x91, 0x7D, 0xEA, 0x29, 0xC0, 0x1E, - 0xF1, 0x2E, 0xF4, 0x50, 0x33, 0xF8, 0xE2, 0x0B, 0x4C, 0xBE, - 0xBC, 0xF0, 0xBB, 0x8B, 0xBF, 0xC2, 0x00, 0x96, 0xEF, 0xC0, - 0xF8, 0xBA, 0x0B, 0x70, 0xBB, 0xCF, 0x18, 0x53, 0x4B, 0x03, - 0x3D, 0x48, 0xB8, 0x49, 0x0F, 0x2B, 0xBC, 0x01, 0x12, 0x4B, - 0x04, 0x0B, 0xDC, 0x6F, 0xFF, 0xC5, 0x18, 0x1F, 0x8C, 0xF1, - 0xBE, 0x19, 0x57, 0xDC, 0x91, 0xC1, 0x05, 0x33, 0xDB, 0x8E, - 0x31, 0xA5, 0x92, 0x3C, 0x26, 0x5D, 0xD9, 0x5C, 0xCC, 0xD2, - 0x3C, 0xFA, 0x4E, 0x73, 0x0D, 0x3B, 0xFC, 0xA6, 0xFC, 0xCB, - 0xC0, 0x1C, 0xB9, 0x1C, 0x41, 0x34, 0x05, 0x6D, 0xD0, 0x43, - 0xBA, 0x4A, 0xC0, 0xE3, 0xF3, 0xCF, 0x10, 0xF7, 0x90, 0x06, - 0xCF, 0x6F, 0x00, 0xFD, 0x33, 0x2F, 0xE9, 0x5E, 0x1A, 0xA1, - 0xCD, 0x71, 0xD9, 0xF3, 0x0D, 0x30, 0xD6, 0xA4, 0x21, 0x75, - 0x35, 0xB5, 0x34, 0xF4, 0x49, 0x1B, 0x11, 0xA4, 0x91, 0x5C, - 0x03, 0x0A, 0x5C, 0x41, 0x86, 0xD7, 0x64, 0xC0, 0x20, 0xB6, - 0xD8, 0x09, 0x39, 0xF6, 0x44, 0x01, 0x73, 0xCC, 0x21, 0xED, - 0xD8, 0x30, 0x24, 0xF4, 0xC4, 0x15, 0x09, 0x58, 0x21, 0xB7, - 0x0D, 0x29, 0xB8, 0x40, 0x81, 0x0C, 0xB8, 0xDE, 0x2D, 0x83, - 0x0C, 0x36, 0xF4, 0xED, 0xB7, 0xDC, 0x80, 0x07, 0x0E, 0xB8, - 0x0D, 0x79, 0x0B, 0xEE, 0xF7, 0xDE, 0x88, 0xDF, 0xAD, 0xB8, - 0x20, 0xB8, 0xEE, 0x5A, 0x21, 0x10, 0x0D, 0x98, 0x20, 0x01, - 0x61, 0x0F, 0x7C, 0x80, 0xC4, 0xE5, 0x08, 0x0C, 0x30, 0xC0, - 0x03, 0x0F, 0xA8, 0xA1, 0x46, 0x06, 0x47, 0x60, 0x50, 0xC3, - 0x03, 0x4C, 0x3C, 0x3A, 0x03, 0x0B, 0x9E, 0x7F, 0x9E, 0xC1, - 0xEA, 0x4D, 0xAC, 0xB1, 0x86, 0x1B, 0x58, 0x60, 0x81, 0xC3, - 0x0B, 0x3A, 0xD0, 0x60, 0xBB, 0x07, 0xB8, 0x7B, 0x70, 0xC1, - 0x05, 0x63, 0xF4, 0x0E, 0x02, 0x08, 0xB1, 0x63, 0x71, 0xC0, - 0xF0, 0xC4, 0x0F, 0x8F, 0x85, 0xED, 0x05, 0x00, 0x1F, 0xFC, - 0xEF, 0x20, 0x8C, 0xB1, 0x3B, 0xEE, 0xB6, 0xD3, 0xE0, 0x41, - 0x01, 0xD4, 0x17, 0x90, 0xC0, 0xF5, 0x7A, 0xE8, 0x41, 0x06, - 0x19, 0x6D, 0x24, 0x27, 0x00, 0x02, 0x3C, 0x22, 0x80, 0x44, - 0xFF, 0xE6, 0x9B, 0x77, 0xFE, 0xF9, 0x11, 0x47, 0x70, 0xC0, - 0xC1, 0x03, 0x20, 0xE0, 0xA0, 0xA1, 0x16, 0xAA, 0xAF, 0x2E, - 0x3F, 0x08, 0x4E, 0xE4, 0xF1, 0xC5, 0x01, 0x79, 0xA0, 0x80, - 0x84, 0x0F, 0xD1, 0xE7, 0xBE, 0xFB, 0xEE, 0x63, 0xF8, 0x5D, - 0xF0, 0x0E, 0x20, 0xBC, 0xE2, 0x0D, 0xEF, 0x02, 0xD4, 0xF3, - 0xC0, 0xF2, 0x7E, 0xD7, 0xBB, 0x06, 0x7A, 0xE0, 0x76, 0x34, - 0xA8, 0x5E, 0x02, 0xAC, 0x97, 0x80, 0xEC, 0xE9, 0x01, 0x06, - 0xDD, 0x53, 0xC2, 0x1C, 0x58, 0xF0, 0x01, 0x22, 0x60, 0xAE, - 0x7C, 0xE6, 0xCB, 0x00, 0x06, 0x8E, 0x20, 0x87, 0x2A, 0x54, - 0xE1, 0x00, 0x10, 0xD0, 0xC0, 0x19, 0x96, 0xF0, 0x00, 0xF9, - 0xC9, 0x4F, 0x0D, 0x3E, 0x20, 0x20, 0x18, 0x98, 0xE0, 0x04, - 0x28, 0xB0, 0x40, 0x07, 0x0F, 0x94, 0x9E, 0xF4, 0xFE, 0xE7, - 0xBB, 0x01, 0x1A, 0xB0, 0x78, 0x58, 0x28, 0x40, 0x04, 0x85, - 0x47, 0x44, 0x2C, 0xFC, 0xEE, 0x7F, 0x17, 0x80, 0x5E, 0x04, - 0xAB, 0x67, 0x3D, 0x0A, 0x66, 0x2F, 0x72, 0x6D, 0x18, 0x40, - 0x0E, 0x2E, 0x37, 0x3E, 0xF2, 0x71, 0xCE, 0x73, 0xE8, 0x23, - 0xE1, 0x03, 0x9A, 0x70, 0x00, 0x27, 0xA0, 0xA0, 0x0F, 0x42, - 0x30, 0x43, 0x06, 0xE2, 0x37, 0xC6, 0x18, 0x82, 0xE0, 0x00, - 0x6E, 0x60, 0x82, 0x19, 0x58, 0x60, 0x86, 0xE8, 0x45, 0x0F, - 0x80, 0xBC, 0x13, 0x60, 0xEC, 0x08, 0xF8, 0xC3, 0xE1, 0x4D, - 0xAF, 0x00, 0x17, 0x08, 0x9E, 0x1E, 0x9B, 0xE7, 0xBC, 0xDC, - 0x2D, 0x91, 0x89, 0x15, 0xBC, 0x20, 0x19, 0x22, 0xE7, 0x05, - 0x04, 0xE4, 0xC0, 0x72, 0x1F, 0xE4, 0x9C, 0xF9, 0x8E, 0x90, - 0x81, 0x14, 0xC8, 0x61, 0x00, 0x3A, 0x18, 0x1E, 0x09, 0xFE, - 0x10, 0x80, 0x0F, 0xB8, 0x70, 0x75, 0x6A, 0xE0, 0x80, 0x11, - 0x89, 0xB7, 0x06, 0x16, 0xE4, 0xA0, 0xFF, 0x06, 0x39, 0x7C, - 0x63, 0x1C, 0x95, 0x47, 0xC4, 0x3A, 0x0E, 0x6F, 0x0C, 0xD4, - 0xA3, 0xC1, 0xF2, 0x1A, 0xE8, 0xBB, 0x3E, 0x86, 0x32, 0x82, - 0xD7, 0x0B, 0x24, 0x0C, 0x06, 0xB9, 0x82, 0x3D, 0x98, 0xE1, - 0x03, 0x88, 0x44, 0x80, 0x15, 0x3B, 0x27, 0xC2, 0x0C, 0xA8, - 0x0F, 0x01, 0x35, 0x18, 0x1E, 0x13, 0x34, 0x60, 0x04, 0x14, - 0xB4, 0xD0, 0x73, 0xF2, 0x9B, 0xC3, 0x18, 0x80, 0x68, 0x43, - 0x12, 0xE4, 0x50, 0x88, 0x42, 0xDC, 0x1D, 0xF0, 0x94, 0x67, - 0x3C, 0x53, 0x1E, 0x8F, 0x7A, 0xA4, 0x8C, 0x9D, 0xF3, 0xFE, - 0xA7, 0x3B, 0x3F, 0x52, 0x2F, 0x96, 0xD9, 0x9B, 0x65, 0x26, - 0xF6, 0x20, 0x45, 0x5C, 0x8A, 0x6F, 0x97, 0x6A, 0x40, 0x5F, - 0x06, 0x6A, 0xA0, 0x03, 0x60, 0x12, 0x8F, 0x0A, 0x2B, 0x84, - 0xC2, 0xEA, 0x18, 0xE9, 0x39, 0x17, 0x2C, 0xB3, 0x78, 0x51, - 0x58, 0xC2, 0x07, 0x6A, 0x10, 0xC1, 0x7E, 0x16, 0xC0, 0x03, - 0x01, 0x24, 0x25, 0x1D, 0xEB, 0x28, 0xBC, 0x3B, 0x2A, 0x30, - 0x76, 0xCC, 0x63, 0xA0, 0x2B, 0x95, 0x08, 0x4B, 0x59, 0x0E, - 0x72, 0x03, 0x85, 0x3C, 0xE4, 0x07, 0x74, 0x89, 0x4E, 0x0C, - 0x8C, 0x71, 0x74, 0x03, 0x08, 0xA6, 0xF0, 0xF2, 0xF0, 0x87, - 0x25, 0xB0, 0xE0, 0x01, 0x18, 0x20, 0x43, 0x16, 0x30, 0xA0, - 0x06, 0x39, 0x9C, 0xB1, 0x78, 0x60, 0x40, 0x01, 0x0B, 0x10, - 0xC0, 0x01, 0xE4, 0x55, 0xCF, 0x03, 0x09, 0x9D, 0xE3, 0x40, - 0x7F, 0x88, 0x4A, 0x21, 0xCA, 0x51, 0xA1, 0xBD, 0xDB, 0xDD, - 0x12, 0xA3, 0xF7, 0xCD, 0x70, 0xD2, 0xB2, 0x32, 0x12, 0xA5, - 0xA8, 0xE6, 0x38, 0x27, 0x42, 0x35, 0x54, 0xE1, 0x91, 0x90, - 0xD4, 0x23, 0x15, 0x02, 0xB0, 0x04, 0x04, 0x84, 0x54, 0x6C, - 0x52, 0x28, 0x00, 0x13, 0x7E, 0x48, 0x05, 0x14, 0x7C, 0xA0, - 0x09, 0x37, 0xFF, 0x60, 0x22, 0xF5, 0x2E, 0xC0, 0x3C, 0x3D, - 0x12, 0xAF, 0x80, 0x60, 0x5D, 0x62, 0x40, 0x03, 0x18, 0x50, - 0x10, 0x3C, 0xCF, 0xA5, 0x42, 0x44, 0x9E, 0x05, 0xF5, 0x80, - 0x9D, 0x88, 0xE2, 0xB2, 0x8A, 0x43, 0x05, 0xE9, 0x11, 0x20, - 0x59, 0x83, 0xCC, 0x55, 0x81, 0x9A, 0x79, 0xD0, 0xC0, 0x14, - 0x58, 0xF0, 0x54, 0x18, 0x50, 0x2F, 0x86, 0x06, 0x8C, 0xC2, - 0x0B, 0x72, 0x00, 0xD2, 0x39, 0x4C, 0x90, 0x89, 0x5C, 0xCD, - 0xE6, 0x4C, 0x8D, 0x17, 0x3B, 0x83, 0x32, 0xCF, 0x79, 0x0D, - 0x7C, 0xDE, 0x03, 0xB5, 0x8A, 0xBC, 0x0A, 0xFE, 0x94, 0x08, - 0x12, 0x85, 0x6B, 0xF9, 0xB2, 0xA0, 0x86, 0x07, 0x14, 0xA0, - 0x9D, 0x03, 0x40, 0x00, 0x13, 0x8C, 0x68, 0x44, 0x2A, 0xBC, - 0x00, 0x05, 0x55, 0xD8, 0x1E, 0x0C, 0x22, 0x28, 0x87, 0x1F, - 0xA6, 0x94, 0x05, 0x48, 0xC0, 0xC0, 0x08, 0x39, 0xF0, 0xCD, - 0x09, 0x72, 0x55, 0x8F, 0x45, 0xC4, 0x2D, 0x16, 0x6A, 0x5A, - 0x80, 0x00, 0xF2, 0x2E, 0xB2, 0x49, 0x7C, 0xE0, 0x64, 0x0F, - 0xEB, 0xCF, 0x0B, 0x12, 0xD2, 0x90, 0x6F, 0x0D, 0xED, 0x50, - 0xD5, 0x30, 0x81, 0xA3, 0x7A, 0x40, 0x73, 0xA1, 0xF5, 0x81, - 0x11, 0x81, 0xC7, 0x84, 0x25, 0x58, 0x35, 0x0B, 0x64, 0xD0, - 0x03, 0x0D, 0xE4, 0xD0, 0x5A, 0xAA, 0xA2, 0x20, 0x07, 0x22, - 0xB4, 0x68, 0x16, 0x24, 0xD8, 0x5B, 0xDD, 0x9A, 0xF7, 0x77, - 0x4D, 0x1C, 0xC3, 0x74, 0x01, 0xB8, 0x4D, 0x1D, 0xFE, 0x31, - 0x82, 0x9F, 0xFA, 0xE6, 0x38, 0x31, 0xFB, 0xD6, 0xCC, 0x65, - 0xAE, 0x73, 0x2E, 0x50, 0x9F, 0x1C, 0xC8, 0x37, 0x80, 0x2F, - 0x4C, 0xF7, 0x77, 0x24, 0xB0, 0x6E, 0x15, 0x56, 0x6B, 0x3D, - 0x39, 0xB8, 0xE1, 0x87, 0x82, 0x65, 0xC1, 0x00, 0x64, 0x3B, - 0x42, 0x17, 0xC4, 0x72, 0x82, 0xD3, 0x44, 0x28, 0xFF, 0x29, - 0x13, 0x0A, 0x82, 0xE9, 0x25, 0x40, 0x81, 0x7C, 0xCC, 0x69, - 0x70, 0xDD, 0x98, 0xD6, 0x40, 0xEA, 0x41, 0x0A, 0x09, 0x38, - 0x6E, 0x66, 0x75, 0x19, 0xD7, 0x2A, 0x64, 0xC0, 0x05, 0x75, - 0x0D, 0x6D, 0x15, 0xBE, 0xE0, 0x83, 0xAE, 0x32, 0x81, 0x05, - 0x56, 0x6D, 0x29, 0x88, 0x39, 0xE0, 0x04, 0xD7, 0x5A, 0xF7, - 0xAA, 0xE8, 0x1B, 0x21, 0x06, 0x40, 0x7C, 0xBD, 0x02, 0x18, - 0x71, 0x0C, 0x4E, 0xA0, 0x30, 0x4E, 0xEF, 0x98, 0x3C, 0xB3, - 0xFE, 0xF6, 0xAC, 0xAF, 0xA4, 0x5E, 0x38, 0x61, 0xA0, 0xBD, - 0x71, 0x22, 0xD7, 0x72, 0xFC, 0x7D, 0x00, 0x02, 0x3A, 0xC7, - 0x81, 0x76, 0xEA, 0xB2, 0x06, 0x4C, 0xB8, 0x2B, 0x03, 0xB1, - 0x90, 0x4F, 0x14, 0xD4, 0x8E, 0x0C, 0x09, 0xE0, 0xC0, 0xFD, - 0xA8, 0x6A, 0xDD, 0x07, 0x64, 0x71, 0x84, 0xE9, 0xAB, 0xA0, - 0x14, 0x68, 0xD0, 0xBC, 0x84, 0xB2, 0x72, 0x9B, 0x08, 0x9C, - 0xA0, 0xEE, 0x92, 0xC8, 0xBB, 0xE0, 0x5E, 0xC0, 0xBD, 0xB6, - 0x73, 0x68, 0x76, 0x09, 0x49, 0xDF, 0xE4, 0x42, 0x77, 0xCA, - 0x0F, 0xA8, 0x41, 0x15, 0x90, 0x30, 0x00, 0x24, 0x7C, 0xA1, - 0xAE, 0x2D, 0x6E, 0xE0, 0x17, 0x4A, 0xC0, 0x82, 0x3C, 0x48, - 0x01, 0xCC, 0x52, 0x00, 0x6C, 0x60, 0x35, 0xB0, 0x04, 0x22, - 0x64, 0x31, 0xC7, 0x47, 0xB8, 0x41, 0x05, 0x27, 0xC0, 0xE6, - 0xC8, 0x6A, 0x98, 0xBD, 0xB0, 0xA4, 0x81, 0x64, 0x93, 0x28, - 0x3D, 0x3F, 0xEA, 0xB0, 0x82, 0x62, 0x53, 0x6D, 0xE4, 0xF6, - 0xF0, 0xE4, 0xCB, 0xFD, 0x99, 0x73, 0x19, 0x35, 0x03, 0x89, - 0x9D, 0x50, 0x05, 0x04, 0xE8, 0x20, 0xC3, 0x20, 0xA8, 0x01, - 0x09, 0x7C, 0x80, 0x00, 0x18, 0x84, 0xB9, 0xBB, 0x06, 0x04, - 0x83, 0x11, 0x3C, 0x9A, 0xCE, 0x4B, 0xE7, 0xF8, 0x53, 0x9C, - 0xFE, 0x34, 0x12, 0xE1, 0xFF, 0x48, 0x5C, 0xDC, 0xE9, 0xD4, - 0x8D, 0x1C, 0x8E, 0xE5, 0xA7, 0xC4, 0xD6, 0x00, 0x34, 0xA4, - 0x25, 0xB3, 0xE3, 0x0B, 0x2D, 0xA0, 0x49, 0x20, 0x87, 0xF1, - 0x21, 0x41, 0x07, 0x4E, 0xB0, 0x2B, 0x40, 0x15, 0xED, 0x03, - 0x1D, 0xA0, 0xC0, 0x05, 0x05, 0x98, 0x00, 0xB0, 0x0D, 0x48, - 0x85, 0x32, 0x4C, 0x61, 0x00, 0x8C, 0x04, 0x9D, 0xB1, 0xC3, - 0x36, 0x81, 0x39, 0x2F, 0xBB, 0xCE, 0xCE, 0xA3, 0xE0, 0xED, - 0x48, 0xAD, 0xC3, 0x54, 0xF2, 0x14, 0x7B, 0xDB, 0x1B, 0x24, - 0x2A, 0x5A, 0x9D, 0x6D, 0x22, 0x70, 0xCE, 0xD6, 0x35, 0xF0, - 0x36, 0x13, 0xF2, 0x30, 0xE5, 0x2A, 0xD4, 0xE0, 0xCD, 0x17, - 0x50, 0x8B, 0x19, 0xE4, 0x20, 0x05, 0x0E, 0x98, 0xD2, 0x02, - 0x7F, 0x28, 0x03, 0x14, 0x38, 0x20, 0xEF, 0x1C, 0x33, 0x18, - 0xBB, 0x52, 0xB0, 0x37, 0x12, 0xD5, 0xFB, 0xBC, 0x54, 0x72, - 0xF3, 0x95, 0x93, 0x05, 0x64, 0xF6, 0x1E, 0xCD, 0xE7, 0x43, - 0xE6, 0x80, 0x05, 0x30, 0x7F, 0x79, 0x0E, 0x66, 0x0E, 0x05, - 0x1B, 0xC2, 0x9C, 0x04, 0x36, 0x3C, 0x64, 0x09, 0x48, 0xC0, - 0xF3, 0x9E, 0xB3, 0x60, 0x09, 0x4B, 0x80, 0x02, 0x11, 0x88, - 0x40, 0x02, 0x34, 0x19, 0x1D, 0x00, 0x51, 0xC0, 0x41, 0x1F, - 0x8C, 0xA0, 0x02, 0x33, 0x94, 0xE0, 0xE9, 0x50, 0x87, 0x7A, - 0x07, 0x89, 0x60, 0x86, 0x9E, 0x5B, 0xFD, 0xEA, 0x66, 0xC8, - 0x7A, 0xCF, 0xAB, 0xAE, 0x75, 0x12, 0x64, 0x3D, 0xEB, 0x54, - 0xFF, 0xFA, 0xD0, 0x89, 0xB0, 0x6A, 0x22, 0xA0, 0x40, 0x3A, - 0x33, 0x08, 0x40, 0x00, 0x66, 0x20, 0x84, 0x56, 0x41, 0xAA, - 0xED, 0x6C, 0x80, 0x54, 0x1F, 0x5A, 0xF5, 0x87, 0x19, 0x08, - 0x67, 0x06, 0x45, 0xB0, 0x3B, 0xA4, 0x56, 0x05, 0x1C, 0x0D, - 0x08, 0x81, 0x0D, 0x71, 0xB7, 0x4F, 0x1F, 0xFA, 0xA0, 0xF6, - 0xFF, 0xC2, 0xDB, 0x87, 0xEF, 0x88, 0x4F, 0xBC, 0xE2, 0x85, - 0x53, 0xED, 0xB4, 0xAC, 0xFD, 0x0C, 0xC1, 0x11, 0x02, 0xE4, - 0x81, 0xB3, 0xF6, 0xB4, 0xFF, 0x41, 0x08, 0x46, 0x30, 0x82, - 0xAA, 0x02, 0x30, 0xF9, 0xE1, 0xFC, 0x81, 0x0D, 0x9D, 0x2F, - 0x82, 0x10, 0x34, 0x40, 0xF9, 0xF3, 0x04, 0x40, 0xF4, 0x67, - 0x38, 0x03, 0xE7, 0x53, 0x2F, 0x84, 0xD6, 0x8F, 0xBE, 0xF5, - 0x1A, 0x70, 0xBB, 0xEC, 0x5D, 0x0F, 0x7B, 0xBF, 0xD3, 0xBE, - 0xF5, 0x67, 0xB8, 0x7D, 0xAB, 0x68, 0x4F, 0x48, 0x28, 0x00, - 0x27, 0x08, 0x27, 0x22, 0x4F, 0x1D, 0x82, 0xCF, 0x00, 0xE0, - 0xE0, 0x60, 0x01, 0x49, 0x00, 0x4E, 0x1D, 0x2C, 0x00, 0x01, - 0x11, 0x88, 0xC0, 0x02, 0xC1, 0xC7, 0x01, 0x00, 0xFA, 0xA0, - 0x85, 0x05, 0x18, 0x60, 0x04, 0x6A, 0xFF, 0x41, 0x8A, 0x80, - 0x33, 0x82, 0x38, 0x50, 0xB2, 0xF0, 0xE0, 0x37, 0x3C, 0xE7, - 0x77, 0x2F, 0xF9, 0xD4, 0x9B, 0x1F, 0xFC, 0xAD, 0x57, 0xBB, - 0x86, 0xCE, 0x1F, 0x00, 0x0D, 0xB8, 0x5F, 0xF5, 0xAA, 0x07, - 0x7F, 0xE3, 0x4B, 0x00, 0x1C, 0x07, 0x9C, 0xC0, 0x00, 0x15, - 0x18, 0x82, 0xFD, 0xF1, 0x5F, 0x81, 0x22, 0x68, 0xA0, 0x02, - 0x27, 0xB0, 0x00, 0x7F, 0x10, 0x04, 0x76, 0x30, 0x04, 0x78, - 0xC0, 0x03, 0x0B, 0x80, 0x07, 0x04, 0x20, 0x06, 0x10, 0x60, - 0x00, 0x3C, 0xD0, 0x05, 0x1D, 0x50, 0x01, 0x10, 0x40, 0x00, - 0x00, 0xF0, 0x07, 0x00, 0x70, 0x02, 0x3C, 0xF0, 0x03, 0x7F, - 0xC0, 0x80, 0xE6, 0x31, 0x78, 0x1E, 0xF8, 0x81, 0x1F, 0x18, - 0x00, 0x20, 0x38, 0x82, 0x24, 0x58, 0x82, 0x26, 0xD8, 0x07, - 0xF3, 0x57, 0x7F, 0x3C, 0xF0, 0x07, 0x21, 0x60, 0x07, 0x0B, - 0xC0, 0x03, 0x33, 0x30, 0x02, 0x27, 0xF0, 0x03, 0x38, 0x20, - 0x06, 0xF8, 0xF7, 0x07, 0x10, 0x20, 0xFF, 0x06, 0x45, 0xD0, - 0x07, 0x23, 0x50, 0x7C, 0x15, 0x80, 0x71, 0x16, 0x50, 0x01, - 0x32, 0x08, 0x27, 0x21, 0xD0, 0x02, 0x7F, 0xD0, 0x01, 0x06, - 0x20, 0x06, 0x15, 0xF8, 0x83, 0x1D, 0x78, 0x82, 0x4E, 0xF8, - 0x84, 0x50, 0xE8, 0x81, 0x29, 0x68, 0x81, 0x27, 0x30, 0x04, - 0x62, 0x80, 0x07, 0x17, 0x58, 0x01, 0x04, 0x80, 0x71, 0x78, - 0x80, 0x07, 0x31, 0x40, 0x00, 0x41, 0x30, 0x13, 0x19, 0xF7, - 0x07, 0x1A, 0xD0, 0x07, 0x62, 0x00, 0x84, 0x15, 0xF0, 0x82, - 0x3F, 0x40, 0x7A, 0x7F, 0x20, 0x02, 0x76, 0x50, 0x07, 0x06, - 0x30, 0x04, 0x7F, 0xC0, 0x84, 0x51, 0x58, 0x87, 0x76, 0x38, - 0x82, 0x53, 0x08, 0x00, 0x04, 0x90, 0x22, 0x7D, 0x00, 0x00, - 0x76, 0xD0, 0x82, 0x23, 0xD0, 0x05, 0x76, 0xC0, 0x03, 0x1D, - 0x70, 0x02, 0xCC, 0x57, 0x01, 0xC6, 0xE7, 0x83, 0x68, 0x78, - 0x81, 0x31, 0xF0, 0x07, 0x2D, 0x10, 0x03, 0x0B, 0x70, 0x02, - 0x1D, 0x20, 0x06, 0x04, 0xC0, 0x00, 0x4C, 0xD8, 0x84, 0x77, - 0x98, 0x89, 0x4F, 0x38, 0x85, 0x0E, 0x40, 0x00, 0x1A, 0xF8, - 0x07, 0x9D, 0x18, 0x00, 0x39, 0x68, 0x01, 0x3C, 0xC0, 0x1B, - 0x10, 0xC0, 0x03, 0x21, 0x40, 0x00, 0x10, 0x00, 0x01, 0x27, - 0xB0, 0x03, 0x7F, 0xC0, 0x03, 0x10, 0xF0, 0x07, 0xA4, 0x98, - 0x04, 0x62, 0xA0, 0x7F, 0x5B, 0x08, 0x8B, 0x2D, 0xB0, 0x03, - 0x04, 0xB0, 0x00, 0x35, 0x01, 0x01, 0x0B, 0xD0, 0x7E, 0x9A, - 0x18, 0x8C, 0x26, 0x38, 0x85, 0x71, 0x60, 0x01, 0x5D, 0x10, - 0x00, 0x8E, 0x68, 0x01, 0x53, 0x10, 0x03, 0x16, 0x60, 0x01, - 0x15, 0xF8, 0x07, 0x0C, 0x00, 0x01, 0x0C, 0x80, 0x03, 0x5D, - 0x18, 0x02, 0x75, 0xB7, 0x00, 0xD6, 0x78, 0x7C, 0x03, 0x18, - 0x87, 0x00, 0xC0, 0x8C, 0xC5, 0x67, 0x81, 0xE3, 0xD1, 0x80, - 0x0B, 0x20, 0xFF, 0x04, 0x2F, 0x20, 0x8C, 0xE6, 0x08, 0x82, - 0x29, 0x28, 0x82, 0x98, 0x48, 0x49, 0x6C, 0xD8, 0x07, 0x65, - 0x88, 0x8C, 0x1A, 0xA0, 0x76, 0xC0, 0x11, 0x77, 0xC3, 0xE1, - 0x8E, 0xAA, 0xA7, 0x2A, 0xE7, 0x51, 0x86, 0x83, 0xA7, 0x8E, - 0xC0, 0xD1, 0x76, 0xE7, 0x78, 0x1E, 0xE7, 0x98, 0x8E, 0x00, - 0x89, 0x8C, 0xC1, 0x41, 0x78, 0x04, 0x49, 0x7A, 0xEE, 0xD8, - 0x07, 0xB9, 0x67, 0x77, 0xE6, 0xC1, 0x86, 0x7D, 0x27, 0x04, - 0xE6, 0x51, 0x04, 0x89, 0xA7, 0x7A, 0x05, 0x49, 0x79, 0xC8, - 0xA8, 0x90, 0xF8, 0x48, 0x90, 0x9E, 0x57, 0x91, 0xF5, 0x98, - 0x89, 0x53, 0x58, 0x07, 0x00, 0xD0, 0x05, 0x1A, 0x30, 0x02, - 0x2D, 0xD0, 0x02, 0x0B, 0x60, 0x84, 0x53, 0x30, 0x1E, 0x5A, - 0x00, 0x00, 0x70, 0xE2, 0x8E, 0xC4, 0xE4, 0x00, 0x06, 0xE0, - 0x00, 0x90, 0x88, 0x26, 0x0B, 0x20, 0x02, 0x53, 0xE0, 0x00, - 0xD6, 0x18, 0x1E, 0x27, 0x32, 0x02, 0x2E, 0xF2, 0x22, 0x5A, - 0xC0, 0x06, 0x30, 0x59, 0x81, 0x71, 0x30, 0x02, 0x7F, 0xD0, - 0x05, 0x00, 0x50, 0x07, 0x7F, 0x90, 0x04, 0x0B, 0x80, 0x03, - 0x1A, 0xD0, 0x05, 0x23, 0xF0, 0x22, 0x3B, 0xC0, 0x00, 0x0B, - 0x40, 0x93, 0x75, 0x80, 0x03, 0x06, 0x60, 0x01, 0x31, 0x10, - 0x8F, 0x77, 0x98, 0x87, 0x9E, 0x38, 0x87, 0xCD, 0x78, 0x00, - 0x72, 0x18, 0x07, 0x27, 0x40, 0x00, 0x22, 0x80, 0x80, 0x64, - 0x48, 0x7A, 0xA4, 0x68, 0x01, 0x62, 0xB0, 0x00, 0x39, 0x48, - 0x00, 0x43, 0x80, 0x03, 0x21, 0x30, 0x96, 0x3F, 0x60, 0x01, - 0x85, 0xD8, 0x01, 0xBC, 0x68, 0x83, 0xD2, 0x78, 0x80, 0x13, - 0xE8, 0x00, 0x10, 0x80, 0x88, 0x3F, 0x40, 0x81, 0xA0, 0x78, - 0x02, 0x62, 0x60, 0x04, 0x53, 0xC0, 0x03, 0x15, 0x60, 0x00, - 0xBB, 0xE8, 0x80, 0x76, 0x80, 0x07, 0x0B, 0x60, 0xFF, 0x07, - 0x41, 0x18, 0x8B, 0xF1, 0x57, 0x87, 0x53, 0x38, 0x02, 0x19, - 0x78, 0x84, 0x0B, 0x10, 0x84, 0x62, 0x90, 0x04, 0x98, 0x29, - 0x02, 0x62, 0xE0, 0x00, 0x67, 0xF9, 0x07, 0x07, 0x58, 0x07, - 0x5D, 0xC0, 0x06, 0xB2, 0xD8, 0x01, 0xC0, 0x61, 0x80, 0x15, - 0xE0, 0x99, 0x41, 0x00, 0x86, 0x73, 0x08, 0x01, 0x84, 0x29, - 0x96, 0x38, 0xF0, 0x07, 0x3B, 0x20, 0x02, 0x39, 0x18, 0x03, - 0x71, 0x40, 0x00, 0x44, 0x29, 0x81, 0x62, 0x10, 0x02, 0x1A, - 0xD0, 0x99, 0xAF, 0xC8, 0x85, 0x72, 0x78, 0x81, 0x21, 0x50, - 0x06, 0x45, 0xF0, 0x02, 0x22, 0x68, 0x87, 0x93, 0x59, 0x99, - 0x1D, 0xC0, 0x7C, 0x33, 0xB1, 0x00, 0xCB, 0x29, 0x06, 0x9C, - 0xE9, 0x99, 0xED, 0xF7, 0x07, 0x31, 0x30, 0x04, 0x55, 0xD8, - 0x88, 0x7D, 0x49, 0x9D, 0x76, 0x40, 0x9B, 0xA6, 0x29, 0x02, - 0x64, 0x79, 0x84, 0x0B, 0x38, 0x04, 0x7A, 0x58, 0x07, 0x67, - 0x70, 0x1E, 0x16, 0x70, 0x02, 0x35, 0x71, 0x02, 0x21, 0xE0, - 0x86, 0x0C, 0x60, 0x80, 0x1B, 0x08, 0x09, 0x15, 0x80, 0x94, - 0x62, 0xD8, 0x05, 0x13, 0xB8, 0x9B, 0xF2, 0x78, 0x9C, 0x50, - 0x38, 0x99, 0x76, 0xA0, 0x81, 0x69, 0x68, 0x01, 0x31, 0x29, - 0x06, 0x15, 0xB0, 0x03, 0xD0, 0xA9, 0x84, 0x0D, 0x19, 0x00, - 0x3F, 0xB0, 0x8C, 0x3C, 0x80, 0x07, 0xB2, 0x88, 0x88, 0x91, - 0x38, 0x89, 0x95, 0xB8, 0x9A, 0x70, 0x22, 0x81, 0xA3, 0xB7, - 0x03, 0x27, 0xE0, 0x7D, 0x41, 0x40, 0x9B, 0xFD, 0xC7, 0x00, - 0x7F, 0x78, 0x9E, 0x93, 0xC8, 0x03, 0xB4, 0x78, 0x88, 0x76, - 0x27, 0x86, 0x09, 0xF2, 0x03, 0x07, 0x38, 0x05, 0xEC, 0x28, - 0x99, 0xD6, 0x46, 0x7F, 0xD4, 0x49, 0x00, 0x57, 0x49, 0x00, - 0x2D, 0x60, 0x00, 0x78, 0xC0, 0x00, 0xF7, 0xF7, 0x85, 0x65, - 0xD9, 0x01, 0x10, 0xE0, 0xFF, 0x00, 0xE7, 0x81, 0x7F, 0x00, - 0xC0, 0x03, 0x18, 0xD7, 0x97, 0x67, 0xC0, 0x03, 0x06, 0x20, - 0x02, 0x3B, 0xC0, 0xA3, 0x75, 0x70, 0x02, 0x70, 0x02, 0xA0, - 0xCD, 0x18, 0x03, 0x35, 0xE1, 0x00, 0x8E, 0x99, 0x9D, 0x5A, - 0xB0, 0x87, 0x3C, 0x2A, 0x02, 0xA9, 0xF8, 0x82, 0x0E, 0x20, - 0xA3, 0x9E, 0x89, 0x07, 0xA6, 0xB9, 0xA3, 0x00, 0xA0, 0x15, - 0x42, 0xA0, 0x76, 0xC8, 0x99, 0xA2, 0x84, 0x27, 0x9B, 0x33, - 0x41, 0x94, 0xE0, 0xF1, 0x02, 0x0B, 0x10, 0x07, 0x5A, 0x60, - 0x01, 0x52, 0x69, 0x00, 0x31, 0xE9, 0x8E, 0xD1, 0x38, 0x04, - 0x0B, 0x20, 0x92, 0x6E, 0xA2, 0x05, 0x10, 0xD0, 0x88, 0x16, - 0x58, 0xA5, 0x6A, 0xAA, 0x01, 0x7C, 0x69, 0x00, 0xD2, 0x98, - 0x04, 0x10, 0x00, 0xA7, 0x67, 0xF0, 0x94, 0x89, 0x61, 0x01, - 0x23, 0x60, 0x01, 0xE5, 0x01, 0x8A, 0xE1, 0xC1, 0x94, 0x68, - 0x72, 0xA7, 0x7F, 0xF0, 0x03, 0xCE, 0x59, 0xA7, 0x60, 0x84, - 0x9F, 0xF9, 0x49, 0x19, 0xFF, 0x11, 0x00, 0xE5, 0x18, 0x1C, - 0x2F, 0x60, 0x1F, 0xE5, 0xE9, 0x77, 0x7F, 0x30, 0x79, 0x1A, - 0xF0, 0x02, 0xEB, 0xD7, 0x81, 0x7E, 0x37, 0x78, 0x12, 0xA9, - 0x01, 0x80, 0x37, 0x78, 0x90, 0x87, 0x79, 0xF8, 0x68, 0x04, - 0x9B, 0xBA, 0x74, 0x90, 0x97, 0x7A, 0x67, 0x29, 0x04, 0x45, - 0x60, 0x04, 0x94, 0xD4, 0xA9, 0x6C, 0x20, 0x82, 0x9A, 0x47, - 0x4C, 0xFE, 0xD7, 0x77, 0x46, 0xD0, 0xA5, 0x5F, 0xEA, 0x05, - 0xAA, 0x11, 0x00, 0x65, 0x10, 0x8F, 0x22, 0xC8, 0x76, 0x2A, - 0x14, 0x1C, 0x01, 0x20, 0xAB, 0xC9, 0x2A, 0x04, 0xAA, 0xE2, - 0x8F, 0xFB, 0x28, 0x82, 0xC5, 0x6A, 0x90, 0x1E, 0x28, 0x78, - 0x69, 0x27, 0x77, 0x84, 0x67, 0x1F, 0xC7, 0xA9, 0x76, 0xFA, - 0xF8, 0xAC, 0x22, 0xA8, 0x95, 0x84, 0x37, 0x77, 0x0C, 0x19, - 0xFF, 0x8C, 0x29, 0x28, 0xAD, 0x1E, 0x48, 0x91, 0x71, 0x00, - 0x01, 0x58, 0x79, 0x1E, 0x21, 0x10, 0x02, 0x67, 0x62, 0x00, - 0x00, 0x00, 0x79, 0xDB, 0xFA, 0x8F, 0xF2, 0xEA, 0x91, 0x29, - 0xDA, 0xA9, 0x73, 0x47, 0x86, 0xEC, 0xC8, 0x82, 0x2C, 0x3A, - 0x89, 0x2A, 0xF0, 0x07, 0x43, 0x30, 0x02, 0x0E, 0x38, 0x81, - 0x18, 0xC7, 0xAC, 0x67, 0xE0, 0x7E, 0x65, 0x58, 0x9E, 0x20, - 0x88, 0x89, 0x23, 0x68, 0x1E, 0x08, 0x8B, 0xB0, 0xE6, 0x91, - 0xAD, 0xDF, 0x8A, 0x9F, 0x0A, 0xAB, 0x89, 0x1F, 0x19, 0x04, - 0x3B, 0xD0, 0x05, 0x49, 0x42, 0x7A, 0x37, 0xF1, 0x07, 0x5A, - 0x30, 0x02, 0x53, 0x20, 0x02, 0x43, 0xD0, 0x02, 0xEA, 0x29, - 0x9B, 0xAE, 0xA8, 0x99, 0x93, 0xD7, 0x02, 0x9E, 0x09, 0x82, - 0x01, 0xA0, 0x79, 0x1B, 0xA9, 0x2A, 0x9E, 0xC7, 0x74, 0xEA, - 0x08, 0x90, 0x0A, 0x62, 0xA2, 0x53, 0x70, 0xA8, 0x05, 0x29, - 0xA9, 0x1E, 0x89, 0x0A, 0x2A, 0xDA, 0x8C, 0x08, 0xE8, 0x8C, - 0x7F, 0x60, 0x04, 0x67, 0x58, 0xAB, 0x38, 0xB8, 0x94, 0x04, - 0xD0, 0x88, 0x65, 0x98, 0x04, 0x38, 0xD0, 0x01, 0x41, 0xB0, - 0x20, 0x0E, 0x10, 0xA3, 0x6B, 0x38, 0x78, 0x5D, 0xC0, 0x7C, - 0x0C, 0x10, 0x04, 0x2D, 0xD0, 0x07, 0xB3, 0xA9, 0x05, 0x21, - 0xF0, 0x03, 0x55, 0xC9, 0x00, 0x4A, 0x29, 0x80, 0x71, 0xE0, - 0xAE, 0x3F, 0x30, 0x02, 0x10, 0xC0, 0x93, 0x27, 0x39, 0x02, - 0x58, 0xAB, 0x02, 0x41, 0x80, 0x03, 0x49, 0x10, 0x8F, 0x82, - 0x97, 0xB3, 0xC0, 0x0A, 0x1C, 0xCC, 0x39, 0x04, 0xD7, 0x47, - 0x86, 0x15, 0xA0, 0xA0, 0x5D, 0x10, 0x02, 0x49, 0xD0, 0x01, - 0x0C, 0x20, 0x96, 0xDE, 0x27, 0x02, 0x2D, 0x10, 0x84, 0x84, - 0xC8, 0x97, 0x15, 0x40, 0x88, 0xAE, 0x68, 0x1F, 0x3F, 0x00, - 0xA7, 0x3B, 0xD0, 0x85, 0xD6, 0x27, 0xFF, 0xB6, 0xE8, 0x0A, - 0x01, 0x78, 0xC0, 0x7C, 0x57, 0xF9, 0x07, 0x23, 0xD0, 0x01, - 0xC7, 0x27, 0x8E, 0xCE, 0x09, 0x00, 0xCD, 0x88, 0xAE, 0x30, - 0xEA, 0x99, 0xD6, 0xEA, 0xB6, 0x3B, 0xDB, 0x80, 0xF6, 0x47, - 0x94, 0x81, 0x99, 0x80, 0x08, 0xA8, 0xA0, 0x2F, 0x50, 0x13, - 0x3B, 0x1A, 0x8B, 0x41, 0x30, 0x04, 0x3F, 0x50, 0x06, 0x42, - 0x30, 0x02, 0x0A, 0x5A, 0x06, 0x16, 0xE0, 0x8A, 0x53, 0x30, - 0x02, 0x43, 0xF0, 0xA7, 0x97, 0x69, 0x01, 0x22, 0xE0, 0xAE, - 0x6C, 0x0A, 0x00, 0xAB, 0x78, 0x99, 0x92, 0x1B, 0xB2, 0x37, - 0x7A, 0x95, 0xBE, 0x1B, 0x02, 0xBD, 0xCB, 0xA7, 0x27, 0x52, - 0x77, 0x38, 0x2B, 0x99, 0x3A, 0x6B, 0x77, 0x70, 0x39, 0x02, - 0x2A, 0xA0, 0xBB, 0x64, 0x78, 0x06, 0x0E, 0x20, 0xB7, 0xC0, - 0x67, 0x8D, 0x01, 0x10, 0x8D, 0x76, 0xF9, 0x03, 0xD4, 0x07, - 0x00, 0x46, 0x50, 0x06, 0x03, 0x38, 0x02, 0x7D, 0x50, 0x07, - 0x3C, 0x10, 0x04, 0xCF, 0xE1, 0x00, 0x58, 0x39, 0x1E, 0x4A, - 0x09, 0x00, 0xC5, 0x28, 0xA5, 0xBB, 0x51, 0xA8, 0xB1, 0xF9, - 0x7C, 0x24, 0xE9, 0x8C, 0x38, 0x00, 0x7C, 0x2A, 0x82, 0x03, - 0x16, 0x10, 0x04, 0xDD, 0xE7, 0x8A, 0x6B, 0x27, 0xAE, 0x60, - 0xBA, 0xAD, 0x08, 0xE9, 0xA5, 0x05, 0x69, 0x8F, 0x05, 0x1B, - 0x1C, 0xEE, 0x07, 0x8F, 0x84, 0xA7, 0x8F, 0xC0, 0xB7, 0x8F, - 0xE8, 0xD1, 0x8E, 0xEC, 0xE8, 0x90, 0x94, 0xA4, 0x2A, 0x01, - 0x7C, 0x91, 0x15, 0xB9, 0x8F, 0xE6, 0x38, 0xAE, 0x03, 0xEC, - 0xB2, 0x4D, 0x48, 0x90, 0xEE, 0x98, 0xAC, 0xC2, 0x31, 0x78, - 0x65, 0x58, 0x86, 0x06, 0x0C, 0x90, 0x1D, 0x69, 0x1E, 0x06, - 0xDC, 0x8E, 0xE5, 0x89, 0xAF, 0x0D, 0xC9, 0x06, 0x26, 0x8A, - 0x8F, 0x1D, 0x38, 0xB1, 0x5B, 0x59, 0xAF, 0x7F, 0x20, 0x7D, - 0x22, 0x20, 0xFF, 0x04, 0x53, 0xA0, 0x02, 0x31, 0xC0, 0x74, - 0x0C, 0xF0, 0x03, 0x71, 0x00, 0x91, 0x6E, 0x52, 0x07, 0x45, - 0x90, 0x04, 0x71, 0xF0, 0x03, 0x46, 0xD0, 0x05, 0x3B, 0x6C, - 0xC4, 0xBF, 0x21, 0x02, 0x0E, 0x80, 0x03, 0x06, 0x82, 0xC3, - 0x42, 0x20, 0x20, 0x3F, 0x10, 0x20, 0x6C, 0xC0, 0xB5, 0x0C, - 0xD0, 0x05, 0x49, 0xA0, 0x19, 0x5A, 0xD0, 0x02, 0x2A, 0xC0, - 0x00, 0x53, 0xE0, 0x24, 0x5D, 0x40, 0xBD, 0x49, 0x22, 0x25, - 0x49, 0x80, 0xB0, 0xF2, 0x3A, 0x85, 0x53, 0x89, 0x03, 0x23, - 0xE0, 0x26, 0xCE, 0xF8, 0x22, 0x62, 0x8B, 0x20, 0x35, 0xC9, - 0xC6, 0xE3, 0xB1, 0x03, 0xC1, 0x87, 0xBE, 0x15, 0x08, 0x1E, - 0x16, 0xB0, 0x00, 0x6E, 0x92, 0x26, 0x98, 0x2B, 0x1E, 0x21, - 0x40, 0xA8, 0x97, 0x89, 0xC7, 0x7F, 0xDC, 0x26, 0x27, 0xC2, - 0x26, 0xF9, 0x3B, 0x97, 0x6E, 0x12, 0x1E, 0x44, 0x39, 0xAF, - 0x28, 0x28, 0xC3, 0xE2, 0xC1, 0x00, 0xD0, 0x37, 0x95, 0xE3, - 0x81, 0xC6, 0x23, 0x90, 0xB6, 0x0E, 0xE0, 0xA8, 0xC8, 0xC7, - 0x26, 0xBE, 0x48, 0xA8, 0x0E, 0x80, 0xB2, 0x92, 0x9B, 0xBF, - 0x0E, 0xA0, 0xC4, 0x26, 0x69, 0x01, 0x21, 0x70, 0x94, 0x7B, - 0x3C, 0xCA, 0x38, 0x80, 0x93, 0x23, 0x70, 0xCA, 0xE3, 0x81, - 0xB2, 0xD0, 0x37, 0x05, 0x46, 0xF9, 0xC9, 0x97, 0xA9, 0x81, - 0x8A, 0x3C, 0x99, 0x0E, 0x50, 0x07, 0x3C, 0x89, 0xB2, 0x71, - 0x80, 0x03, 0x7E, 0x4B, 0x1E, 0xA0, 0x78, 0xA6, 0x6A, 0x5B, - 0xBF, 0xE4, 0x81, 0x93, 0xF5, 0x6B, 0x8D, 0x3B, 0xD0, 0x88, - 0x21, 0xD0, 0xB1, 0x38, 0x79, 0xC7, 0x3D, 0x38, 0x1E, 0x23, - 0x20, 0x02, 0xBA, 0x5C, 0x84, 0x71, 0x20, 0xA5, 0x38, 0x80, - 0x03, 0xB6, 0x7C, 0xC7, 0x75, 0xC0, 0x06, 0xBA, 0x8C, 0x8D, - 0x21, 0xA0, 0x02, 0x8A, 0x8C, 0x82, 0x3A, 0x3B, 0xFF, 0xBD, - 0x2F, 0xF0, 0x02, 0xEE, 0x67, 0xC3, 0x06, 0xFB, 0xB3, 0xB4, - 0xAA, 0xAA, 0xE2, 0xDC, 0x07, 0xE2, 0xAC, 0x57, 0xB4, 0xEA, - 0x7E, 0x99, 0x2A, 0xAC, 0xAB, 0x51, 0x06, 0x2F, 0x10, 0x03, - 0x6D, 0xA2, 0x02, 0x1A, 0x50, 0x06, 0xC3, 0x6A, 0xB0, 0x33, - 0x50, 0x06, 0x05, 0xDB, 0x7E, 0xEE, 0xD7, 0xB1, 0x00, 0xC0, - 0x00, 0x33, 0xE0, 0x7E, 0x46, 0x10, 0xCE, 0xF1, 0xFA, 0x8F, - 0x84, 0xA4, 0xA2, 0x2B, 0x12, 0x04, 0x35, 0x8B, 0x20, 0x23, - 0xB0, 0xB6, 0x3F, 0xC0, 0xBD, 0x31, 0x30, 0x02, 0x1A, 0x90, - 0x8B, 0x46, 0x50, 0x1E, 0x49, 0x30, 0x02, 0x45, 0xB0, 0x92, - 0x21, 0x30, 0x05, 0x2B, 0xCB, 0x20, 0x22, 0xD0, 0x05, 0x08, - 0x12, 0x00, 0x08, 0xA2, 0x05, 0x00, 0x62, 0x04, 0xF8, 0x39, - 0x03, 0xE5, 0x39, 0x9D, 0xDF, 0x77, 0xC0, 0xC7, 0xE9, 0x7E, - 0xDF, 0x3A, 0xCB, 0xD6, 0x06, 0x05, 0x76, 0x27, 0x1E, 0x41, - 0x10, 0xC8, 0x2F, 0x12, 0x02, 0x68, 0xF2, 0x94, 0xE2, 0x01, - 0x7D, 0x3B, 0x79, 0x99, 0x33, 0x40, 0x9B, 0x41, 0xC0, 0xBE, - 0x27, 0x42, 0x9B, 0x4F, 0x99, 0x26, 0xCD, 0x88, 0xC7, 0x16, - 0x50, 0x07, 0xC4, 0xEA, 0xA5, 0xDD, 0x7C, 0x87, 0x6D, 0xB0, - 0x02, 0x6D, 0x40, 0xD3, 0x7F, 0x80, 0xC7, 0x4A, 0x9C, 0xCA, - 0xE3, 0x41, 0x9B, 0x4A, 0x6D, 0x92, 0x9F, 0xDC, 0x8C, 0x85, - 0x1A, 0x07, 0x21, 0x39, 0x05, 0x3B, 0x80, 0xC7, 0x10, 0x20, - 0xC7, 0xE0, 0x51, 0xA8, 0x6E, 0x22, 0x7D, 0x69, 0xBC, 0x94, - 0x0F, 0xFB, 0xD4, 0x9A, 0x88, 0x35, 0x0D, 0xF0, 0x00, 0xC0, - 0x11, 0xC7, 0x38, 0xC0, 0x1B, 0x3A, 0xBD, 0x00, 0x66, 0x7D, - 0x7C, 0x6D, 0x82, 0x8D, 0x6C, 0xC2, 0xD5, 0x67, 0x10, 0x03, - 0x68, 0x12, 0x04, 0xD2, 0x98, 0x22, 0x3C, 0x99, 0x22, 0x38, - 0xD0, 0x02, 0x75, 0x7D, 0xFF, 0x7C, 0xD6, 0xE8, 0xD6, 0xE2, - 0x1A, 0x01, 0x4A, 0x70, 0x05, 0x19, 0xB7, 0xD1, 0x53, 0x20, - 0x04, 0xFC, 0x8C, 0x79, 0xF6, 0x2C, 0x25, 0x01, 0xA0, 0x02, - 0x2F, 0x30, 0x05, 0xAD, 0xEB, 0xCA, 0x1A, 0xA0, 0x02, 0x99, - 0xF7, 0x02, 0x5A, 0xA0, 0x01, 0x3B, 0x10, 0x9B, 0xA0, 0x5D, - 0x04, 0x5D, 0x30, 0x05, 0x53, 0xA0, 0x42, 0x05, 0x2B, 0x04, - 0x2A, 0x50, 0x9C, 0x8C, 0xFD, 0xD6, 0x20, 0xD1, 0x06, 0x66, - 0x30, 0x03, 0x71, 0xB7, 0x76, 0xB8, 0x2D, 0xCE, 0xB8, 0x9D, - 0x76, 0xF1, 0xC8, 0xB6, 0x6D, 0xA7, 0xAD, 0xC4, 0x0A, 0x7A, - 0xAA, 0xE7, 0xD2, 0x95, 0x57, 0x78, 0x06, 0x19, 0x7E, 0xE1, - 0x17, 0x82, 0xC8, 0xBD, 0xDC, 0xCC, 0xDD, 0xDC, 0xE1, 0xD7, - 0x06, 0xCF, 0xE2, 0x05, 0x55, 0xA0, 0x05, 0x3B, 0x48, 0x82, - 0xE0, 0x37, 0x78, 0x0F, 0xEB, 0xDC, 0xDA, 0xBD, 0xDD, 0xDC, - 0xDD, 0xDD, 0xDE, 0x0D, 0xDD, 0x1B, 0x30, 0x39, 0x42, 0xF1, - 0x04, 0xC6, 0x52, 0xDE, 0xE6, 0x7D, 0xDE, 0xE8, 0x9D, 0xDE, - 0xEA, 0xBD, 0xDE, 0xEC, 0xDD, 0xDE, 0xE7, 0x0D, 0xDD, 0xE6, - 0x60, 0x02, 0x69, 0xB0, 0x05, 0x3D, 0x20, 0x2E, 0xE8, 0xF2, - 0x06, 0x3C, 0x93, 0xDF, 0xFA, 0xBD, 0xDF, 0xFC, 0xDD, 0xDF, - 0xF9, 0x6D, 0xDF, 0xF6, 0xFD, 0xDF, 0xE2, 0xE2, 0xDF, 0x04, - 0x5E, 0xE0, 0xE9, 0xA2, 0x0E, 0x09, 0xD3, 0x31, 0x0A, 0xAE, - 0xE0, 0xE6, 0x50, 0x2A, 0xF1, 0x0D, 0x16, 0x05, 0x41, 0x29, - 0x10, 0x0E, 0x16, 0x0F, 0xFE, 0x11, 0xED, 0xB0, 0x2E, 0x0B, - 0x9E, 0xE1, 0xF9, 0x32, 0x10, 0xDC, 0x82, 0x29, 0xA4, 0x42, - 0x2F, 0x99, 0xD2, 0x00, 0x22, 0xDE, 0x00, 0xA4, 0x91, 0x29, - 0x5A, 0x22, 0xE2, 0x12, 0x30, 0xE2, 0x0C, 0x23, 0xE2, 0x5B, - 0x90, 0x35, 0xFC, 0xC1, 0xE1, 0xC0, 0x22, 0x01, 0x30, 0x70, - 0xFF, 0x1A, 0x0A, 0x70, 0x03, 0x57, 0xF0, 0x36, 0x57, 0x90, - 0x05, 0x79, 0x92, 0xE3, 0x08, 0x91, 0xE3, 0x4F, 0x00, 0x04, - 0x13, 0x60, 0x2D, 0x13, 0x70, 0x05, 0x37, 0x90, 0x02, 0x30, - 0x80, 0xE0, 0xB5, 0x01, 0xE3, 0x83, 0x12, 0x28, 0x02, 0xC0, - 0x10, 0x7D, 0x12, 0x26, 0x6E, 0xF3, 0xE3, 0xB6, 0xA2, 0x00, - 0x61, 0x62, 0x36, 0x65, 0xF3, 0x04, 0x37, 0x10, 0x26, 0x59, - 0xE3, 0x2B, 0xBE, 0xF0, 0x2B, 0x80, 0xF1, 0x0B, 0x4A, 0x7E, - 0x2A, 0x9C, 0x20, 0x35, 0x68, 0xD0, 0x21, 0x3F, 0xC3, 0x30, - 0xF0, 0xB0, 0x02, 0x46, 0x43, 0xDF, 0x99, 0xD2, 0x03, 0x5B, - 0x70, 0x0E, 0xF9, 0xF0, 0x2E, 0x26, 0x50, 0x2A, 0x25, 0xE3, - 0x07, 0x12, 0xFE, 0x11, 0x4D, 0xD3, 0x2C, 0xDC, 0x32, 0x0D, - 0x68, 0x70, 0x29, 0x6A, 0x2E, 0x35, 0xE6, 0x80, 0x06, 0xE6, - 0x10, 0xE1, 0xF1, 0xAD, 0x09, 0x2B, 0x50, 0xE8, 0x12, 0x62, - 0x0E, 0x5A, 0xD3, 0x0E, 0x0D, 0x2E, 0xDF, 0x20, 0x21, 0x28, - 0x2B, 0xD0, 0x0C, 0x59, 0xB3, 0x2E, 0xC0, 0x10, 0xE6, 0x64, - 0x52, 0x4B, 0x12, 0x80, 0x06, 0x7D, 0xB2, 0x07, 0x6D, 0x40, - 0x2F, 0x02, 0xD0, 0x06, 0x12, 0x10, 0xEA, 0x12, 0xD0, 0x06, - 0xA4, 0x4E, 0x2F, 0x7B, 0xE0, 0x05, 0x69, 0xD0, 0xE9, 0x22, - 0x2E, 0x00, 0x5E, 0x20, 0x01, 0x7B, 0x10, 0xE2, 0x24, 0xDE, - 0x06, 0x0D, 0x10, 0xEA, 0xA0, 0xEE, 0xEA, 0xB3, 0x2E, 0x01, - 0xA3, 0x42, 0xE9, 0xBE, 0x60, 0xE9, 0x21, 0xA2, 0x33, 0xCB, - 0xD1, 0x03, 0x0A, 0x30, 0x07, 0x44, 0x5E, 0xE4, 0xD2, 0xE2, - 0x36, 0x13, 0x70, 0x03, 0x2E, 0x90, 0xEC, 0xD3, 0xE2, 0x02, - 0xA6, 0x91, 0x02, 0x45, 0x5E, 0x2D, 0x7A, 0xC0, 0x14, 0x13, - 0x50, 0x37, 0x0A, 0x20, 0x00, 0xD9, 0x32, 0x2D, 0x35, 0x5E, - 0xE4, 0x3A, 0x9E, 0x05, 0xCB, 0x22, 0xFF, 0x28, 0x60, 0x5E, - 0x33, 0xA7, 0x92, 0x0F, 0x70, 0xC1, 0x1D, 0x77, 0xF2, 0x38, - 0x0A, 0x50, 0xED, 0xBA, 0x62, 0xEE, 0x13, 0x50, 0x21, 0x8E, - 0x51, 0xEE, 0xE7, 0xAE, 0x00, 0x9B, 0xD2, 0x27, 0xE7, 0xAE, - 0x2B, 0x0A, 0x91, 0xEE, 0xF3, 0x5E, 0x21, 0x7B, 0x20, 0x0F, - 0x79, 0x2E, 0x16, 0xBF, 0xC2, 0x1F, 0xF4, 0xB0, 0x01, 0x22, - 0x4E, 0x2F, 0x0D, 0x40, 0xEA, 0xB2, 0x2E, 0xE2, 0xB0, 0xE1, - 0x05, 0x9C, 0xDE, 0xE9, 0xA4, 0xCE, 0xE2, 0xF0, 0x10, 0x39, - 0x42, 0x43, 0x1A, 0x5B, 0xF0, 0x30, 0x10, 0x33, 0xE6, 0x3E, - 0x83, 0x06, 0x82, 0xCE, 0x2C, 0xBB, 0x0E, 0xEE, 0xC0, 0xD2, - 0x0C, 0x68, 0x00, 0x04, 0xD3, 0x22, 0x2D, 0x57, 0xE0, 0xEC, - 0x57, 0xA0, 0x00, 0x2E, 0x10, 0xF2, 0x70, 0x50, 0x37, 0x21, - 0xEF, 0xEC, 0x37, 0x40, 0x2A, 0xBA, 0x8E, 0x2F, 0x91, 0xAE, - 0x35, 0xE7, 0x70, 0x32, 0x97, 0x22, 0x0D, 0x80, 0x6E, 0x2A, - 0xBC, 0x1E, 0x22, 0x4F, 0x71, 0x1B, 0x8F, 0xC3, 0xEE, 0x15, - 0x22, 0x00, 0x8E, 0x61, 0xEE, 0x3C, 0x0F, 0x04, 0xF3, 0xB0, - 0x2E, 0x63, 0x62, 0x0C, 0xBE, 0x92, 0x0B, 0xF3, 0x30, 0xE7, - 0x01, 0xF1, 0xE5, 0x10, 0xD2, 0xEF, 0xFE, 0xEE, 0xE7, 0x0D, - 0x53, 0xF1, 0x9B, 0x30, 0xDF, 0x9B, 0x10, 0xF1, 0x3D, 0x20, - 0xF1, 0x3D, 0x20, 0x39, 0x73, 0x1E, 0xDF, 0x97, 0x32, 0xE7, - 0x5C, 0xDE, 0x10, 0x5B, 0xDF, 0x10, 0x69, 0x80, 0x06, 0x2D, - 0xD3, 0x0B, 0xCD, 0x70, 0xF3, 0xFC, 0x31, 0x0B, 0x2F, 0x4F, - 0x0B, 0x9D, 0x20, 0x34, 0x9B, 0x20, 0x0F, 0x82, 0x3E, 0xF6, - 0xB5, 0x30, 0xF6, 0xF2, 0xBD, 0x09, 0x9A, 0x60, 0xF1, 0x16, - 0xCF, 0xF6, 0x52, 0xF3, 0xE7, 0x6A, 0x0E, 0x0F, 0xF4, 0xED, - 0x2E, 0xFB, 0x82, 0xF6, 0xDA, 0x11, 0x12, 0x4E, 0x2E, 0x00, - 0x07, 0x41, 0xFF, 0x08, 0x76, 0xE2, 0xEA, 0xAE, 0x6E, 0xEA, - 0x76, 0xC2, 0xEA, 0x76, 0x72, 0xEA, 0x76, 0xE2, 0x05, 0x83, - 0xF0, 0xF8, 0xF3, 0x62, 0x27, 0xD5, 0x7E, 0x10, 0x9C, 0x32, - 0x01, 0x0A, 0x00, 0xF8, 0x95, 0xAE, 0xF1, 0x83, 0x52, 0x1A, - 0x02, 0xA0, 0x04, 0x40, 0x70, 0xF2, 0x59, 0xE0, 0x02, 0x70, - 0xD0, 0x04, 0x70, 0xA0, 0x07, 0x59, 0x90, 0xFA, 0x45, 0xEE, - 0x02, 0x73, 0xA0, 0xEC, 0xD9, 0x42, 0xF2, 0xC8, 0xDE, 0x04, - 0x69, 0x33, 0x07, 0x43, 0x0E, 0x07, 0xC9, 0xDE, 0x04, 0x7A, - 0x00, 0x07, 0x70, 0x30, 0xE4, 0x55, 0xD0, 0x04, 0x0F, 0x30, - 0x07, 0xDB, 0xE2, 0x0B, 0x59, 0x13, 0x0D, 0x7B, 0x6E, 0x1B, - 0x4A, 0x23, 0x01, 0x86, 0xA0, 0x2B, 0x92, 0x3F, 0x2F, 0x84, - 0xA0, 0x2B, 0x85, 0xD0, 0xFC, 0xE9, 0x0E, 0xFD, 0x85, 0x60, - 0x1A, 0x88, 0x5F, 0x08, 0x9C, 0xCF, 0x0B, 0xB3, 0x22, 0xEB, - 0xFB, 0x3E, 0x24, 0xF9, 0xA2, 0xE9, 0x6F, 0x31, 0xF9, 0x07, - 0x21, 0x05, 0xD5, 0xCE, 0x10, 0x9C, 0x30, 0xF1, 0xEE, 0x60, - 0xF7, 0x9C, 0xF0, 0x23, 0x57, 0x9F, 0xF7, 0x0F, 0x33, 0x21, - 0x16, 0xAF, 0xF6, 0x9A, 0x10, 0x0C, 0x69, 0xF0, 0x06, 0x59, - 0x60, 0xFC, 0xC7, 0xAF, 0x0B, 0x1D, 0xCF, 0x01, 0x2E, 0x00, - 0x08, 0x37, 0x70, 0x2E, 0x13, 0x13, 0x03, 0x73, 0x4F, 0x5B, - 0x1B, 0x8B, 0x1B, 0x11, 0x8E, 0x8F, 0x8F, 0x7E, 0x11, 0x1B, - 0x92, 0x8E, 0x92, 0x26, 0x26, 0x93, 0x8E, 0x8B, 0x96, 0x7E, - 0x9E, 0x9F, 0x9E, 0x6F, 0x0A, 0x5A, 0x0D, 0x11, 0xA0, 0x8C, - 0x8C, 0xA0, 0xAA, 0xAB, 0xAC, 0xAD, 0x9E, 0x12, 0x02, 0xB1, - 0xB2, 0x7B, 0xB1, 0x7B, 0x2B, 0xA6, 0x9E, 0x26, 0xA8, 0xA9, - 0xA6, 0xA6, 0x8C, 0x9A, 0xB8, 0x7E, 0xBB, 0xAC, 0x1B, 0x3D, - 0x5E, 0x50, 0x7D, 0x6D, 0x94, 0x98, 0x1B, 0x2B, 0xFF, 0x69, - 0x7E, 0x2B, 0xCE, 0xBB, 0xD3, 0x8C, 0xCC, 0x1B, 0x98, 0x90, - 0xA8, 0x98, 0xDB, 0x68, 0xDD, 0xDE, 0xDE, 0xCC, 0x9F, 0xD4, - 0xD7, 0xE4, 0xD1, 0xE6, 0x26, 0x9E, 0x94, 0x9F, 0x8E, 0x69, - 0x11, 0xE8, 0xBD, 0x1B, 0x69, 0x0D, 0x55, 0x33, 0x6C, 0x63, - 0x36, 0x5E, 0x6D, 0x12, 0x12, 0x93, 0x9C, 0xC1, 0xAE, 0xE9, - 0xD4, 0xAD, 0x5A, 0xE4, 0x4A, 0x60, 0x3A, 0x80, 0xAD, 0x86, - 0x05, 0xA4, 0x54, 0x2D, 0xDE, 0x35, 0x09, 0x26, 0xD0, 0x28, - 0xB9, 0x31, 0x63, 0xC6, 0x99, 0x13, 0x27, 0xDC, 0xB8, 0x71, - 0x32, 0x26, 0x8C, 0x47, 0x1B, 0x20, 0x43, 0x8A, 0x1C, 0x49, - 0xB2, 0xA4, 0xC9, 0x93, 0x28, 0x53, 0x8E, 0x94, 0xC1, 0xB2, - 0x25, 0x4B, 0x2F, 0xFC, 0xA2, 0xA5, 0x51, 0xA2, 0x00, 0xC5, - 0x8C, 0x22, 0x46, 0x4E, 0xF0, 0xD9, 0xA9, 0x93, 0x0F, 0xC6, - 0x9F, 0x40, 0x83, 0x0A, 0x1D, 0x4A, 0xB4, 0xA8, 0xD1, 0xA3, - 0x43, 0xDD, 0xFC, 0x54, 0x9A, 0x31, 0x63, 0x18, 0x2F, 0x69, - 0xD2, 0xA0, 0xA1, 0x00, 0xE5, 0x0F, 0x1B, 0x23, 0x39, 0x77, - 0x6A, 0xDD, 0xCA, 0xB5, 0x6B, 0xCF, 0xAE, 0x5B, 0xBF, 0x82, - 0x1D, 0x4B, 0xB6, 0xAC, 0x59, 0xAF, 0x63, 0xDA, 0x44, 0x98, - 0xD7, 0x27, 0x40, 0xDB, 0x00, 0x62, 0xF9, 0xD8, 0xD1, 0x6A, - 0x27, 0x2E, 0xDD, 0x0E, 0x62, 0xCC, 0x8A, 0x99, 0x7B, 0xB6, - 0xAF, 0x5F, 0xBF, 0x27, 0xC2, 0x4C, 0xAC, 0xD8, 0xA7, 0x70, - 0x1F, 0xB1, 0x27, 0x86, 0x0C, 0x39, 0x21, 0xC6, 0x80, 0x1D, - 0x31, 0x3A, 0xC5, 0xE2, 0x11, 0x03, 0xD9, 0xA7, 0x4F, 0x8C, - 0x97, 0x4F, 0xE0, 0xB5, 0xFB, 0xB7, 0xB3, 0x67, 0x37, 0x0A, - 0x54, 0x9C, 0x11, 0x32, 0xC3, 0x30, 0xE2, 0x21, 0x78, 0xF8, - 0x74, 0x70, 0x6C, 0x07, 0x6F, 0x85, 0x21, 0x7C, 0x3B, 0x74, - 0x90, 0xAB, 0x58, 0x4C, 0xD0, 0x87, 0xDA, 0xAD, 0xC5, 0x54, - 0xA8, 0xC0, 0xD7, 0xB3, 0xEF, 0xCE, 0x27, 0x78, 0x70, 0xE9, - 0x53, 0x24, 0x40, 0xE9, 0xC2, 0x71, 0x3B, 0x54, 0x90, 0xBD, - 0xFC, 0xF5, 0x6E, 0x3E, 0x43, 0x78, 0x8A, 0xC1, 0x83, 0x87, - 0xC0, 0xED, 0xDB, 0xCB, 0x0D, 0xA0, 0xC6, 0x03, 0xE1, 0xB7, - 0xF7, 0xBF, 0x27, 0x00, 0xFC, 0x39, 0x73, 0xDC, 0xF4, 0xD6, - 0xD6, 0x27, 0x2C, 0x3C, 0xC6, 0xD3, 0xBC, 0x83, 0x9D, 0xE8, - 0xAA, 0xDF, 0xE3, 0x79, 0x3F, 0x64, 0xB9, 0x6D, 0x3C, 0xB2, - 0x57, 0xE7, 0xFD, 0xCE, 0x7F, 0xEC, 0x09, 0x08, 0x7F, 0xF4, - 0x11, 0xA0, 0x61, 0xC8, 0x9D, 0x37, 0xD7, 0x7E, 0x7B, 0xCD, - 0xB5, 0x1C, 0x5F, 0x62, 0xC0, 0xD6, 0x9A, 0x7B, 0x76, 0xCC, - 0x15, 0x21, 0x5E, 0x11, 0xEE, 0xD7, 0xDF, 0x85, 0x3C, 0x75, - 0x30, 0x85, 0x06, 0x04, 0x12, 0xC8, 0xD9, 0x87, 0x61, 0xF1, - 0x64, 0xD7, 0x57, 0x9C, 0x61, 0xE8, 0xDB, 0x09, 0x76, 0x04, - 0x31, 0x9E, 0x5B, 0x1D, 0x1E, 0x66, 0xE2, 0x8B, 0x30, 0x72, - 0x75, 0xC2, 0x08, 0x7F, 0x70, 0xD8, 0x62, 0x81, 0x31, 0xE6, - 0x88, 0xE1, 0x7F, 0x7F, 0x18, 0xC1, 0xE2, 0x8D, 0x25, 0xEA, - 0x28, 0x64, 0x5F, 0x9A, 0x15, 0x71, 0x63, 0x87, 0x48, 0x25, - 0xA9, 0xE4, 0x92, 0x4C, 0x2E, 0x69, 0x47, 0x1D, 0x35, 0x1E, - 0x69, 0x58, 0x7E, 0x54, 0x56, 0x69, 0xE5, 0x95, 0x58, 0x66, - 0xA9, 0xE5, 0x96, 0x5C, 0x66, 0x59, 0x41, 0x08, 0x7F, 0xFC, - 0x28, 0x65, 0x20, 0x00, 0x3B -}; - -struct fsdata_file const file_img_PSiCC2_gif[] = { - { - file_img_logo_sics_gif, - data_img_PSiCC2_gif, - data_img_PSiCC2_gif + 16, - sizeof(data_img_PSiCC2_gif) - 16 - } -}; - -/* /img/QP_datasheet.gif */ -static unsigned char const data_img_QP_datasheet_gif[] = { - /* name: */ - 0x2F, 0x69, 0x6D, 0x67, 0x2F, 0x51, 0x50, 0x5F, 0x64, 0x61, - 0x74, 0x61, 0x73, 0x68, 0x65, 0x65, 0x74, 0x2E, 0x67, 0x69, - 0x66, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x64, 0x00, 0x81, 0x00, - 0xE6, 0x00, 0x00, 0xAD, 0xC8, 0xDB, 0xDC, 0xDC, 0xDC, 0xD3, - 0xD4, 0xD4, 0x4F, 0x73, 0xA8, 0xCB, 0xCC, 0xCC, 0x98, 0xAD, - 0xC7, 0x6F, 0x85, 0xAE, 0xB4, 0xD0, 0xE4, 0xE2, 0xE3, 0xE3, - 0x38, 0x63, 0x9D, 0xC3, 0xC3, 0xC3, 0xF5, 0x19, 0x1C, 0xC0, - 0xC6, 0xD9, 0xD8, 0xDA, 0xE6, 0xF8, 0xA7, 0xA5, 0xBC, 0xBC, - 0xBC, 0xCB, 0xEC, 0xFF, 0xD5, 0xAD, 0xB5, 0xCC, 0x84, 0x59, - 0xFD, 0xFD, 0xFD, 0xEC, 0xEC, 0xED, 0xDD, 0xB6, 0xBE, 0x5F, - 0x62, 0x6C, 0xFC, 0xE3, 0xE4, 0xA1, 0xB7, 0xCA, 0xB1, 0xB4, - 0xCD, 0x88, 0x97, 0xB5, 0xFE, 0xCC, 0xD6, 0xE3, 0x65, 0x68, - 0xE1, 0xF4, 0xFF, 0xF6, 0xDD, 0xDF, 0xB3, 0xB3, 0xB3, 0xCD, - 0xD7, 0xEB, 0xD5, 0xF2, 0xFF, 0xF3, 0xF4, 0xF4, 0x0E, 0x0C, - 0x0D, 0xD7, 0xEC, 0xFC, 0xE5, 0xED, 0xF6, 0xFE, 0xDB, 0xDF, - 0xA8, 0xAC, 0xC7, 0xA6, 0xA5, 0xA8, 0x98, 0x97, 0x96, 0xB7, - 0xBC, 0xD0, 0x95, 0xA3, 0xBC, 0x10, 0x2B, 0x56, 0xC9, 0xD3, - 0xDD, 0xA9, 0x6B, 0x47, 0xF5, 0x8E, 0x76, 0xDB, 0xE0, 0xEA, - 0xA6, 0xBF, 0xD5, 0xE6, 0xD8, 0xDF, 0xDE, 0xC7, 0xCA, 0x4C, - 0x19, 0x22, 0x89, 0xA0, 0xC5, 0xD0, 0xCC, 0xD4, 0xB0, 0x57, - 0x2D, 0x31, 0xAA, 0x70, 0xF0, 0xF0, 0xF0, 0xB0, 0xB2, 0xFA, - 0xAD, 0x87, 0x88, 0xA3, 0xA4, 0xC0, 0xF6, 0xF8, 0xF9, 0xD7, - 0x8B, 0x8E, 0xBF, 0xBF, 0xC0, 0xD3, 0xD4, 0xE2, 0xE1, 0xE3, - 0xEC, 0xF1, 0xF4, 0xFA, 0x3D, 0x4C, 0x5D, 0xFB, 0xBA, 0xBA, - 0xEA, 0xBD, 0xC7, 0x7F, 0x21, 0x34, 0xFD, 0xEF, 0xEF, 0xCA, - 0xA2, 0xAB, 0xEA, 0xE0, 0xE4, 0xC5, 0xA8, 0xAD, 0xC8, 0xCB, - 0xDD, 0xE1, 0xE8, 0xF0, 0xA7, 0xB1, 0xC0, 0xD0, 0x74, 0x3D, - 0xDA, 0xD9, 0xD9, 0xDA, 0xD1, 0xD3, 0xD4, 0xDF, 0xF3, 0x84, - 0x7D, 0x78, 0xFB, 0xEA, 0xEC, 0xBD, 0xC1, 0xD3, 0xCF, 0xF0, - 0xFF, 0xC1, 0xC7, 0xCE, 0x92, 0x97, 0xFA, 0xD6, 0xD9, 0xDC, - 0xE0, 0xD5, 0xDE, 0xC4, 0xC8, 0xF5, 0x42, 0x3A, 0x40, 0xB1, - 0xB4, 0xC0, 0xBA, 0x9A, 0xA0, 0x7F, 0xC9, 0xA6, 0xBA, 0xD8, - 0xEE, 0xE3, 0xDE, 0xD8, 0xFB, 0xD5, 0xD1, 0xD9, 0x9C, 0x9C, - 0xC8, 0xC8, 0xC7, 0x32, 0x40, 0x86, 0xEB, 0x37, 0x3A, 0xAE, - 0xAD, 0xBB, 0xD1, 0xBE, 0xC5, 0xE9, 0xE9, 0xE9, 0x7E, 0x4B, - 0x3D, 0xF2, 0xCB, 0xD2, 0xC9, 0xC6, 0xD2, 0xBF, 0xB2, 0xC8, - 0xA1, 0x3B, 0x3E, 0xB6, 0xB6, 0xB6, 0xF3, 0x94, 0x9D, 0xB4, - 0xB9, 0xC4, 0xFA, 0xFA, 0xFA, 0xDF, 0xDF, 0xDF, 0xED, 0xE3, - 0xE6, 0xB9, 0xB9, 0xB9, 0xC4, 0xE2, 0xF6, 0xCF, 0xD0, 0xD0, - 0xE6, 0xE6, 0xE6, 0xAE, 0xAE, 0xAE, 0xFE, 0xF5, 0xF6, 0xED, - 0xEE, 0xF1, 0xD7, 0xD7, 0xD7, 0xCF, 0xD0, 0xE0, 0xE4, 0xD4, - 0xD4, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x21, 0xF9, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x81, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x23, 0x82, - 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, - 0x8D, 0x8A, 0x7E, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x95, 0x82, 0x9C, 0x9F, 0xA0, - 0xA1, 0xA2, 0xA2, 0x84, 0x2C, 0x23, 0x2C, 0xA8, 0xA9, 0x5B, - 0x2C, 0xAB, 0x5B, 0x43, 0xAE, 0x43, 0xB1, 0xB2, 0xB1, 0x16, - 0x43, 0x16, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xB9, 0xB6, 0xB3, - 0xAF, 0x5B, 0xAD, 0xA9, 0xA7, 0x88, 0xA3, 0x90, 0x05, 0x27, - 0x19, 0x19, 0x2A, 0x5C, 0x6C, 0x3F, 0x6B, 0x67, 0x54, 0x2A, - 0x2A, 0x54, 0x4B, 0x31, 0xCB, 0xD4, 0x54, 0x0C, 0x4B, 0x0C, - 0x7C, 0xDE, 0x7C, 0x59, 0x0D, 0x40, 0xE3, 0x0D, 0x72, 0xE2, - 0xE5, 0x41, 0x08, 0x77, 0x30, 0x7C, 0x4B, 0x0D, 0x77, 0x77, - 0x68, 0x77, 0x08, 0x72, 0xF4, 0x0D, 0x58, 0x49, 0x77, 0x73, - 0xF3, 0xE9, 0x08, 0x08, 0x60, 0x60, 0xFA, 0x3C, 0xC1, 0x22, - 0xA0, 0x45, 0x0B, 0x06, 0x0C, 0x54, 0x64, 0x38, 0x71, 0x82, - 0x07, 0x0F, 0x0D, 0x10, 0x0D, 0x48, 0x1C, 0x60, 0x21, 0x41, - 0x2D, 0x59, 0xAC, 0x52, 0xCD, 0xC8, 0xD2, 0xA7, 0x0F, 0x14, - 0x28, 0x36, 0xD6, 0x58, 0x59, 0x63, 0x23, 0x00, 0xC0, 0x00, - 0x59, 0xF6, 0x60, 0x79, 0x22, 0x23, 0x0B, 0x98, 0x94, 0x59, - 0x42, 0x86, 0x5C, 0x43, 0x72, 0xA6, 0x4C, 0x1B, 0x20, 0x6D, - 0xD8, 0xB4, 0x13, 0xD2, 0x8A, 0x15, 0x69, 0x18, 0x0A, 0xD4, - 0x28, 0x40, 0xB4, 0x28, 0x06, 0x0C, 0xD3, 0xAC, 0x08, 0x10, - 0xF0, 0xA4, 0x69, 0x80, 0xA7, 0x4F, 0xF6, 0x34, 0xCD, 0x92, - 0x45, 0x86, 0x0C, 0x28, 0x1D, 0x41, 0x72, 0xA3, 0x02, 0x80, - 0xCA, 0xB5, 0x18, 0x18, 0x4E, 0x60, 0xD0, 0xF0, 0x80, 0x00, - 0x01, 0x1B, 0x2A, 0x9A, 0x34, 0x81, 0x03, 0x87, 0x1A, 0x9C, - 0x26, 0x2A, 0xFF, 0x98, 0x7E, 0xB4, 0x31, 0x86, 0x26, 0x4D, - 0x05, 0x24, 0xD7, 0x34, 0xE4, 0x71, 0x82, 0x1A, 0x4D, 0x65, - 0xCA, 0x54, 0xD0, 0xD4, 0x39, 0x93, 0x26, 0x95, 0xA0, 0x44, - 0x6B, 0x0C, 0x15, 0xAA, 0x78, 0xB1, 0xE2, 0x02, 0xCA, 0x4E, - 0x10, 0x5D, 0xD1, 0xD8, 0x40, 0xE3, 0xC7, 0x8B, 0x19, 0x5F, - 0x6E, 0x4C, 0x54, 0xC3, 0x80, 0xCF, 0xA0, 0x25, 0x4A, 0xD4, - 0x30, 0x71, 0x40, 0x69, 0xD0, 0xA8, 0x3F, 0x9F, 0x36, 0x6D, - 0x40, 0xC3, 0x50, 0x86, 0xCB, 0x16, 0xBE, 0x4E, 0x26, 0xF8, - 0x09, 0xC0, 0xDB, 0x60, 0x9E, 0x08, 0xB0, 0xC1, 0x20, 0x83, - 0x50, 0xD2, 0xA2, 0x53, 0x27, 0x48, 0x8D, 0x7A, 0x38, 0x71, - 0xE2, 0x09, 0x92, 0x2B, 0x5F, 0xCE, 0xBC, 0xB9, 0xF3, 0xE5, - 0x03, 0x94, 0x87, 0x6E, 0xED, 0xBA, 0x86, 0xEB, 0xBE, 0x54, - 0xD6, 0x40, 0xD9, 0x03, 0x70, 0x4F, 0x4E, 0xBB, 0x38, 0x05, - 0xB6, 0x43, 0x18, 0xA3, 0x86, 0x81, 0xE2, 0xCF, 0xD3, 0xAB, - 0x5F, 0xCF, 0x3E, 0xBD, 0xE9, 0xE8, 0xC9, 0x59, 0x53, 0xB7, - 0x5E, 0x63, 0x45, 0x01, 0x38, 0x56, 0x70, 0xAE, 0xA1, 0xA2, - 0x8C, 0xA8, 0x60, 0x1B, 0x4D, 0x41, 0xB1, 0x86, 0x6F, 0xE6, - 0x09, 0x67, 0x1C, 0x7C, 0xED, 0x0D, 0xD1, 0xDE, 0x82, 0xCF, - 0x45, 0x97, 0xDA, 0x79, 0x10, 0x8A, 0x56, 0x1F, 0x32, 0xF4, - 0x41, 0xE6, 0x97, 0x34, 0x19, 0x64, 0xA7, 0x13, 0x14, 0x40, - 0x58, 0x13, 0x43, 0x0C, 0x42, 0x89, 0xB6, 0xDA, 0x70, 0x0C, - 0x96, 0xB8, 0xE0, 0x71, 0xEF, 0x85, 0x26, 0x5F, 0x01, 0x2A, - 0xEC, 0x91, 0xC4, 0x1A, 0x2B, 0x98, 0xC6, 0x59, 0x50, 0xD6, - 0x8D, 0x56, 0x1F, 0x06, 0xDA, 0x50, 0xD1, 0x02, 0x08, 0x07, - 0xB4, 0xF0, 0xC5, 0x12, 0x20, 0x00, 0x80, 0x81, 0x62, 0xA7, - 0x39, 0x57, 0xD1, 0x91, 0xEA, 0xC1, 0x17, 0x1D, 0xFF, 0x0B, - 0x64, 0x34, 0xC9, 0x24, 0x19, 0x4C, 0x0E, 0x00, 0x65, 0x93, - 0xC9, 0x91, 0x11, 0x5F, 0x02, 0x4F, 0x5E, 0x49, 0x65, 0x7C, - 0x12, 0x31, 0xA0, 0x01, 0x19, 0x22, 0x42, 0x48, 0xDA, 0x67, - 0x57, 0x1A, 0x90, 0x00, 0x19, 0xA6, 0x69, 0x40, 0xCD, 0x12, - 0x36, 0x84, 0x03, 0x44, 0x0B, 0x5A, 0x00, 0x10, 0x27, 0x88, - 0x44, 0xAE, 0x06, 0x9A, 0x05, 0x9F, 0xE1, 0x89, 0x22, 0x95, - 0xA8, 0xA0, 0x29, 0xDD, 0x99, 0x4D, 0x4E, 0x39, 0xE5, 0x00, - 0x4F, 0x06, 0x0A, 0x68, 0xA0, 0x81, 0x92, 0x46, 0x06, 0x0F, - 0x64, 0x7C, 0x49, 0x86, 0x05, 0x56, 0x52, 0x69, 0x68, 0xA4, - 0x91, 0xA6, 0x59, 0x03, 0x8E, 0x08, 0xF1, 0x01, 0xC4, 0x37, - 0x08, 0x31, 0x70, 0x00, 0x58, 0x1A, 0x48, 0x21, 0x91, 0x14, - 0xF2, 0x85, 0x69, 0xAA, 0x01, 0x86, 0x9A, 0x7A, 0xE6, 0xA1, - 0x55, 0x4A, 0xB4, 0xAA, 0xA4, 0x24, 0x26, 0x70, 0x5E, 0x72, - 0x05, 0xB4, 0x96, 0x81, 0x44, 0x68, 0xB6, 0x26, 0x26, 0x6B, - 0x15, 0x79, 0xF6, 0x59, 0xA3, 0xD6, 0x91, 0x06, 0x51, 0x7D, - 0x19, 0x74, 0x33, 0x4E, 0x3B, 0x5B, 0xAD, 0x70, 0xEA, 0xB2, - 0x61, 0x02, 0x27, 0xEC, 0x68, 0xBA, 0xAE, 0xB0, 0x50, 0x01, - 0x0E, 0xAD, 0x00, 0x91, 0x06, 0xD6, 0x52, 0x76, 0xED, 0xB6, - 0x2B, 0x34, 0x74, 0x14, 0x51, 0x18, 0x64, 0xA8, 0x10, 0x60, - 0x19, 0xD2, 0x94, 0x90, 0x0A, 0xC9, 0xC0, 0xF6, 0x2D, 0x63, - 0xC3, 0x62, 0x7B, 0x1F, 0x15, 0xDA, 0x2C, 0xC1, 0x47, 0x03, - 0x74, 0xA4, 0xB0, 0x42, 0x0A, 0xD8, 0xE2, 0xAB, 0x81, 0xBD, - 0xFB, 0x62, 0xEB, 0x6F, 0xB6, 0x10, 0x01, 0xBC, 0x42, 0xB6, - 0x03, 0x17, 0x5C, 0x70, 0x7D, 0x05, 0xF3, 0x80, 0x0C, 0xB5, - 0xD4, 0xAE, 0xA0, 0x30, 0xB8, 0xE1, 0x46, 0xAC, 0x42, 0x0C, - 0xF0, 0x4E, 0x33, 0x4D, 0xFF, 0x0C, 0x17, 0x23, 0xC4, 0x0D, - 0x03, 0xF0, 0x4A, 0x03, 0xC0, 0x34, 0x70, 0x1C, 0xB5, 0x6E, - 0x01, 0x47, 0x61, 0xCC, 0x40, 0x0B, 0x4D, 0xAC, 0x60, 0xC6, - 0x09, 0x4D, 0xAC, 0xDC, 0x04, 0x17, 0x0B, 0xB9, 0x6C, 0x86, - 0xCB, 0x5C, 0x30, 0x64, 0xB3, 0xCD, 0x4D, 0x24, 0xD3, 0x71, - 0x06, 0x61, 0x25, 0x13, 0x5B, 0x60, 0xE3, 0x02, 0x16, 0x2E, - 0xB9, 0xCB, 0x00, 0xC0, 0x31, 0xC7, 0xDA, 0x30, 0x60, 0x74, - 0xA7, 0x4A, 0x23, 0xB4, 0xF4, 0x12, 0x07, 0x2C, 0xD1, 0xC2, - 0xC6, 0x9E, 0x6E, 0xB3, 0x55, 0xC7, 0x00, 0x58, 0xB1, 0x0D, - 0xCA, 0x5C, 0x58, 0x4C, 0xCD, 0x09, 0xD6, 0x36, 0x41, 0x85, - 0xCF, 0x63, 0xF3, 0xB0, 0x82, 0xD7, 0xD2, 0x74, 0x4C, 0x05, - 0x1F, 0x41, 0xE8, 0x41, 0x81, 0x38, 0x58, 0xB4, 0xA0, 0x82, - 0xD9, 0x19, 0x2C, 0xB1, 0x84, 0x42, 0x0C, 0x68, 0x0D, 0x2F, - 0xD2, 0xDA, 0x8C, 0xDB, 0x90, 0xD4, 0x06, 0x19, 0xF4, 0x66, - 0xE0, 0x2D, 0x60, 0x01, 0x42, 0x03, 0x0D, 0x04, 0x0E, 0xC4, - 0xE1, 0x8C, 0x27, 0x1E, 0x38, 0x08, 0x90, 0x13, 0x6E, 0x10, - 0x08, 0xF8, 0xD9, 0x61, 0xB9, 0x1D, 0x58, 0x30, 0x6A, 0xC1, - 0x44, 0x66, 0x0C, 0xC0, 0xC3, 0x68, 0x52, 0xF3, 0x21, 0xB9, - 0xE8, 0x40, 0x34, 0x00, 0x03, 0x1A, 0x39, 0x08, 0x21, 0x42, - 0x0F, 0x2A, 0xC8, 0xDA, 0x1A, 0x15, 0xE7, 0x75, 0x2B, 0xDA, - 0x09, 0x9E, 0x89, 0xA6, 0x2C, 0xB6, 0x30, 0x20, 0x0E, 0xC3, - 0xEE, 0x30, 0x04, 0xE1, 0x3B, 0xEF, 0xBB, 0x33, 0x21, 0x7C, - 0x10, 0xB9, 0x07, 0x2F, 0xFC, 0xF1, 0xC4, 0xF7, 0x3E, 0xFC, - 0xEE, 0xBE, 0x2B, 0x20, 0x40, 0xF2, 0x41, 0xDC, 0x01, 0x05, - 0x1B, 0xD4, 0x77, 0xC1, 0x86, 0x0D, 0x4A, 0xB0, 0x71, 0xC6, - 0x19, 0x6D, 0xF6, 0x41, 0xD5, 0xF7, 0xE0, 0x7F, 0x2F, 0x43, - 0xFF, 0x04, 0x33, 0x30, 0x31, 0x03, 0xF5, 0x33, 0xA4, 0x20, - 0xC3, 0x19, 0xDA, 0xB3, 0xC1, 0x03, 0x1B, 0x66, 0x40, 0x93, - 0x3D, 0xFC, 0xE7, 0x9F, 0x01, 0x85, 0x55, 0xF8, 0xCB, 0x90, - 0x44, 0x12, 0x73, 0xCC, 0xB1, 0xFF, 0xFF, 0xFB, 0xEB, 0x9F, - 0xFF, 0x00, 0x48, 0xC0, 0x01, 0xCE, 0xA1, 0x02, 0x6A, 0x28, - 0x01, 0x05, 0x28, 0xA0, 0x07, 0x02, 0x20, 0x40, 0x04, 0x39, - 0xC8, 0x81, 0x08, 0x44, 0x70, 0x81, 0x29, 0x58, 0x70, 0x0A, - 0x17, 0xF0, 0x40, 0x06, 0x3D, 0xC0, 0xC1, 0x0E, 0x7A, 0xF0, - 0x83, 0x1C, 0xBC, 0xC0, 0x1B, 0x88, 0xD0, 0x83, 0x0B, 0x98, - 0xF0, 0x02, 0x26, 0x38, 0x21, 0x07, 0x53, 0x78, 0x42, 0x0C, - 0x9A, 0x50, 0x83, 0x1B, 0x04, 0x61, 0x08, 0x63, 0xD8, 0xC1, - 0x13, 0xDA, 0x90, 0x86, 0x1E, 0x14, 0x21, 0x09, 0x55, 0x17, - 0x07, 0x01, 0xE8, 0xE1, 0x0F, 0x13, 0x08, 0xE2, 0x04, 0xF2, - 0x60, 0x82, 0x22, 0xAE, 0xAE, 0x07, 0x68, 0x10, 0x81, 0x1E, - 0x56, 0x87, 0x86, 0x1E, 0xAC, 0x4E, 0x0F, 0x7A, 0x48, 0xA2, - 0xEA, 0x9A, 0xD8, 0x03, 0x27, 0x06, 0xF1, 0x0F, 0x7A, 0x40, - 0x40, 0x0F, 0x84, 0xD0, 0x03, 0x26, 0x34, 0xF1, 0x89, 0x4F, - 0xAC, 0xA2, 0x08, 0xE2, 0xB0, 0xBA, 0x38, 0x88, 0x51, 0x82, - 0x3D, 0xC8, 0x01, 0x05, 0x90, 0x98, 0xC6, 0x09, 0xF6, 0xC0, - 0x8C, 0x62, 0x5C, 0x62, 0x15, 0x23, 0x78, 0xC4, 0x1E, 0x50, - 0x40, 0x89, 0x71, 0x98, 0xC0, 0x1F, 0x80, 0x28, 0xC4, 0x3F, - 0x04, 0x20, 0x07, 0x7B, 0x0C, 0xA4, 0x09, 0x1C, 0x10, 0x86, - 0x29, 0xEC, 0xC1, 0x2C, 0x0A, 0x70, 0x83, 0x02, 0xC6, 0x20, - 0x00, 0xCB, 0x3D, 0x40, 0x00, 0x63, 0x40, 0xC1, 0x0F, 0xE8, - 0xE0, 0x06, 0x3C, 0x7C, 0xE0, 0x0E, 0x0F, 0xC0, 0x03, 0x1D, - 0x44, 0xB0, 0xC7, 0x3D, 0xE0, 0xC1, 0xFF, 0x0D, 0x63, 0x20, - 0xC0, 0x07, 0xDC, 0x40, 0x87, 0x0F, 0x08, 0xC0, 0x0D, 0x0F, - 0x50, 0xC0, 0x28, 0x3F, 0xE0, 0xBC, 0x0F, 0xD8, 0x61, 0x0C, - 0x0F, 0x18, 0xC3, 0x07, 0xE8, 0xF0, 0x00, 0x52, 0x2A, 0x80, - 0x00, 0x93, 0x14, 0x25, 0x1E, 0xC6, 0x60, 0x87, 0x0F, 0x8C, - 0x92, 0x94, 0x0F, 0xD8, 0xC3, 0x0F, 0xDC, 0xF0, 0x83, 0x31, - 0xC8, 0xC1, 0x72, 0xC4, 0x1C, 0xC3, 0x18, 0xD0, 0x10, 0xC8, - 0x66, 0xFE, 0xB1, 0x99, 0x7F, 0x40, 0x03, 0x14, 0x9E, 0xF2, - 0x47, 0x02, 0x38, 0x4F, 0x0E, 0x04, 0x10, 0x40, 0x36, 0xF7, - 0xD0, 0x48, 0x05, 0x1C, 0x12, 0x97, 0x76, 0x58, 0xCA, 0x2D, - 0x7B, 0xB0, 0x47, 0x0A, 0xEC, 0xE1, 0x9C, 0xE1, 0x44, 0x00, - 0x54, 0x96, 0x42, 0x80, 0x43, 0xDE, 0x21, 0x00, 0xEF, 0x7C, - 0xE5, 0x1E, 0x02, 0x80, 0x00, 0x3B, 0x04, 0x40, 0x9B, 0x8F, - 0x7C, 0xC2, 0x2B, 0xE9, 0x60, 0x4D, 0x01, 0x20, 0x80, 0x00, - 0x63, 0x08, 0x00, 0x01, 0x02, 0x20, 0x07, 0x6E, 0x1A, 0xF3, - 0x09, 0x7A, 0xD8, 0x83, 0x1D, 0xCE, 0xC9, 0x49, 0x68, 0xEE, - 0xF1, 0x99, 0xCD, 0xFC, 0x67, 0x3B, 0xED, 0x80, 0x86, 0x31, - 0xFC, 0x40, 0x00, 0x02, 0x9D, 0x28, 0x46, 0xCD, 0x62, 0x87, - 0x63, 0x86, 0x92, 0x00, 0x76, 0xB0, 0xE6, 0x0F, 0xFF, 0x20, - 0x07, 0x48, 0xFE, 0x60, 0x9B, 0x02, 0xC8, 0xC1, 0x18, 0x14, - 0x10, 0x4E, 0x80, 0xF6, 0x60, 0x0F, 0x08, 0x50, 0xA8, 0x02, - 0x9E, 0x22, 0x87, 0x31, 0x48, 0x94, 0x97, 0xDA, 0xF4, 0x07, - 0x02, 0x9A, 0xE2, 0xD1, 0x00, 0x3C, 0xC1, 0xA7, 0x0A, 0x35, - 0x66, 0x00, 0xD0, 0x00, 0x52, 0xB3, 0x34, 0xD4, 0xA1, 0x10, - 0x0D, 0x64, 0x00, 0x14, 0x50, 0x53, 0x05, 0xFC, 0x40, 0x01, - 0x74, 0x60, 0xA9, 0x00, 0x6E, 0x19, 0x4A, 0xCB, 0xAD, 0x74, - 0xA0, 0x0E, 0xFF, 0x0D, 0x24, 0x02, 0x9E, 0xEA, 0x3C, 0x6E, - 0xD2, 0x21, 0x00, 0x2B, 0x15, 0xC0, 0x0F, 0x7E, 0x10, 0xCE, - 0x07, 0x98, 0x72, 0x0F, 0x72, 0x78, 0x00, 0x1D, 0x6C, 0xEA, - 0x54, 0x3B, 0xFC, 0xE0, 0x9F, 0x4F, 0x0D, 0xE9, 0x4C, 0x5F, - 0x79, 0x4B, 0xA9, 0xD8, 0x41, 0x01, 0x2C, 0xBD, 0xE5, 0x13, - 0x4E, 0xBA, 0xD6, 0xA2, 0xEA, 0xD1, 0x99, 0x80, 0x6C, 0x66, - 0x0E, 0x60, 0xFA, 0x84, 0x92, 0x86, 0x53, 0x01, 0x3A, 0x05, - 0x2B, 0x40, 0x8B, 0x19, 0x80, 0x3E, 0x14, 0xE1, 0x08, 0x4E, - 0xBC, 0x63, 0x1C, 0xB4, 0x7A, 0xCE, 0x79, 0xCA, 0x21, 0x2A, - 0x72, 0x08, 0xC0, 0x3C, 0x2F, 0x1A, 0xD3, 0xA5, 0xEC, 0x81, - 0x0E, 0xAF, 0x64, 0xCA, 0x1D, 0xDA, 0x19, 0x80, 0x85, 0x3E, - 0x01, 0xA4, 0x36, 0x15, 0xC0, 0x31, 0x9F, 0xA0, 0xCE, 0x7A, - 0x84, 0x54, 0xB5, 0xE9, 0x6C, 0xA7, 0x4C, 0xE3, 0xF1, 0x57, - 0xA5, 0x06, 0x56, 0xAB, 0x4E, 0x5D, 0x29, 0x54, 0x15, 0x20, - 0x49, 0x02, 0xDC, 0x01, 0x95, 0x8B, 0x5D, 0x26, 0x11, 0x88, - 0xF0, 0x04, 0x4A, 0xBA, 0xE1, 0x03, 0x04, 0xD0, 0x2A, 0x01, - 0xA2, 0xCA, 0xDB, 0xA8, 0x5E, 0xD4, 0x72, 0x9A, 0xDC, 0xC3, - 0x4A, 0x3F, 0xFA, 0x04, 0xE7, 0xD9, 0x81, 0x0E, 0x63, 0xA5, - 0xA5, 0x02, 0xD0, 0x40, 0x01, 0xA7, 0x1E, 0x77, 0x0F, 0xB1, - 0x24, 0x00, 0x0A, 0x14, 0x89, 0xDD, 0x27, 0x84, 0x32, 0x95, - 0xC4, 0x4C, 0xA5, 0x1D, 0x8E, 0x0A, 0x58, 0x68, 0x52, 0xC0, - 0x0E, 0x77, 0xF8, 0x29, 0x41, 0xE5, 0x21, 0x80, 0x73, 0xD2, - 0x13, 0xAD, 0x04, 0xCD, 0x9D, 0xE9, 0x1A, 0x40, 0x05, 0xC4, - 0xDD, 0x21, 0x90, 0x7A, 0xB8, 0x2C, 0x77, 0x11, 0xCB, 0x94, - 0x00, 0x50, 0xE0, 0x0E, 0x25, 0xA5, 0x87, 0x3F, 0xDF, 0xF9, - 0x84, 0x1C, 0x0C, 0x95, 0x02, 0x02, 0xBD, 0x03, 0xFF, 0x46, - 0x25, 0xFC, 0x04, 0x34, 0x94, 0x16, 0xAD, 0x68, 0xD0, 0xCD, - 0x3C, 0x7D, 0x6A, 0x60, 0x39, 0x64, 0x76, 0x0F, 0x16, 0xC6, - 0x26, 0x41, 0x91, 0x7A, 0xDB, 0x3D, 0x22, 0x80, 0x0E, 0x53, - 0x1D, 0xEB, 0x4A, 0xDD, 0x2A, 0xDD, 0xBB, 0xAE, 0xF4, 0xA2, - 0x1C, 0x53, 0x01, 0x37, 0xA8, 0x91, 0x01, 0x20, 0x04, 0x92, - 0xA8, 0x27, 0xDD, 0xAB, 0x02, 0x62, 0x79, 0xCD, 0x14, 0x33, - 0xB2, 0xA6, 0xA1, 0xDC, 0xAA, 0x3D, 0x8B, 0x69, 0xDE, 0x1F, - 0x28, 0xF4, 0x07, 0x4B, 0x85, 0x2A, 0x59, 0x71, 0x49, 0x00, - 0x7D, 0xAE, 0x14, 0x01, 0x3B, 0xD6, 0xE6, 0x21, 0xC7, 0x40, - 0x87, 0xB5, 0xD6, 0xF6, 0xA1, 0x25, 0xFE, 0xC3, 0x89, 0x55, - 0x1C, 0xCB, 0x1F, 0xC8, 0x01, 0xC9, 0x7B, 0xB8, 0x65, 0x38, - 0xEF, 0x6A, 0xD5, 0x1D, 0xEF, 0xC1, 0xA1, 0xF5, 0x94, 0xE5, - 0x40, 0xDD, 0x80, 0xCB, 0xA5, 0x66, 0x53, 0x99, 0x4E, 0x5D, - 0x4A, 0x31, 0xEF, 0xFA, 0x01, 0x6C, 0x7A, 0xD9, 0xAD, 0x2B, - 0xF6, 0x2E, 0x01, 0x72, 0x10, 0x57, 0xBC, 0x82, 0x12, 0x96, - 0xFC, 0x0C, 0x29, 0x29, 0x03, 0x3A, 0x86, 0x2B, 0x63, 0x19, - 0x9A, 0x39, 0x68, 0x27, 0x82, 0xD5, 0x11, 0x0F, 0x39, 0x50, - 0x00, 0x0D, 0x72, 0x40, 0x03, 0x77, 0xFD, 0xD1, 0x94, 0x79, - 0xCC, 0x03, 0xCD, 0x3F, 0xDD, 0x29, 0x3D, 0xD5, 0x09, 0x69, - 0x0A, 0xA8, 0x33, 0xBE, 0xF4, 0xF4, 0xF0, 0x3C, 0x30, 0x9A, - 0x03, 0x7A, 0x50, 0xE0, 0xB2, 0x85, 0xAD, 0x6F, 0x61, 0x1F, - 0x68, 0x4E, 0x48, 0x97, 0xB4, 0xB0, 0x1E, 0xE6, 0xF4, 0x52, - 0x10, 0x90, 0x83, 0x3B, 0x18, 0xDA, 0x8F, 0xB7, 0x8D, 0x03, - 0x13, 0xD8, 0x7B, 0xEB, 0x3D, 0xCA, 0x81, 0x94, 0x04, 0xF8, - 0xE4, 0x0F, 0xB2, 0xBA, 0x47, 0x01, 0x7C, 0xE0, 0xA2, 0x1F, - 0xC0, 0x43, 0x36, 0x45, 0xFF, 0xA9, 0xD6, 0x07, 0xFC, 0x20, - 0x96, 0xB3, 0xB4, 0x5C, 0xB0, 0x51, 0xC0, 0x4F, 0xE7, 0xC1, - 0x52, 0x94, 0xA0, 0xBC, 0x25, 0x54, 0xF1, 0x50, 0xD2, 0x8B, - 0x82, 0x52, 0xAD, 0xCE, 0x7D, 0x40, 0x00, 0x92, 0x4D, 0x87, - 0xC9, 0x66, 0x15, 0xA2, 0x4C, 0xF0, 0x02, 0x0E, 0x70, 0xE0, - 0x05, 0x04, 0xB4, 0x40, 0x0E, 0x29, 0x40, 0x41, 0x0A, 0x3E, - 0x90, 0x82, 0x7A, 0x9F, 0x19, 0x9B, 0xE7, 0xD4, 0xA6, 0x31, - 0xEF, 0xA0, 0x50, 0x66, 0x06, 0x52, 0x04, 0x3B, 0x45, 0x00, - 0xA4, 0xE1, 0x89, 0x06, 0x71, 0x20, 0xA0, 0x77, 0xBD, 0x9B, - 0x17, 0x82, 0x29, 0x10, 0x95, 0xA7, 0xC8, 0xA3, 0xB0, 0x13, - 0xA8, 0x62, 0x1C, 0x26, 0x5E, 0xC5, 0x2A, 0x46, 0xDC, 0x8C, - 0x70, 0x14, 0xC1, 0x1D, 0xDA, 0x58, 0x71, 0x62, 0xE3, 0xFA, - 0x0F, 0x22, 0x50, 0xF7, 0xBA, 0xD9, 0x9D, 0x03, 0xDE, 0x5A, - 0x00, 0x0F, 0x16, 0x90, 0x82, 0x14, 0xF0, 0x80, 0x87, 0x68, - 0x6A, 0xFB, 0x72, 0xDE, 0x34, 0xAB, 0x00, 0x22, 0x8A, 0xDD, - 0xBB, 0xF2, 0x73, 0x0C, 0x4B, 0x38, 0x01, 0x37, 0x1A, 0xA2, - 0x90, 0x64, 0x30, 0xC0, 0x79, 0x93, 0xFC, 0x41, 0x75, 0x9B, - 0xDD, 0x6B, 0x8F, 0x1B, 0xFD, 0xDC, 0x80, 0x3C, 0x00, 0x0E, - 0x2C, 0xE0, 0x01, 0x91, 0xFF, 0xA1, 0x07, 0x1F, 0x90, 0xF7, - 0x29, 0x03, 0x1A, 0x80, 0x3F, 0x8C, 0xD6, 0x9A, 0xA1, 0xFC, - 0xE9, 0x0F, 0x50, 0x80, 0x00, 0x87, 0x16, 0x3D, 0x90, 0x5F, - 0x3F, 0xFA, 0x15, 0x8F, 0x0E, 0xF6, 0xA3, 0x3F, 0x53, 0xE9, - 0x38, 0x80, 0x81, 0xBA, 0xA5, 0x20, 0x44, 0x7A, 0x00, 0xB1, - 0x07, 0x57, 0x7C, 0xEF, 0x18, 0x14, 0x1A, 0xCE, 0xA7, 0xB0, - 0x94, 0xBD, 0x1E, 0xBD, 0x65, 0x2C, 0x2D, 0x4A, 0x01, 0x02, - 0x54, 0xB2, 0xBE, 0x28, 0x60, 0x29, 0x31, 0xDB, 0x09, 0xC9, - 0xFF, 0x00, 0x28, 0x1B, 0xAF, 0xB7, 0xC4, 0xC3, 0x52, 0xDC, - 0xF0, 0x6D, 0xE9, 0x22, 0x5E, 0x94, 0x63, 0x00, 0xC2, 0x34, - 0x6A, 0xCC, 0x83, 0xD8, 0x64, 0xF9, 0xD0, 0x39, 0x58, 0xB7, - 0x00, 0xD6, 0x2D, 0x85, 0x2A, 0x7F, 0x52, 0x00, 0x28, 0x40, - 0x41, 0x26, 0x51, 0x10, 0x07, 0x04, 0x90, 0x7B, 0xC7, 0xA8, - 0xA4, 0x40, 0x24, 0x3F, 0xD0, 0x4C, 0x11, 0x78, 0xFA, 0xB4, - 0xF4, 0x68, 0x4A, 0xA9, 0x31, 0x7B, 0x59, 0x98, 0x76, 0x54, - 0xE0, 0xF3, 0xB0, 0xB0, 0x66, 0x27, 0xBC, 0x07, 0x09, 0xDB, - 0x61, 0xA7, 0x02, 0x58, 0xB4, 0x6E, 0x58, 0xBB, 0x07, 0xE2, - 0x69, 0xAA, 0xE0, 0x41, 0x40, 0x1C, 0x39, 0x49, 0x5C, 0x6C, - 0x29, 0xFC, 0xC1, 0x0D, 0x28, 0x10, 0x40, 0xBC, 0xEB, 0x85, - 0x07, 0x14, 0x98, 0x32, 0x05, 0x0F, 0x88, 0xC3, 0x14, 0x88, - 0xA0, 0x86, 0x5A, 0xAB, 0x56, 0xA7, 0x13, 0x6F, 0x26, 0x10, - 0x4E, 0x30, 0xB6, 0x85, 0x2C, 0xC4, 0xE7, 0xCA, 0xE0, 0x01, - 0x15, 0xD0, 0x70, 0xEC, 0x98, 0xA3, 0x32, 0xAA, 0x0A, 0xF5, - 0x65, 0x76, 0x3D, 0x89, 0x87, 0x07, 0xA4, 0x52, 0x00, 0xFC, - 0xD4, 0xE6, 0x07, 0x32, 0xC9, 0xD5, 0x52, 0x52, 0xC0, 0xEC, - 0x97, 0x87, 0x45, 0xF7, 0x05, 0x61, 0x14, 0x90, 0x03, 0xFE, - 0x24, 0x07, 0x7F, 0x30, 0x05, 0x0E, 0x60, 0x02, 0x08, 0x40, - 0x65, 0x93, 0x34, 0x06, 0x4F, 0xE0, 0x50, 0x41, 0xC0, 0x4D, - 0x6B, 0xB0, 0x1B, 0x03, 0xB1, 0x07, 0x6B, 0x50, 0x58, 0x04, - 0x61, 0x4F, 0x97, 0xE5, 0x61, 0xEE, 0x64, 0x4F, 0xDC, 0x74, - 0x48, 0x31, 0xC5, 0x5A, 0xF7, 0x24, 0x15, 0x68, 0x30, 0x4F, - 0xC3, 0x57, 0x53, 0x08, 0x20, 0x56, 0x8D, 0xF4, 0x7B, 0x43, - 0xE5, 0x4F, 0xB7, 0x96, 0x54, 0x7B, 0x34, 0x5A, 0x16, 0xE5, - 0x40, 0x16, 0x95, 0x5A, 0xD6, 0xB4, 0xFF, 0x48, 0x60, 0xA5, - 0x6D, 0x4B, 0x45, 0x50, 0xFE, 0xD4, 0x4C, 0x15, 0x65, 0x16, - 0x1F, 0x75, 0x4B, 0x62, 0x95, 0x4A, 0xD3, 0x75, 0x4B, 0xC4, - 0xC4, 0x52, 0xEA, 0xB4, 0x54, 0xBC, 0xD4, 0x4E, 0x48, 0xB6, - 0x52, 0x65, 0xD1, 0x64, 0x17, 0x55, 0x5C, 0x8B, 0x44, 0x07, - 0x74, 0x07, 0x4B, 0x0B, 0x65, 0x6D, 0xD9, 0xC7, 0x7C, 0x40, - 0x98, 0x6F, 0x06, 0xA6, 0x61, 0x90, 0x86, 0x56, 0x21, 0x55, - 0x50, 0x05, 0xF5, 0x53, 0x8E, 0x16, 0x60, 0x23, 0x55, 0x4E, - 0xBC, 0xB4, 0x50, 0x64, 0x25, 0x0F, 0x27, 0x65, 0x53, 0x1C, - 0xE5, 0x06, 0x77, 0x10, 0x4A, 0xB0, 0x74, 0x5A, 0x6F, 0x15, - 0x15, 0xD6, 0xD4, 0x03, 0x90, 0xB4, 0x52, 0x85, 0xF5, 0x5A, - 0xFA, 0x24, 0x00, 0x68, 0x00, 0x04, 0x56, 0xD3, 0x00, 0x75, - 0xD3, 0x0D, 0x46, 0x27, 0x83, 0x56, 0xB7, 0x50, 0xC7, 0xD4, - 0x48, 0x7B, 0xE7, 0x6C, 0x76, 0xC0, 0x07, 0x1A, 0xC0, 0x07, - 0x0C, 0xB1, 0x04, 0x7C, 0xE1, 0x10, 0xFF, 0x07, 0x4D, 0xBF, - 0x06, 0x81, 0x2D, 0x88, 0x05, 0x77, 0xF0, 0x5A, 0xA5, 0x45, - 0x57, 0x3E, 0xD5, 0x52, 0xFE, 0x64, 0x07, 0xBA, 0xB1, 0x50, - 0x0E, 0x54, 0x77, 0xA4, 0xF8, 0x65, 0xB7, 0x74, 0x4C, 0xF3, - 0xB4, 0x29, 0xDD, 0x00, 0x03, 0x82, 0xB1, 0x04, 0x40, 0x70, - 0x71, 0xCB, 0xD7, 0x5E, 0xAD, 0x17, 0x0F, 0x07, 0x66, 0x0E, - 0xEA, 0x10, 0x04, 0x72, 0xC0, 0x07, 0x0B, 0x14, 0x04, 0x14, - 0x10, 0x04, 0xF2, 0xA2, 0x3B, 0x30, 0x70, 0x6B, 0x92, 0x98, - 0x0C, 0x95, 0xB7, 0x10, 0x14, 0x40, 0x4B, 0x8F, 0x24, 0x4B, - 0x8A, 0xF7, 0x00, 0xE6, 0x85, 0x7A, 0xA7, 0x74, 0x52, 0xF5, - 0xC7, 0x78, 0x93, 0x74, 0x4A, 0xA0, 0xC5, 0x4B, 0xB4, 0xB4, - 0x07, 0xE3, 0x85, 0x57, 0xF5, 0x27, 0x70, 0xA0, 0x24, 0x4C, - 0x96, 0x34, 0xFF, 0x06, 0x5C, 0x18, 0x48, 0x40, 0xC0, 0x17, - 0x0B, 0x81, 0x8E, 0x77, 0x93, 0x01, 0x3C, 0x40, 0x89, 0xDA, - 0x50, 0x79, 0x0E, 0xC1, 0x07, 0x1E, 0x17, 0x71, 0x5C, 0xC4, - 0x45, 0x15, 0x37, 0x71, 0x79, 0xE4, 0x44, 0x63, 0x74, 0x60, - 0x2B, 0x08, 0x0F, 0x9D, 0x88, 0x00, 0xAF, 0x47, 0x7C, 0x8C, - 0x16, 0x7C, 0xEA, 0x30, 0x70, 0x99, 0x15, 0x53, 0xF5, 0xB0, - 0x07, 0x50, 0x14, 0x7B, 0xFC, 0xB6, 0x71, 0xD0, 0x84, 0x88, - 0x63, 0x47, 0x6C, 0x11, 0x19, 0x48, 0xDA, 0x77, 0x41, 0x16, - 0x39, 0x05, 0x47, 0x90, 0x91, 0x1A, 0x99, 0x91, 0x39, 0x00, - 0x45, 0x7A, 0x90, 0x03, 0x19, 0x39, 0x83, 0x51, 0x45, 0x4C, - 0xDC, 0x34, 0x56, 0xDA, 0x84, 0x57, 0x02, 0xF0, 0x00, 0x76, - 0xE0, 0x06, 0xDA, 0x84, 0x5D, 0x63, 0xF5, 0x54, 0x68, 0x80, - 0x64, 0x04, 0xF0, 0x48, 0x26, 0x89, 0x02, 0xBB, 0x04, 0x55, - 0x74, 0xD0, 0x75, 0xB6, 0x18, 0x48, 0x12, 0x76, 0x92, 0xF7, - 0x54, 0x55, 0xBF, 0x37, 0x06, 0x6A, 0xB0, 0x80, 0xA1, 0x34, - 0x59, 0x44, 0xB0, 0x00, 0x0B, 0x50, 0x06, 0x49, 0xB9, 0x94, - 0x4A, 0xD9, 0x94, 0x4C, 0x69, 0x04, 0xAA, 0x90, 0x94, 0xE4, - 0xB4, 0x55, 0x00, 0x15, 0x4A, 0x3F, 0x80, 0x49, 0x0E, 0x34, - 0x55, 0xDE, 0x34, 0x10, 0xD5, 0x80, 0x34, 0x0C, 0x60, 0x5E, - 0x4D, 0x08, 0x52, 0xA3, 0x68, 0x07, 0x66, 0x85, 0x5A, 0xE6, - 0xB6, 0x93, 0x7B, 0x94, 0x03, 0x50, 0x30, 0x03, 0x50, 0x70, - 0x06, 0x60, 0x50, 0x50, 0x3C, 0x31, 0x03, 0x7D, 0x20, 0x07, - 0x17, 0x40, 0x04, 0x53, 0xB0, 0x50, 0x46, 0x89, 0x94, 0x65, - 0xA0, 0x94, 0x48, 0xD9, 0x97, 0x7E, 0xD9, 0x97, 0xAB, 0x00, - 0x25, 0x34, 0x90, 0x94, 0x2D, 0xF7, 0x5E, 0xE7, 0xC4, 0x48, - 0xC1, 0x57, 0x50, 0x19, 0xA6, 0x1B, 0xFE, 0x84, 0xFF, 0x00, - 0xE3, 0x70, 0x2C, 0xBC, 0xA8, 0x4F, 0xA4, 0xA8, 0x5A, 0xF5, - 0x40, 0x0F, 0xE1, 0x84, 0x51, 0x02, 0x10, 0x83, 0x59, 0x36, - 0x48, 0x44, 0xB0, 0x01, 0x26, 0xB4, 0x63, 0x50, 0xE0, 0x00, - 0x0E, 0x40, 0x04, 0x26, 0x10, 0x06, 0x45, 0xD4, 0x4C, 0x47, - 0x59, 0x06, 0x45, 0xC0, 0x01, 0x7F, 0xD9, 0x9A, 0x48, 0xE9, - 0x03, 0x0C, 0x80, 0x05, 0x51, 0x80, 0x04, 0x48, 0xD9, 0x72, - 0x72, 0xE0, 0x92, 0xC3, 0xB4, 0x56, 0x4F, 0x35, 0x56, 0x04, - 0x20, 0x02, 0x84, 0xB6, 0x48, 0x1F, 0x00, 0x56, 0xD8, 0x95, - 0x5B, 0xBE, 0x85, 0x07, 0x21, 0x05, 0x4B, 0x70, 0x66, 0x4D, - 0x97, 0x87, 0x88, 0x47, 0x30, 0x03, 0x49, 0xD0, 0x07, 0xAE, - 0x87, 0x59, 0x17, 0x00, 0x06, 0x02, 0x84, 0x05, 0xF0, 0x75, - 0x07, 0x9C, 0xE4, 0x00, 0x49, 0xC9, 0x01, 0xAC, 0xE9, 0x9A, - 0x7F, 0xE9, 0x00, 0x75, 0x80, 0x05, 0x1D, 0x90, 0x9A, 0x85, - 0x29, 0x5D, 0x03, 0x65, 0x5A, 0xD8, 0xD4, 0x4E, 0x85, 0xC5, - 0x6F, 0x31, 0x75, 0x4E, 0xEA, 0x94, 0x4D, 0xC7, 0xF4, 0x7B, - 0x25, 0xB5, 0x69, 0x51, 0x21, 0x86, 0x63, 0x70, 0x89, 0x68, - 0xA9, 0x65, 0x4F, 0x35, 0x77, 0x6A, 0xF5, 0x6C, 0x58, 0xC0, - 0x4A, 0x28, 0x56, 0x73, 0x0A, 0xC0, 0x49, 0x47, 0x99, 0x94, - 0x7C, 0xE9, 0x9D, 0x7D, 0x59, 0x06, 0xDC, 0xC9, 0x01, 0x7C, - 0x69, 0x9B, 0xF5, 0x87, 0x57, 0x4F, 0x75, 0x5A, 0xBA, 0x29, - 0x56, 0xCF, 0x76, 0x07, 0x26, 0x09, 0x55, 0x14, 0x0A, 0x55, - 0x72, 0xB0, 0x63, 0x10, 0x78, 0x57, 0x4F, 0x95, 0x92, 0xAE, - 0x54, 0x8E, 0x69, 0x09, 0x56, 0xC7, 0x04, 0x9C, 0x3B, 0x45, - 0x8A, 0xFF, 0x24, 0x07, 0xB5, 0xF8, 0x07, 0xA9, 0xB9, 0x97, - 0x2E, 0xEA, 0x94, 0x08, 0x9A, 0xA0, 0x2D, 0xF7, 0x4F, 0x53, - 0x65, 0x4C, 0x31, 0x35, 0xFF, 0x50, 0x99, 0x75, 0x7B, 0x17, - 0x85, 0x60, 0x63, 0xF0, 0x4E, 0xF9, 0xA6, 0x68, 0xC7, 0x04, - 0x9F, 0xAC, 0xB8, 0x14, 0x02, 0xB0, 0xA2, 0x87, 0xD6, 0x4C, - 0x9D, 0xC8, 0x4B, 0xF7, 0xA4, 0x4D, 0x19, 0x55, 0x54, 0x3F, - 0x00, 0x48, 0x13, 0x30, 0x59, 0x0E, 0xC0, 0x01, 0x61, 0x40, - 0x04, 0x2F, 0x20, 0x01, 0x6C, 0x60, 0xA5, 0x5B, 0x20, 0x05, - 0x2E, 0x60, 0x04, 0x34, 0xE0, 0x09, 0x5E, 0x4A, 0x03, 0x34, - 0xD0, 0x06, 0x6D, 0xC0, 0x9D, 0x85, 0xC9, 0x52, 0x66, 0x41, - 0x56, 0x27, 0xF5, 0xA3, 0x72, 0x60, 0x80, 0x10, 0x78, 0x07, - 0x73, 0xF5, 0x51, 0x8C, 0xD4, 0x80, 0xCA, 0x74, 0x8A, 0x6B, - 0x68, 0x5E, 0x46, 0xFA, 0x71, 0xCE, 0xF4, 0x54, 0xC7, 0xC6, - 0x55, 0xAE, 0x74, 0x57, 0x6A, 0x85, 0x07, 0x77, 0x50, 0x4A, - 0x55, 0x37, 0xA5, 0x61, 0xE0, 0x00, 0x6F, 0x20, 0x01, 0x16, - 0x10, 0x06, 0x2F, 0x60, 0x04, 0x5B, 0x20, 0x06, 0x6D, 0xE0, - 0xA5, 0x82, 0x40, 0x03, 0x61, 0x4A, 0xA6, 0x37, 0xC0, 0x01, - 0x2D, 0x17, 0x00, 0xCF, 0x46, 0x93, 0x6B, 0x85, 0x7F, 0x82, - 0x57, 0x73, 0xE0, 0x26, 0x50, 0xB5, 0x34, 0x4B, 0xD5, 0x35, - 0x92, 0x00, 0x65, 0x7F, 0x3B, 0x56, 0x75, 0xC4, 0x86, 0x88, - 0x68, 0x00, 0x88, 0x3B, 0xF5, 0x4E, 0xF5, 0x05, 0x0F, 0x16, - 0x36, 0x07, 0x6A, 0xA0, 0x06, 0x6E, 0x43, 0x4E, 0x0E, 0xF0, - 0x02, 0x87, 0xFA, 0x02, 0x62, 0x40, 0x03, 0x48, 0xD0, 0xA8, - 0x7E, 0xA0, 0x04, 0x2F, 0x70, 0x03, 0x62, 0x3A, 0x02, 0x63, - 0x4A, 0xA9, 0x64, 0x5A, 0xA6, 0x2D, 0x67, 0x69, 0xBD, 0x87, - 0x06, 0xB8, 0xE7, 0xAC, 0xCE, 0x5A, 0x90, 0x97, 0x35, 0x54, - 0x1E, 0xF8, 0x4E, 0xB1, 0x66, 0xAD, 0x91, 0x16, 0x4E, 0xF5, - 0xE0, 0x46, 0x22, 0xFA, 0x07, 0x9E, 0x34, 0x55, 0xCE, 0xA5, - 0xFF, 0x49, 0xC3, 0x64, 0x49, 0x87, 0xBA, 0x01, 0xCD, 0x64, - 0xA8, 0x44, 0xE0, 0x03, 0x62, 0x90, 0x06, 0x69, 0xE0, 0x03, - 0x69, 0xE0, 0x07, 0x52, 0x60, 0xA5, 0x37, 0x50, 0xA9, 0x46, - 0x50, 0xAF, 0x6D, 0x70, 0xA9, 0xCB, 0xEA, 0x5D, 0xDC, 0x86, - 0x62, 0xFA, 0xD6, 0x4D, 0xB3, 0x94, 0x4A, 0x46, 0x88, 0x07, - 0x3F, 0xD0, 0x5D, 0x9F, 0xF4, 0x01, 0xFA, 0xE4, 0x06, 0x1E, - 0x5A, 0x16, 0xFC, 0xF4, 0x01, 0xE4, 0xF8, 0x90, 0x59, 0x36, - 0x05, 0x1B, 0xB0, 0x01, 0x61, 0xB0, 0x01, 0x0C, 0xE8, 0x4A, - 0x0E, 0xF4, 0x5C, 0xF2, 0xE9, 0x40, 0x7F, 0x90, 0xAB, 0x47, - 0x10, 0x06, 0x61, 0x30, 0x03, 0x15, 0x20, 0x05, 0x45, 0x20, - 0x06, 0x16, 0x90, 0x02, 0x1E, 0x30, 0x5C, 0x62, 0xB0, 0x03, - 0x2A, 0xEB, 0x03, 0x3B, 0xE0, 0x03, 0xEA, 0x2A, 0x06, 0x2D, - 0x57, 0x51, 0x96, 0x23, 0x5D, 0x18, 0x15, 0x4E, 0xDC, 0x64, - 0x4F, 0x08, 0xC0, 0x07, 0x1C, 0x33, 0x2F, 0xF2, 0x42, 0x0D, - 0x7C, 0x30, 0x58, 0xF5, 0x54, 0x5F, 0x0A, 0x30, 0x0F, 0xD8, - 0x84, 0x4D, 0x79, 0xAA, 0xA7, 0x81, 0x54, 0x97, 0xDC, 0x97, - 0x07, 0x71, 0xF0, 0x89, 0x4F, 0xD0, 0x89, 0x2A, 0x59, 0x5F, - 0x0A, 0x35, 0x73, 0xB9, 0x0A, 0x07, 0x1A, 0xF0, 0x16, 0x3F, - 0xB1, 0x02, 0x3E, 0xC1, 0x05, 0x69, 0x48, 0x6C, 0x14, 0x30, - 0xA3, 0x02, 0xDB, 0x82, 0xBF, 0x67, 0x39, 0x4C, 0xA1, 0x88, - 0x40, 0x00, 0x2F, 0xE3, 0x50, 0x0D, 0xE3, 0x61, 0x4E, 0x73, - 0xA8, 0x4D, 0x03, 0x65, 0x77, 0x9A, 0xD5, 0x6B, 0x88, 0x08, - 0x61, 0x0A, 0xA0, 0x6C, 0x8C, 0x44, 0x96, 0xD9, 0xB4, 0x48, - 0x62, 0xA5, 0x93, 0x7B, 0x94, 0xAB, 0x00, 0xC0, 0x05, 0xF7, - 0xD2, 0x04, 0x76, 0x80, 0x02, 0x6A, 0xA1, 0x01, 0x67, 0x96, - 0x55, 0x57, 0x84, 0x06, 0x31, 0x0B, 0xFF, 0x4B, 0xA0, 0xE4, - 0x77, 0x2C, 0xB5, 0x92, 0x06, 0xAB, 0x5B, 0x75, 0x0A, 0x4B, - 0x2C, 0xF5, 0x62, 0x32, 0xE5, 0x06, 0xF7, 0xF4, 0x03, 0xC7, - 0x86, 0x9C, 0x04, 0xA0, 0x99, 0xD0, 0xD4, 0x03, 0xF4, 0xE0, - 0x83, 0x9D, 0x68, 0x7B, 0x55, 0x68, 0x07, 0x2B, 0x9A, 0xAB, - 0x4C, 0xA0, 0x00, 0x70, 0x40, 0x05, 0x39, 0xB0, 0xBA, 0x70, - 0xF0, 0x03, 0x5C, 0x80, 0x1F, 0x3E, 0x91, 0x16, 0x6D, 0x31, - 0x59, 0x7A, 0xA4, 0xB8, 0x58, 0x34, 0x4F, 0x28, 0x18, 0x4E, - 0x38, 0x45, 0x58, 0x1D, 0x45, 0x5A, 0x02, 0x75, 0x4E, 0xFA, - 0xD4, 0x64, 0x06, 0x06, 0x90, 0xF0, 0xE0, 0x0F, 0x6E, 0x73, - 0x07, 0x7A, 0xE0, 0xB9, 0xCE, 0xB4, 0x4B, 0xB5, 0x04, 0x4B, - 0x9A, 0x04, 0x49, 0xCB, 0x85, 0x07, 0x11, 0x78, 0xAE, 0x2F, - 0x10, 0x03, 0xA4, 0x91, 0x02, 0x41, 0xB0, 0x02, 0x28, 0xE0, - 0x2F, 0x29, 0xF0, 0x10, 0x29, 0x60, 0x00, 0x29, 0x60, 0xB5, - 0x50, 0x1A, 0x4D, 0x99, 0x4A, 0x4C, 0x77, 0xF5, 0x67, 0x64, - 0xF9, 0x48, 0xFB, 0xD7, 0x48, 0xB4, 0x64, 0x6C, 0x81, 0xF7, - 0x5B, 0x74, 0xC0, 0x72, 0x1F, 0xE0, 0x6F, 0x64, 0x67, 0x5B, - 0xD0, 0x34, 0x91, 0x79, 0x04, 0x44, 0x7B, 0x34, 0x91, 0x7D, - 0xFB, 0x02, 0x64, 0x84, 0x39, 0x6F, 0x35, 0x01, 0x63, 0x14, - 0x71, 0x6F, 0x54, 0x46, 0x04, 0xDC, 0x47, 0xB8, 0xCB, 0xBF, - 0x0C, 0x6C, 0x74, 0xB5, 0x75, 0x45, 0xFE, 0x7B, 0xBF, 0x47, - 0x9A, 0xB4, 0x9D, 0x29, 0x61, 0x90, 0xB6, 0x14, 0xDD, 0x05, - 0x5F, 0xFE, 0xC0, 0x52, 0x23, 0xE6, 0x00, 0x3E, 0xA0, 0x02, - 0x56, 0xB0, 0x16, 0x2B, 0xA0, 0x00, 0x54, 0x40, 0x00, 0x68, - 0xF0, 0x00, 0x56, 0xF0, 0x03, 0x3E, 0xF1, 0xBA, 0x56, 0x40, - 0x4E, 0x89, 0x6B, 0x9B, 0x60, 0xD5, 0x7B, 0x0A, 0x25, 0x53, - 0xF5, 0xB5, 0xFF, 0x53, 0xDB, 0x14, 0x5F, 0x51, 0x21, 0x77, - 0xFE, 0x30, 0x9F, 0x8D, 0xA4, 0x59, 0x27, 0xE8, 0x64, 0xC1, - 0xD7, 0xAD, 0xDB, 0x77, 0x04, 0x61, 0x56, 0x4F, 0x33, 0x4B, - 0x56, 0xA4, 0xF8, 0x4A, 0xAF, 0x14, 0x81, 0xB9, 0x4A, 0x02, - 0x08, 0x80, 0x05, 0x72, 0x80, 0x05, 0x43, 0x05, 0xC5, 0x58, - 0x50, 0xC5, 0x4F, 0x51, 0xC5, 0x14, 0xA0, 0x47, 0x2F, 0xAC, - 0x65, 0xBA, 0x11, 0x50, 0xDD, 0x54, 0x95, 0xA5, 0x85, 0x57, - 0x21, 0x15, 0x00, 0x7B, 0xF7, 0x14, 0xEA, 0xF9, 0x4A, 0x25, - 0xD5, 0x48, 0xF5, 0xC5, 0x4B, 0xB0, 0x74, 0x95, 0xDD, 0x4A, - 0x54, 0x16, 0xC5, 0x4A, 0xF2, 0xE4, 0x54, 0xC8, 0x45, 0x96, - 0x68, 0xA0, 0x00, 0xE6, 0x96, 0xAB, 0x0D, 0x60, 0x05, 0x2D, - 0xA5, 0x14, 0x58, 0x90, 0xC2, 0x02, 0x50, 0xC5, 0x04, 0x20, - 0xC5, 0xFD, 0xBB, 0xC5, 0x4B, 0x35, 0xBF, 0xBC, 0xA4, 0x78, - 0x8A, 0x05, 0x50, 0x8B, 0x04, 0x55, 0x52, 0x61, 0x51, 0xD7, - 0x38, 0x49, 0x21, 0x55, 0x16, 0x42, 0xE7, 0x62, 0xAF, 0xF4, - 0x54, 0xF8, 0x89, 0xBF, 0xCE, 0xE4, 0x4F, 0x28, 0xE5, 0x5B, - 0x95, 0x19, 0x53, 0x00, 0xB9, 0x07, 0x39, 0x80, 0xAB, 0x1C, - 0x40, 0x02, 0x06, 0x61, 0x05, 0x07, 0x10, 0x37, 0x81, 0xD3, - 0xB5, 0x59, 0xF5, 0xB5, 0x56, 0xA7, 0x4D, 0x66, 0x38, 0x77, - 0x44, 0xF5, 0x01, 0x0A, 0xE5, 0x61, 0xBB, 0xF4, 0xB4, 0xAA, - 0x44, 0x8A, 0x7F, 0x58, 0x0F, 0x3B, 0xF6, 0x56, 0x53, 0xFB, - 0x6A, 0x2A, 0xDA, 0xAD, 0xDF, 0x3A, 0x4C, 0x93, 0x74, 0x6C, - 0xE2, 0xB6, 0x6D, 0x8A, 0x84, 0x4A, 0x0A, 0x30, 0x01, 0x44, - 0x50, 0x06, 0x6F, 0x20, 0x9A, 0xD0, 0x1C, 0xCD, 0xD2, 0x3C, - 0xCD, 0x0E, 0x20, 0x06, 0xAC, 0xF7, 0x04, 0xF6, 0xD7, 0x14, - 0xCE, 0xF6, 0x59, 0x77, 0xF5, 0x49, 0x50, 0xB5, 0xFF, 0xBE, - 0xCD, 0xF8, 0x4F, 0x46, 0xBC, 0x4B, 0x29, 0x59, 0x4A, 0x3B, - 0xE6, 0x3C, 0x4E, 0x75, 0xB8, 0x0E, 0x0B, 0x4D, 0x17, 0xE0, - 0x00, 0x6A, 0x50, 0x4F, 0xF1, 0x35, 0x66, 0xD6, 0x24, 0x61, - 0x52, 0xC5, 0x5A, 0x42, 0x50, 0xA0, 0x31, 0x9A, 0xCF, 0x0B, - 0x30, 0xA3, 0x6E, 0xB5, 0x82, 0x4C, 0xD1, 0x82, 0xF4, 0x74, - 0x5C, 0x17, 0x0B, 0x49, 0xC1, 0xD7, 0x62, 0x9D, 0x68, 0x5D, - 0x52, 0x66, 0x8A, 0x8D, 0x24, 0x07, 0x67, 0x99, 0x9F, 0x43, - 0x0C, 0x49, 0x12, 0x36, 0x06, 0xC4, 0xF4, 0xA1, 0xC5, 0xA5, - 0x4C, 0xF5, 0x75, 0xCF, 0x31, 0xFA, 0xA2, 0x2E, 0xCA, 0x94, - 0x7D, 0xB9, 0xAC, 0x66, 0x81, 0x4D, 0x16, 0xA5, 0x4D, 0x2A, - 0x38, 0x55, 0x20, 0x26, 0x96, 0x73, 0xB5, 0x48, 0xF4, 0xEC, - 0xB6, 0xDF, 0xB4, 0x53, 0x4D, 0x75, 0xB4, 0x88, 0x18, 0x00, - 0x56, 0x50, 0x96, 0xD3, 0x75, 0x51, 0x3F, 0x80, 0x06, 0x44, - 0xE0, 0x00, 0x47, 0x00, 0x4D, 0xDA, 0x89, 0xA0, 0x1A, 0x7D, - 0xA0, 0x7E, 0x59, 0x06, 0x33, 0x0A, 0x4E, 0x00, 0xB5, 0x4D, - 0x7E, 0x96, 0x62, 0xD0, 0xD8, 0x62, 0x20, 0x05, 0x5E, 0x8B, - 0xC4, 0x48, 0xC5, 0xB4, 0x07, 0x8A, 0x94, 0x83, 0x90, 0x06, - 0x4A, 0xDD, 0x4A, 0x01, 0x8D, 0xA4, 0x50, 0x4F, 0xE1, 0x69, - 0xFC, 0x86, 0x06, 0x18, 0xE4, 0x50, 0xF8, 0xEC, 0x9A, 0x3D, - 0xAD, 0xD1, 0x1D, 0x1D, 0x4D, 0x0B, 0xE5, 0x0F, 0xC1, 0xB7, - 0x14, 0xF0, 0xB4, 0x61, 0x17, 0x05, 0x62, 0x72, 0x30, 0x0F, - 0x30, 0xA5, 0x59, 0x61, 0xF6, 0x7B, 0xB6, 0x37, 0x56, 0x98, - 0x83, 0x00, 0x71, 0xE0, 0xAC, 0xDD, 0xAA, 0x8A, 0x9A, 0xCB, - 0x48, 0xCB, 0xF5, 0x03, 0xBB, 0x44, 0x6C, 0x3B, 0xED, 0x9D, - 0x1B, 0x8D, 0xA0, 0x3E, 0xE0, 0x06, 0x5A, 0x86, 0x85, 0x4F, - 0xC0, 0x4A, 0x2C, 0xE7, 0xFF, 0x56, 0x2C, 0xB9, 0x48, 0xF6, - 0x47, 0x93, 0x8C, 0x17, 0x4A, 0x8D, 0x84, 0x5C, 0xBD, 0xD1, - 0x17, 0x94, 0x88, 0x2E, 0x2A, 0x70, 0xB4, 0x48, 0xBB, 0x47, - 0x00, 0x77, 0x90, 0x35, 0x6C, 0x4E, 0x18, 0x35, 0x4F, 0xF1, - 0x40, 0x50, 0xFF, 0xC7, 0x06, 0x94, 0x5A, 0xAF, 0xA6, 0x7D, - 0xDA, 0xA8, 0x8D, 0xDA, 0x0B, 0xC0, 0x01, 0x14, 0xC0, 0x7A, - 0x7A, 0xB0, 0x29, 0xBE, 0x83, 0x38, 0xC3, 0x48, 0x0E, 0x30, - 0xD0, 0x21, 0xE4, 0x30, 0x2F, 0xE3, 0xC0, 0x81, 0x08, 0xB6, - 0x07, 0x14, 0x40, 0x10, 0xEB, 0xE9, 0x61, 0xA6, 0x8B, 0x74, - 0xD0, 0x04, 0x65, 0xF6, 0x87, 0x4B, 0xA1, 0x24, 0x5D, 0x94, - 0x6B, 0x64, 0x7E, 0x67, 0x16, 0x7F, 0x90, 0x01, 0x7D, 0x92, - 0x0A, 0x4C, 0x02, 0xDD, 0xD2, 0x0D, 0xDD, 0x16, 0x90, 0x07, - 0xAE, 0x0C, 0x03, 0xCA, 0xD0, 0x0D, 0xCB, 0xD0, 0x1B, 0x2A, - 0xC0, 0x07, 0xE3, 0xD2, 0x0D, 0xFC, 0xA1, 0x10, 0x6B, 0x62, - 0x51, 0x97, 0x6C, 0x4F, 0x6B, 0x7C, 0x52, 0x90, 0xF4, 0x00, - 0xF6, 0x9B, 0x9F, 0x01, 0x00, 0x4A, 0xD5, 0xB5, 0xD4, 0x2C, - 0xE9, 0x62, 0xB8, 0x14, 0x66, 0xD4, 0xFB, 0x07, 0x5C, 0x20, - 0xDD, 0x50, 0x32, 0xDD, 0xFA, 0xCD, 0x02, 0x59, 0xF0, 0x07, - 0xAE, 0x8C, 0x63, 0xF6, 0x57, 0x5F, 0xC5, 0x94, 0x92, 0x74, - 0x28, 0x66, 0x54, 0x06, 0x49, 0x8B, 0xE4, 0x56, 0xED, 0x1D, - 0x4E, 0xBC, 0x49, 0x65, 0x2B, 0xA8, 0xB9, 0xEC, 0xA5, 0xC9, - 0x3C, 0x69, 0x4C, 0x6B, 0x29, 0x97, 0x3C, 0x25, 0x03, 0x33, - 0x30, 0x03, 0x32, 0xE0, 0x68, 0xFE, 0xF0, 0x5F, 0x70, 0xB0, - 0xDF, 0x20, 0x9E, 0x0A, 0x4D, 0xF0, 0x07, 0xA5, 0xD7, 0x72, - 0x22, 0x50, 0x0F, 0xF2, 0x45, 0x0F, 0x92, 0x36, 0x0F, 0x0B, - 0x04, 0x90, 0x00, 0xC9, 0xE1, 0xA2, 0xFD, 0x40, 0x96, 0x56, - 0xFF, 0x0F, 0x90, 0x86, 0x00, 0x7A, 0x80, 0x60, 0x01, 0xE0, - 0xD2, 0x59, 0x46, 0x01, 0xCE, 0x76, 0xA8, 0x44, 0x10, 0x06, - 0xE3, 0xF6, 0x03, 0x37, 0xFD, 0xE3, 0x61, 0x70, 0x01, 0xD0, - 0xB4, 0x07, 0xF1, 0x96, 0xE4, 0xF2, 0x26, 0x6F, 0xF5, 0xD6, - 0xE4, 0x4E, 0x9E, 0x02, 0x2C, 0x57, 0x7D, 0x84, 0xCD, 0x8D, - 0xCE, 0x36, 0xBF, 0x74, 0x80, 0x80, 0x12, 0x9C, 0xE5, 0xAB, - 0x9A, 0x65, 0xFE, 0xCC, 0x12, 0x9D, 0xF8, 0xB4, 0x01, 0xB0, - 0x3F, 0x2E, 0xE2, 0x69, 0x02, 0x90, 0xC9, 0x13, 0x17, 0xA5, - 0xF8, 0xB8, 0xBF, 0x1E, 0x97, 0xE6, 0x7A, 0x14, 0x41, 0x14, - 0x87, 0x71, 0x5A, 0x1E, 0xE7, 0xEB, 0x0C, 0x84, 0x88, 0x47, - 0x87, 0x36, 0x55, 0xC9, 0x08, 0x9B, 0x92, 0x6F, 0x45, 0x76, - 0x68, 0x40, 0x51, 0xB5, 0x06, 0x90, 0x8F, 0x26, 0x0F, 0x14, - 0x50, 0xA5, 0x9E, 0xA9, 0x4E, 0x36, 0x0E, 0x0F, 0x04, 0x47, - 0x50, 0x1D, 0x1E, 0x5F, 0x77, 0x50, 0x6A, 0x07, 0x56, 0x6A, - 0x67, 0xC8, 0x68, 0xF4, 0xE0, 0x60, 0x1E, 0xE6, 0xAC, 0x12, - 0x96, 0xC9, 0x12, 0xBE, 0x47, 0x15, 0x35, 0xB4, 0xFA, 0x06, - 0x5A, 0xB0, 0x6C, 0x51, 0xA0, 0x34, 0x55, 0x4B, 0xD1, 0x4B, - 0x76, 0x90, 0x55, 0x22, 0x70, 0x57, 0xE3, 0xF6, 0x48, 0xC6, - 0x3D, 0x06, 0x7D, 0xD0, 0x99, 0x79, 0x70, 0x04, 0x50, 0x25, - 0x6E, 0xAB, 0x3E, 0x53, 0x70, 0xF6, 0x62, 0x4C, 0x0D, 0x49, - 0x87, 0xC4, 0x4F, 0x7B, 0x75, 0x5C, 0x16, 0xBD, 0x56, 0x2A, - 0x99, 0x4D, 0x2A, 0x29, 0xDC, 0xCD, 0xF4, 0x5E, 0x85, 0x85, - 0x4E, 0x7F, 0x08, 0x5F, 0xF3, 0xD4, 0xE1, 0xF0, 0x74, 0x4F, - 0xED, 0x74, 0x6B, 0x61, 0xC6, 0xC8, 0xD7, 0x85, 0x5A, 0x2B, - 0x86, 0x51, 0xD4, 0x2B, 0x84, 0x68, 0x6A, 0x85, 0xA7, 0xD5, - 0xE9, 0xDA, 0x66, 0x64, 0xEC, 0x47, 0xFF, 0x00, 0x35, 0x25, - 0x6E, 0x63, 0xF0, 0xA0, 0x49, 0x4D, 0xA1, 0x8B, 0xB5, 0x9C, - 0x59, 0x26, 0x07, 0xCE, 0x7B, 0x5C, 0xB4, 0x7C, 0x4B, 0x55, - 0x96, 0x4B, 0x37, 0x29, 0x78, 0x8E, 0x6B, 0x68, 0x14, 0x90, - 0xE1, 0xF8, 0x55, 0x99, 0xFE, 0x54, 0x61, 0xCE, 0x0A, 0x62, - 0x9B, 0x26, 0xC3, 0xF7, 0x74, 0x4C, 0x2B, 0x68, 0x4F, 0xF4, - 0xF4, 0x14, 0x5A, 0x74, 0xE9, 0xF0, 0x5C, 0x0F, 0x02, 0x8F, - 0x56, 0xEA, 0xB0, 0xEF, 0x79, 0x8A, 0x88, 0x39, 0x60, 0xF0, - 0x3D, 0x19, 0x53, 0xF1, 0xF0, 0xB4, 0x01, 0x05, 0x70, 0xF4, - 0x34, 0x61, 0x56, 0x04, 0x4D, 0x83, 0xB4, 0x01, 0x54, 0xD6, - 0x9F, 0xC3, 0x34, 0x55, 0xC1, 0x54, 0x16, 0x6E, 0x05, 0x55, - 0x12, 0x7D, 0x51, 0x78, 0x80, 0x57, 0xE8, 0x45, 0x93, 0x9A, - 0xEA, 0x6C, 0xC9, 0x06, 0x8D, 0xA1, 0x94, 0x6C, 0x4B, 0x61, - 0x7F, 0xC0, 0x54, 0x5C, 0x74, 0x10, 0x80, 0x88, 0x08, 0xA7, - 0xBA, 0xA5, 0x77, 0x02, 0x1B, 0x00, 0x94, 0x14, 0x55, 0xBF, - 0xF5, 0x48, 0x8F, 0x4D, 0x6C, 0x47, 0x00, 0x05, 0x64, 0x5E, - 0x59, 0x1A, 0x26, 0x5F, 0x18, 0xC5, 0x98, 0x52, 0x21, 0x15, - 0xFE, 0xDC, 0xE7, 0x4F, 0xD1, 0x48, 0x08, 0x65, 0xEC, 0x9C, - 0x8C, 0x00, 0x55, 0x3A, 0x03, 0x9F, 0xDD, 0x87, 0x14, 0x35, - 0x4F, 0x72, 0x9B, 0x65, 0xA3, 0x95, 0xD7, 0x4A, 0x6C, 0x68, - 0x11, 0x4C, 0x6C, 0x5B, 0x65, 0x50, 0x61, 0xE6, 0x6C, 0x6F, - 0x26, 0xD7, 0xCB, 0x65, 0xEB, 0xCF, 0xA5, 0x62, 0x25, 0xEF, - 0x67, 0x57, 0x29, 0x4C, 0xA8, 0x74, 0x95, 0xC5, 0xB4, 0x01, - 0x44, 0x30, 0x07, 0x37, 0xC8, 0x55, 0xDE, 0x74, 0x52, 0x5B, - 0x8E, 0x68, 0x69, 0xDC, 0x14, 0x18, 0xD5, 0xD0, 0x71, 0x6E, - 0xA1, 0x21, 0x75, 0x39, 0xBE, 0x75, 0xA7, 0x0E, 0x95, 0x91, - 0x17, 0x90, 0xFF, 0x07, 0x14, 0x19, 0x76, 0x72, 0x2E, 0xEC, - 0x14, 0x29, 0x02, 0x7F, 0x05, 0xC1, 0x22, 0x70, 0x04, 0x17, - 0xB0, 0xBF, 0x70, 0xF7, 0x74, 0x70, 0x07, 0x77, 0x42, 0x74, - 0x96, 0x15, 0x95, 0x92, 0x00, 0xB5, 0x82, 0x9A, 0x65, 0x5E, - 0x01, 0x10, 0x44, 0xE6, 0xD6, 0x01, 0x3E, 0x30, 0x03, 0x3E, - 0x50, 0x02, 0x1D, 0x90, 0xFA, 0xAA, 0xBF, 0xFA, 0xAC, 0xDF, - 0xFA, 0xAA, 0x5F, 0x02, 0xB0, 0x1F, 0xFB, 0xB2, 0x7F, 0x3C, - 0x42, 0x30, 0xC1, 0xBE, 0x56, 0x67, 0x55, 0xE6, 0x92, 0xAF, - 0x74, 0xD3, 0x32, 0x60, 0x9C, 0xFC, 0x67, 0x56, 0xA0, 0x05, - 0x50, 0x96, 0xA4, 0x00, 0x5A, 0x25, 0xD1, 0x12, 0x2D, 0x68, - 0xC7, 0x76, 0x9C, 0x66, 0xF5, 0x03, 0x7A, 0x44, 0x02, 0x1C, - 0x10, 0x01, 0x1C, 0xF0, 0x05, 0x47, 0xF1, 0x05, 0x00, 0x70, - 0x00, 0x00, 0xF0, 0x05, 0x5F, 0x70, 0x00, 0x07, 0x90, 0xFD, - 0xDA, 0x7F, 0xFD, 0x00, 0x00, 0x00, 0x05, 0x10, 0x03, 0xD6, - 0x7F, 0x00, 0x10, 0xB0, 0x12, 0xD4, 0x04, 0x0F, 0xDC, 0x64, - 0x58, 0x56, 0x50, 0x02, 0xB6, 0xFF, 0x07, 0x39, 0x40, 0x82, - 0x64, 0xBD, 0x70, 0x32, 0x30, 0x05, 0x4B, 0x80, 0x05, 0x81, - 0x88, 0x38, 0x0D, 0x30, 0x20, 0xB6, 0x76, 0x07, 0x77, 0x04, - 0x08, 0x3D, 0x7F, 0x83, 0x39, 0x02, 0x08, 0x72, 0x77, 0x68, - 0x08, 0x7B, 0x77, 0x63, 0x01, 0x77, 0x14, 0x3D, 0x22, 0x82, - 0x7F, 0x21, 0x62, 0x67, 0x62, 0x54, 0x18, 0x05, 0x00, 0x00, - 0x18, 0x31, 0x18, 0x9E, 0x9D, 0xA0, 0x05, 0xA1, 0x00, 0xA0, - 0x18, 0xA9, 0x07, 0x55, 0x08, 0x08, 0x89, 0x39, 0x29, 0x5B, - 0x5B, 0x23, 0x29, 0x8B, 0x76, 0x25, 0x83, 0x01, 0x39, 0x83, - 0xBC, 0x01, 0x78, 0x0F, 0x3F, 0x76, 0x02, 0x63, 0x0A, 0x04, - 0x3F, 0x74, 0x04, 0x4B, 0x2A, 0x2A, 0x19, 0x54, 0xFF, 0x2A, - 0x40, 0x19, 0x1A, 0x0D, 0xBC, 0xD4, 0x7F, 0x72, 0x6E, 0x04, - 0x6E, 0x7B, 0x1F, 0x78, 0x74, 0x0A, 0x1F, 0x0F, 0x0F, 0x04, - 0xD5, 0x10, 0x00, 0xA5, 0x9C, 0x9B, 0x07, 0xE6, 0x9E, 0xA9, - 0x31, 0xA4, 0x07, 0xEE, 0x9F, 0xAA, 0x21, 0x10, 0x68, 0x68, - 0x14, 0x14, 0x16, 0x7E, 0x34, 0x23, 0x7E, 0x23, 0x7B, 0x72, - 0x04, 0xE0, 0xFA, 0x13, 0x00, 0x4D, 0x0F, 0x21, 0x08, 0x85, - 0x34, 0x38, 0xC1, 0x8C, 0x4A, 0xB3, 0x0C, 0xCA, 0xF8, 0x2C, - 0xE3, 0x03, 0x24, 0x08, 0x0F, 0x66, 0x19, 0x4E, 0x5C, 0x64, - 0xA0, 0x47, 0x48, 0xC7, 0x8E, 0x08, 0x7B, 0x1C, 0x14, 0x42, - 0xC1, 0xA3, 0x10, 0x4A, 0xD5, 0x48, 0x00, 0xF8, 0xB2, 0xF2, - 0xCB, 0x81, 0x97, 0x2E, 0x5D, 0xAA, 0x3B, 0xF0, 0x25, 0xE6, - 0xA9, 0x18, 0x33, 0xBF, 0x54, 0x81, 0xA0, 0x27, 0xC7, 0x84, - 0x14, 0x7E, 0x2C, 0xA4, 0x90, 0x62, 0x81, 0x46, 0x0A, 0x34, - 0x58, 0x06, 0x06, 0x08, 0x92, 0x30, 0x87, 0x10, 0x18, 0x2A, - 0x18, 0x50, 0x51, 0x16, 0x15, 0xC8, 0x92, 0x25, 0x14, 0x83, - 0x34, 0x68, 0x20, 0xD5, 0x6A, 0x54, 0x06, 0x4B, 0x4A, 0xE8, - 0x19, 0xDB, 0x11, 0x88, 0x19, 0x38, 0x3F, 0x80, 0xAC, 0x59, - 0xB3, 0x84, 0x8B, 0x99, 0x65, 0x0F, 0xEC, 0xEC, 0x1A, 0x44, - 0xA2, 0x40, 0x81, 0x18, 0x4D, 0xEC, 0xA6, 0x0A, 0xB5, 0x37, - 0x95, 0xDE, 0x50, 0x2B, 0x56, 0x1C, 0x28, 0x85, 0x01, 0x42, - 0x95, 0x1C, 0x22, 0xFE, 0x58, 0xD8, 0x32, 0x54, 0x8A, 0x94, - 0x21, 0x52, 0x72, 0x04, 0x50, 0x4A, 0xA1, 0x1A, 0x10, 0x67, - 0x2A, 0x1C, 0x66, 0x60, 0x26, 0x71, 0x59, 0x86, 0xCF, 0xA0, - 0x97, 0x64, 0x58, 0x53, 0x8D, 0x17, 0x85, 0x19, 0x67, 0xEC, - 0x20, 0xB0, 0xB3, 0x67, 0xCF, 0x98, 0x35, 0x36, 0x78, 0xF0, - 0x40, 0x31, 0x8D, 0x2E, 0xFF, 0x3C, 0x00, 0xEA, 0x4E, 0x75, - 0xCA, 0x9D, 0x3B, 0x95, 0xA8, 0x50, 0x2F, 0xD5, 0xE9, 0x14, - 0x31, 0x89, 0x28, 0x1E, 0x0B, 0x16, 0xA4, 0x6C, 0x51, 0x40, - 0x61, 0x72, 0xAE, 0xB9, 0x7F, 0x26, 0x4C, 0xB8, 0xBC, 0x84, - 0xCA, 0xE5, 0x35, 0x7C, 0xA8, 0xF0, 0x81, 0xC1, 0x27, 0x03, - 0x03, 0x3E, 0x14, 0x15, 0xB4, 0x5D, 0xD3, 0x40, 0x8E, 0x9C, - 0x56, 0x01, 0x44, 0xF6, 0x30, 0xF1, 0x66, 0x03, 0x0C, 0x37, - 0xC2, 0x1E, 0xEC, 0x79, 0xA0, 0x00, 0x05, 0x0A, 0x2D, 0x20, - 0xE2, 0xD0, 0x05, 0x85, 0x33, 0x06, 0x3B, 0x50, 0xA7, 0x1C, - 0x60, 0x0A, 0x06, 0xB9, 0xE1, 0xD6, 0xDF, 0x0A, 0x31, 0x84, - 0xD0, 0x43, 0x1C, 0x68, 0xA4, 0x40, 0x07, 0x1D, 0x8E, 0x21, - 0x27, 0x00, 0x52, 0x4A, 0xE9, 0x61, 0x59, 0x06, 0xB2, 0xC9, - 0xA6, 0xC1, 0x09, 0x0C, 0x68, 0x20, 0x9B, 0x46, 0x54, 0x70, - 0xB1, 0x06, 0x17, 0x0D, 0xC0, 0x81, 0xC2, 0x0F, 0x6B, 0x98, - 0x81, 0x82, 0x8A, 0x4C, 0x94, 0x50, 0x42, 0x03, 0x33, 0xDC, - 0x11, 0x00, 0x02, 0x68, 0x04, 0x70, 0x1E, 0x14, 0x8B, 0xD8, - 0x00, 0x56, 0x6D, 0x24, 0xF8, 0x77, 0xCA, 0x27, 0x2F, 0x35, - 0x01, 0x20, 0x06, 0x75, 0xA8, 0xE2, 0x0E, 0x3B, 0xB8, 0x85, - 0x52, 0x45, 0x15, 0x71, 0xC4, 0x31, 0x41, 0x37, 0x6E, 0x48, - 0xF1, 0x01, 0x72, 0x4F, 0xDC, 0xB1, 0x87, 0x52, 0x4C, 0x9D, - 0x34, 0xC1, 0x1F, 0x68, 0x28, 0xF0, 0x83, 0x19, 0x6A, 0x71, - 0xC1, 0x06, 0x15, 0x66, 0xB8, 0xC5, 0x85, 0x5B, 0x66, 0x90, - 0x97, 0x26, 0x1F, 0x6B, 0xFC, 0x40, 0xC5, 0x1A, 0xDA, 0xF1, - 0x21, 0xC4, 0x04, 0x72, 0x7C, 0x50, 0x8C, 0x02, 0x63, 0x10, - 0xA0, 0x84, 0x12, 0x15, 0x28, 0x01, 0xCE, 0x0F, 0x51, 0x2C, - 0x61, 0xA1, 0x4A, 0x02, 0xBE, 0xE4, 0x49, 0x1D, 0x9D, 0xB0, - 0xFF, 0xF3, 0x12, 0x4E, 0x89, 0xFA, 0xF8, 0x45, 0x0C, 0x75, - 0x18, 0xD6, 0xE4, 0x04, 0x22, 0xD8, 0xF1, 0x41, 0x0A, 0x29, - 0x24, 0x47, 0x01, 0x02, 0x49, 0xE5, 0xC2, 0x94, 0x1E, 0x2E, - 0x2A, 0x44, 0x00, 0x01, 0x76, 0xDC, 0x81, 0x40, 0x00, 0x7B, - 0xD8, 0x00, 0xC4, 0x0F, 0x70, 0xA8, 0x60, 0x03, 0x1C, 0x0A, - 0xAC, 0x01, 0xC3, 0x1A, 0x70, 0xD0, 0xCA, 0x05, 0x15, 0xD9, - 0x08, 0xF0, 0xC4, 0x20, 0x77, 0x0C, 0x33, 0x83, 0x12, 0x67, - 0xCC, 0x10, 0xC1, 0xB0, 0x48, 0x54, 0xA0, 0x80, 0x02, 0x66, - 0xF0, 0x00, 0xC3, 0x1F, 0x24, 0x60, 0x10, 0x58, 0x5E, 0xA0, - 0x08, 0xB8, 0x82, 0x27, 0x1A, 0xF8, 0xB7, 0x82, 0x06, 0xA7, - 0x10, 0x96, 0x97, 0x27, 0x92, 0x6E, 0x29, 0xC2, 0x18, 0x28, - 0x64, 0xCA, 0x98, 0x08, 0x72, 0x5C, 0x99, 0x0B, 0x02, 0x42, - 0xB8, 0xE8, 0xA2, 0x1D, 0x65, 0x7E, 0xF0, 0xC1, 0x83, 0x02, - 0x58, 0x4A, 0x07, 0x0A, 0x78, 0xFC, 0xC0, 0x83, 0x0E, 0x3A, - 0x5C, 0x91, 0xAF, 0xBE, 0x42, 0x50, 0x33, 0x41, 0x1E, 0x47, - 0xF4, 0x71, 0x46, 0x05, 0xA8, 0x11, 0x7C, 0x46, 0x04, 0x15, - 0x0C, 0x7B, 0xC6, 0x13, 0x0F, 0x64, 0x00, 0x04, 0xB3, 0x89, - 0xB6, 0x84, 0x1B, 0x4B, 0x35, 0xB9, 0x34, 0x31, 0x6E, 0x13, - 0xCB, 0x14, 0x69, 0x15, 0x5B, 0x52, 0x60, 0x0C, 0x1E, 0x53, - 0x5A, 0x40, 0x41, 0xB9, 0xB7, 0xE4, 0x02, 0x83, 0x8B, 0x4C, - 0xA4, 0x0C, 0x02, 0x56, 0xDE, 0x2D, 0xD1, 0xC2, 0x56, 0x0D, - 0x04, 0x11, 0x04, 0x13, 0x30, 0x04, 0xA1, 0x85, 0x0E, 0x5A, - 0xE4, 0x8C, 0xDF, 0x9C, 0x00, 0x5F, 0x60, 0x82, 0x09, 0x17, - 0xCC, 0xD0, 0x45, 0x17, 0x11, 0x9C, 0xA1, 0xC4, 0xD0, 0x43, - 0x47, 0x80, 0x44, 0x04, 0x6E, 0xE0, 0x01, 0x26, 0xC4, 0x38, - 0xB9, 0xB4, 0x09, 0x60, 0x4D, 0x6C, 0xFF, 0x62, 0x57, 0x3C, - 0xD3, 0xDE, 0xB5, 0x49, 0x13, 0x1B, 0x23, 0x80, 0x29, 0x1E, - 0x29, 0xB8, 0x91, 0xA9, 0x05, 0x3F, 0x3C, 0x21, 0x00, 0x01, - 0x4A, 0x35, 0x50, 0x02, 0x13, 0x41, 0x44, 0x11, 0xC4, 0xBE, - 0x57, 0xC4, 0x0D, 0xB7, 0xDC, 0x5A, 0x0C, 0x22, 0x9D, 0xDD, - 0x47, 0xF8, 0xFC, 0xF3, 0xDE, 0x26, 0xA8, 0x91, 0x70, 0x05, - 0x45, 0x54, 0x20, 0x78, 0x05, 0xC5, 0x02, 0x0E, 0x45, 0x00, - 0xDA, 0x31, 0xBB, 0x97, 0x7F, 0x4A, 0x56, 0x11, 0x81, 0x0F, - 0x15, 0x84, 0xB0, 0xA4, 0x61, 0x4B, 0x56, 0x5E, 0xB9, 0x61, - 0x75, 0x3C, 0x46, 0xEF, 0x10, 0xC8, 0x6D, 0x61, 0x01, 0x64, - 0xC8, 0xA4, 0xDD, 0x76, 0x14, 0x6E, 0x33, 0x41, 0x02, 0xE9, - 0x3A, 0x6B, 0xC1, 0x06, 0x03, 0x6C, 0xE8, 0xDC, 0x80, 0x85, - 0x79, 0x98, 0x10, 0xC6, 0x06, 0xB4, 0xD7, 0x5E, 0xBB, 0x09, - 0xA8, 0x3D, 0x00, 0x2C, 0xD2, 0x6A, 0x44, 0xD0, 0x85, 0x12, - 0x1B, 0x1C, 0x21, 0x02, 0x10, 0x7C, 0x30, 0x3B, 0xD3, 0x6E, - 0x5F, 0x18, 0x36, 0xB0, 0x0D, 0x3B, 0x41, 0xE0, 0xFC, 0xF3, - 0xD0, 0x3B, 0x5F, 0x45, 0x1D, 0xC9, 0x11, 0xB5, 0x98, 0xE7, - 0x69, 0xC8, 0x32, 0x44, 0x0A, 0x4A, 0x01, 0x11, 0x05, 0x08, - 0x0C, 0x58, 0x31, 0xA3, 0x15, 0xE4, 0x5B, 0x51, 0xF5, 0x19, - 0x3E, 0x44, 0x20, 0x46, 0x1D, 0x75, 0x80, 0x50, 0x47, 0x14, - 0x3D, 0xE8, 0x21, 0xC3, 0xFC, 0xF4, 0xD3, 0x9F, 0xC5, 0x1C, - 0x7F, 0x48, 0x76, 0x36, 0x14, 0x80, 0x13, 0xDE, 0xE7, 0xB0, - 0x3F, 0xB8, 0x03, 0xF1, 0x26, 0x20, 0xB9, 0x2A, 0x84, 0xE0, - 0x80, 0x07, 0xB4, 0x9C, 0x02, 0x0D, 0xB8, 0xC0, 0xCB, 0x51, - 0xA1, 0x13, 0x2D, 0x80, 0x03, 0x06, 0x52, 0x00, 0x8A, 0x26, - 0xC0, 0xA1, 0x6A, 0x1D, 0xC8, 0x45, 0x0B, 0x82, 0xB0, 0x84, - 0xC6, 0xA4, 0xFF, 0x81, 0x06, 0xFC, 0xF0, 0x83, 0x3F, 0xBA, - 0xC0, 0x01, 0x1F, 0xF8, 0xA0, 0x0E, 0x31, 0xA8, 0x09, 0x4D, - 0x58, 0x02, 0x13, 0x9A, 0xD0, 0xE4, 0x79, 0x7F, 0x18, 0x06, - 0x01, 0xF0, 0x44, 0x80, 0x33, 0x20, 0xA1, 0x58, 0x47, 0xEB, - 0x42, 0x0A, 0xE4, 0x30, 0x40, 0x12, 0x44, 0xAA, 0x13, 0x8F, - 0x82, 0x87, 0x70, 0x10, 0x25, 0x9C, 0x00, 0xC1, 0x43, 0x26, - 0x2B, 0xAC, 0x18, 0xC5, 0x74, 0x82, 0xC0, 0x04, 0x66, 0x90, - 0x20, 0x20, 0x88, 0x02, 0x16, 0x1C, 0x93, 0x86, 0x1B, 0x38, - 0xC1, 0x09, 0x37, 0xA0, 0x81, 0x3F, 0xE0, 0x50, 0x01, 0x1B, - 0x44, 0x00, 0x02, 0xF0, 0xB8, 0x4B, 0x01, 0xD4, 0x71, 0xB5, - 0x18, 0x94, 0x42, 0x27, 0xCE, 0xE3, 0xD2, 0x18, 0xC6, 0x20, - 0x87, 0x1F, 0xAC, 0xD1, 0x77, 0xBC, 0x9B, 0x42, 0x0E, 0xC0, - 0xC3, 0xAC, 0x2F, 0xA0, 0xB0, 0x06, 0x05, 0xA8, 0xC1, 0x27, - 0xF2, 0x58, 0x83, 0x1F, 0xE1, 0xB1, 0x06, 0x80, 0x34, 0x23, - 0x20, 0xED, 0xD2, 0xC7, 0x18, 0x00, 0xF2, 0x90, 0x35, 0x58, - 0x45, 0xF4, 0x9E, 0x18, 0x00, 0x3E, 0x30, 0xA1, 0x41, 0x55, - 0x74, 0xC2, 0x0B, 0xAE, 0x78, 0x83, 0x7E, 0x74, 0x82, 0x40, - 0xA5, 0x30, 0x50, 0x18, 0xF9, 0x43, 0x0A, 0x34, 0x42, 0x20, - 0x3A, 0xAD, 0x68, 0x0E, 0x05, 0xD0, 0x60, 0x83, 0x84, 0x11, - 0x6D, 0x06, 0x32, 0x40, 0x00, 0x78, 0x08, 0x68, 0x18, 0x77, - 0x70, 0xC2, 0x1D, 0x31, 0x30, 0x40, 0x18, 0xF3, 0xF8, 0x09, - 0x9C, 0x68, 0x80, 0x90, 0x05, 0xA8, 0x83, 0xE4, 0x20, 0x50, - 0xC0, 0xCB, 0x45, 0x0F, 0x02, 0x8C, 0x6C, 0x81, 0x10, 0x1A, - 0xB4, 0x85, 0x1B, 0xBC, 0xE0, 0x98, 0x2F, 0xC8, 0xA2, 0x1F, - 0x68, 0x92, 0x42, 0x20, 0x4E, 0x4C, 0x1D, 0xFE, 0x81, 0xE6, - 0x4A, 0x9C, 0x17, 0x05, 0x13, 0x14, 0x01, 0x0F, 0xFF, 0x63, - 0xC0, 0x03, 0x0A, 0x08, 0x20, 0x00, 0x3C, 0x0C, 0x2B, 0x87, - 0x28, 0xF8, 0xC0, 0x2A, 0x49, 0xE0, 0xBC, 0x99, 0xE4, 0x86, - 0x85, 0x2C, 0xD1, 0x8D, 0x39, 0x58, 0xE2, 0x1F, 0xFF, 0x44, - 0xEA, 0x97, 0xF0, 0x74, 0x1E, 0x23, 0xF9, 0x10, 0x07, 0x3D, - 0x28, 0xE7, 0x06, 0x12, 0x70, 0xC0, 0x0B, 0x24, 0x50, 0xC9, - 0x65, 0xC6, 0x60, 0x05, 0x84, 0xE1, 0x8B, 0x80, 0x7E, 0x64, - 0x97, 0xC0, 0xE4, 0x72, 0x27, 0x1B, 0x28, 0x02, 0x12, 0x18, - 0x46, 0x80, 0x3D, 0x8C, 0xEA, 0x01, 0x83, 0x23, 0x98, 0x1D, - 0xB4, 0x33, 0x81, 0x0E, 0x90, 0x80, 0x04, 0x21, 0xE8, 0x40, - 0x46, 0x37, 0xAA, 0x51, 0x8E, 0x6E, 0x94, 0xA3, 0x1D, 0xD0, - 0xE8, 0x45, 0x47, 0x4A, 0xD2, 0x26, 0x5E, 0xB4, 0x0A, 0xFD, - 0x22, 0xC8, 0xC3, 0x72, 0x20, 0x85, 0x34, 0xA4, 0xC1, 0x05, - 0x12, 0x70, 0x81, 0x0B, 0x3E, 0x38, 0x02, 0xDC, 0xDC, 0x06, - 0x63, 0x8B, 0xDA, 0x8D, 0x8F, 0x70, 0x03, 0x01, 0xF5, 0x11, - 0xA1, 0x08, 0x11, 0x98, 0x81, 0x00, 0x02, 0x70, 0x36, 0x2F, - 0x45, 0x14, 0x4F, 0x5C, 0x00, 0xC2, 0x96, 0x4A, 0xC3, 0xD4, - 0xA6, 0x3A, 0xB5, 0x1A, 0x77, 0x2B, 0x4D, 0x00, 0xA6, 0x41, - 0x81, 0x14, 0xB8, 0xC0, 0x8A, 0x57, 0xE4, 0x67, 0x16, 0xD9, - 0xB1, 0x02, 0xDF, 0x74, 0xD5, 0x2E, 0xE7, 0xF0, 0x4F, 0xD5, - 0x00, 0x00, 0x01, 0x31, 0x88, 0xE1, 0xA7, 0x5D, 0x40, 0xC2, - 0x18, 0xEC, 0x60, 0x07, 0x36, 0xCE, 0x01, 0x09, 0x7C, 0x52, - 0xC2, 0x5A, 0x57, 0x24, 0x8E, 0xD5, 0x70, 0x33, 0x5E, 0x08, - 0xF8, 0xC1, 0xA8, 0x9E, 0x30, 0x2A, 0x3B, 0x78, 0xA9, 0xAD, - 0x7B, 0x78, 0x42, 0x00, 0x08, 0x80, 0x0C, 0x04, 0x9C, 0x8D, - 0xAD, 0xAC, 0x51, 0x80, 0x6B, 0x14, 0x20, 0x8E, 0x07, 0x20, - 0xA0, 0x1A, 0x53, 0xFD, 0xFF, 0x03, 0x02, 0x2C, 0x80, 0x4F, - 0x27, 0xB8, 0x40, 0x92, 0x37, 0x48, 0xC3, 0x08, 0x56, 0x61, - 0xC0, 0x04, 0x26, 0x70, 0x49, 0x92, 0xEB, 0xE5, 0x4E, 0xBE, - 0x97, 0xD0, 0x1B, 0x2A, 0x56, 0x18, 0x02, 0x90, 0x83, 0x12, - 0x22, 0xB0, 0xA7, 0x33, 0x8C, 0x81, 0x0B, 0x70, 0x00, 0xAC, - 0x00, 0x66, 0x6B, 0x87, 0xB8, 0x28, 0x60, 0xB6, 0x08, 0x68, - 0x68, 0x36, 0x74, 0x6B, 0x07, 0xF3, 0x38, 0x54, 0x35, 0x6C, - 0x5D, 0x04, 0x01, 0x0C, 0x2B, 0x80, 0x3D, 0xB4, 0xA2, 0x46, - 0xD0, 0xC9, 0xC5, 0x34, 0x10, 0xE0, 0x0F, 0x99, 0xFA, 0xE0, - 0xB2, 0xFD, 0x3C, 0x00, 0x3D, 0x74, 0xC2, 0x3E, 0xF6, 0xED, - 0x84, 0x7D, 0x10, 0x78, 0xE7, 0xF3, 0xAA, 0x10, 0x85, 0x0D, - 0x54, 0x60, 0x68, 0xE1, 0xF8, 0x01, 0x7D, 0x08, 0xF0, 0xDD, - 0x1D, 0xE8, 0x90, 0x00, 0x5C, 0x48, 0x01, 0x16, 0xC6, 0x80, - 0x0C, 0x70, 0x10, 0xA0, 0x1B, 0xEE, 0x0D, 0x06, 0x01, 0x30, - 0xC4, 0x83, 0x0C, 0xF0, 0xE1, 0x04, 0x19, 0x91, 0x08, 0x15, - 0xEA, 0x0B, 0x9A, 0xCF, 0xEC, 0x01, 0x0F, 0x0A, 0xA0, 0xC3, - 0x1D, 0x9A, 0x1A, 0x59, 0x04, 0x78, 0xEE, 0xB2, 0x12, 0xB0, - 0x6C, 0x16, 0x6B, 0x5A, 0x87, 0x03, 0x24, 0x12, 0x03, 0x1A, - 0xD0, 0xC0, 0x20, 0x31, 0x60, 0x80, 0x1A, 0xC8, 0xB2, 0x79, - 0xD4, 0x4C, 0x68, 0xE0, 0xA0, 0x20, 0x07, 0x11, 0xEC, 0x21, - 0x00, 0x01, 0x98, 0x81, 0xE0, 0x80, 0x65, 0x87, 0xCC, 0x9C, - 0xEA, 0x0E, 0xE5, 0x6A, 0x45, 0x2B, 0x86, 0x4A, 0x80, 0x1C, - 0xC8, 0x61, 0x0C, 0x08, 0x00, 0x02, 0x0C, 0xEE, 0x90, 0x03, - 0x04, 0x04, 0xA1, 0x15, 0x77, 0xB8, 0x43, 0x10, 0xEC, 0xF0, - 0x08, 0x99, 0xC1, 0x60, 0x2B, 0x30, 0x08, 0xC3, 0x05, 0xA6, - 0xA0, 0x1F, 0xC8, 0x4E, 0xA3, 0x49, 0x7F, 0xE8, 0x02, 0x3E, - 0xFF, 0x67, 0x8A, 0x4F, 0x02, 0x50, 0x6C, 0x85, 0xA3, 0x58, - 0x67, 0x76, 0xB1, 0x0B, 0xBD, 0xEE, 0x12, 0xEE, 0x77, 0x63, - 0xB8, 0x43, 0xD3, 0x7E, 0xF0, 0xDD, 0xA1, 0x71, 0xC3, 0x2D, - 0x74, 0xC8, 0x93, 0xBB, 0x86, 0x01, 0x0C, 0x37, 0x88, 0x57, - 0x0E, 0x4F, 0x78, 0xD0, 0x8B, 0x15, 0x50, 0x5B, 0x3B, 0xFD, - 0x00, 0x4F, 0x7E, 0xA5, 0x03, 0x16, 0x4E, 0x40, 0xE7, 0xCF, - 0xA8, 0xA0, 0x08, 0x0E, 0x78, 0xC3, 0x14, 0xA4, 0x3A, 0x8D, - 0x1E, 0x6C, 0x69, 0x0F, 0x2E, 0xD8, 0xC1, 0x0E, 0x24, 0x20, - 0x81, 0x2E, 0xFC, 0x01, 0x02, 0x88, 0xBC, 0xDA, 0x21, 0xBF, - 0xF0, 0x59, 0x04, 0x8E, 0xB6, 0xB4, 0x11, 0x08, 0x80, 0x1B, - 0xEF, 0x34, 0x34, 0x25, 0x20, 0x81, 0x0E, 0x3F, 0xB0, 0xCF, - 0x0C, 0x0D, 0xC1, 0x4D, 0xD6, 0xC4, 0x8B, 0x9B, 0x4F, 0x60, - 0xEB, 0x13, 0x8A, 0x91, 0x03, 0x52, 0xC9, 0x81, 0x00, 0x63, - 0x70, 0x28, 0x6E, 0xC7, 0xF0, 0x03, 0xDC, 0xDA, 0x21, 0xD4, - 0x79, 0x1A, 0x43, 0x62, 0xA8, 0x11, 0x00, 0xA5, 0xF6, 0x80, - 0x72, 0x1B, 0xB3, 0x5C, 0x1D, 0xEC, 0xD2, 0x89, 0x1A, 0xF8, - 0xC7, 0xD7, 0x66, 0x34, 0xE3, 0x4D, 0xCE, 0x38, 0x3D, 0xEF, - 0x16, 0x0B, 0xC4, 0x14, 0x68, 0x0D, 0x14, 0x56, 0xBB, 0xA7, - 0x0F, 0x7C, 0xC9, 0x0C, 0xE5, 0x62, 0x63, 0x30, 0x82, 0x5B, - 0x5C, 0x57, 0xB4, 0x46, 0x46, 0x7B, 0xE8, 0x01, 0x1A, 0x18, - 0x61, 0x5C, 0xC3, 0x3E, 0x41, 0x0E, 0x68, 0x60, 0x0D, 0x1A, - 0x02, 0x42, 0x80, 0x3B, 0x04, 0xF7, 0x09, 0xB3, 0xEE, 0x05, - 0x1F, 0x44, 0xB2, 0x5D, 0x0C, 0x3B, 0x0F, 0x51, 0x77, 0x31, - 0x47, 0x0A, 0x61, 0x79, 0x24, 0x97, 0xC0, 0xB2, 0x0E, 0xDC, - 0xDD, 0x00, 0x12, 0x76, 0x70, 0x86, 0x3D, 0xB8, 0xE1, 0x01, - 0xDD, 0x48, 0xC1, 0x6A, 0xBB, 0xB0, 0xFF, 0x03, 0xF1, 0x9A, - 0x21, 0x05, 0xA4, 0xA2, 0x83, 0x00, 0x26, 0xFD, 0x83, 0xA5, - 0x3E, 0xF5, 0xE1, 0x10, 0xD7, 0xA0, 0x1E, 0x6E, 0x1D, 0xCF, - 0x2A, 0x38, 0xD8, 0xC2, 0x9C, 0xA0, 0x9C, 0x02, 0x35, 0xDE, - 0xBC, 0xEE, 0x26, 0x74, 0x0A, 0x22, 0x98, 0xD1, 0x13, 0xF4, - 0xA0, 0x06, 0x35, 0x14, 0x41, 0xC4, 0x7D, 0x90, 0x43, 0x75, - 0x7A, 0x62, 0x10, 0x91, 0x10, 0xC7, 0xE1, 0x11, 0x8F, 0x39, - 0x53, 0x1B, 0xC9, 0x04, 0x21, 0xC4, 0xD3, 0x79, 0x35, 0xA9, - 0x43, 0xC5, 0x6E, 0xFE, 0xCB, 0x3A, 0xD0, 0xEE, 0x08, 0xD5, - 0x88, 0x03, 0xED, 0x4A, 0xAE, 0x86, 0x39, 0xE8, 0x81, 0x22, - 0x30, 0x97, 0xB9, 0xD2, 0x9F, 0x1A, 0x80, 0x16, 0x44, 0xA1, - 0x04, 0x21, 0x8D, 0xBA, 0xD4, 0xA7, 0xDE, 0x01, 0xF6, 0x7D, - 0x21, 0x0A, 0x24, 0x60, 0x42, 0x16, 0xB6, 0x2E, 0x03, 0xAA, - 0x77, 0xC0, 0x49, 0xA5, 0x31, 0xC1, 0x06, 0x88, 0xAE, 0x86, - 0x24, 0x50, 0x60, 0x95, 0x4B, 0x4F, 0x3B, 0xD3, 0xF9, 0x40, - 0xBA, 0xA4, 0x53, 0x03, 0xEC, 0x7F, 0x10, 0x02, 0x08, 0xE6, - 0x1E, 0x85, 0x3F, 0xE4, 0xC1, 0x76, 0x4B, 0x45, 0x72, 0x53, - 0x8F, 0x30, 0x74, 0xA2, 0x9B, 0x1D, 0xED, 0x6A, 0x0F, 0x3C, - 0x64, 0xD9, 0x0E, 0x82, 0x65, 0x31, 0xB5, 0x07, 0x51, 0x58, - 0xAA, 0xDC, 0xE7, 0xBE, 0xAC, 0xBB, 0xD7, 0x6E, 0xA9, 0xB1, - 0x73, 0xBB, 0xDD, 0x6B, 0x47, 0xF6, 0xBF, 0xF3, 0x41, 0xF2, - 0x4C, 0x9D, 0xC0, 0x41, 0x0E, 0x12, 0x77, 0x0B, 0x31, 0xF5, - 0x29, 0x22, 0xC8, 0x43, 0x1E, 0xFE, 0x30, 0x05, 0x0F, 0xCC, - 0x9C, 0xF0, 0x85, 0x2F, 0x32, 0x2F, 0xE4, 0x5E, 0xF7, 0x41, - 0x2C, 0x3E, 0x8A, 0x93, 0x7F, 0xFC, 0x20, 0xEE, 0x6E, 0x82, - 0xD1, 0x53, 0x83, 0xEF, 0x43, 0x1F, 0x7B, 0xC9, 0x2D, 0x8F, - 0x79, 0xA8, 0xFF, 0x2E, 0x41, 0x0B, 0x27, 0x78, 0x03, 0x07, - 0x98, 0x50, 0x00, 0x69, 0x30, 0x61, 0x2B, 0xD5, 0x79, 0x51, - 0x54, 0xC4, 0xE0, 0x03, 0x31, 0xE4, 0xC1, 0x84, 0x62, 0xB8, - 0xC0, 0xE0, 0xA3, 0xD0, 0x80, 0xB9, 0x17, 0xBE, 0x45, 0xC7, - 0xBF, 0x0A, 0x08, 0x44, 0x30, 0x81, 0x7A, 0xB6, 0x00, 0x04, - 0x2F, 0xB3, 0x7B, 0xC9, 0x69, 0x07, 0xF9, 0xDB, 0x4D, 0xE1, - 0xFC, 0x62, 0xB7, 0x5D, 0xE5, 0xCF, 0x7E, 0xF9, 0x88, 0xC7, - 0x21, 0x03, 0x35, 0xD8, 0x41, 0x19, 0x8C, 0x10, 0x84, 0x13, - 0x18, 0x40, 0x03, 0xD7, 0x8A, 0xB0, 0xFE, 0x35, 0x00, 0x83, - 0x37, 0x04, 0xCE, 0x07, 0x1C, 0x50, 0x01, 0x3E, 0x30, 0x03, - 0xD3, 0x67, 0x7D, 0xE0, 0xA3, 0x02, 0xB0, 0xD5, 0x04, 0xCB, - 0x60, 0x05, 0x66, 0xC3, 0x57, 0x51, 0xA1, 0x02, 0xB0, 0xE2, - 0x37, 0x15, 0x40, 0x7E, 0xB3, 0x67, 0x3B, 0x16, 0xA8, 0x7E, - 0x7E, 0xC7, 0x7E, 0xBD, 0xE7, 0x2F, 0x06, 0x30, 0x00, 0x3B, - 0xC0, 0x01, 0x6D, 0xC0, 0x04, 0x7F, 0xF0, 0x32, 0xC7, 0x87, - 0x7D, 0x41, 0x10, 0x2A, 0x67, 0x90, 0x05, 0x7A, 0x70, 0x06, - 0xEB, 0x56, 0x02, 0x29, 0xA5, 0x6E, 0xD4, 0x67, 0x80, 0x32, - 0x18, 0x45, 0x8A, 0x67, 0x80, 0x40, 0x60, 0x81, 0xE5, 0x77, - 0x81, 0x17, 0xB8, 0x7E, 0x80, 0x07, 0x71, 0x03, 0x40, 0x06, - 0x64, 0xD0, 0x06, 0x6D, 0x50, 0x02, 0x45, 0x50, 0x84, 0x40, - 0x05, 0x38, 0x7E, 0x83, 0x30, 0x08, 0x63, 0x84, 0x83, 0x63, - 0x7A, 0xB4, 0x86, 0x7A, 0x33, 0x68, 0x7D, 0x89, 0xE7, 0x7A, - 0x36, 0x88, 0x83, 0x15, 0xA8, 0x83, 0x3B, 0xB8, 0x7B, 0x1A, - 0x18, 0x73, 0x7A, 0x00, 0x04, 0x73, 0x27, 0x82, 0x47, 0x70, - 0x7E, 0x62, 0xE8, 0x01, 0x62, 0x78, 0x01, 0x66, 0x18, 0x86, - 0x43, 0x76, 0x7E, 0xB6, 0xD7, 0x0B, 0xDE, 0xF3, 0x55, 0x3D, - 0x51, 0x48, 0x77, 0x35, 0x48, 0x77, 0x41, 0x90, 0x7E, 0xB4, - 0xC3, 0x0B, 0x8E, 0x87, 0x85, 0x94, 0x47, 0x74, 0x73, 0x90, - 0x03, 0x40, 0xA0, 0x54, 0x82, 0xF7, 0x87, 0xB9, 0x30, 0x15, - 0x4B, 0xC0, 0x00, 0x84, 0x58, 0x88, 0x86, 0xB8, 0x04, 0x14, - 0xD0, 0x13, 0x08, 0x50, 0x88, 0x2D, 0x90, 0x03, 0x73, 0x60, - 0x84, 0x45, 0x90, 0x88, 0x7A, 0xF0, 0x88, 0x90, 0x58, 0x89, - 0x96, 0x58, 0x01, 0x87, 0x43, 0x05, 0x54, 0x90, 0x88, 0xF8, - 0xD0, 0x89, 0x9E, 0xF8, 0x89, 0xA0, 0x18, 0x8A, 0xA2, 0x28, - 0x8A, 0x95, 0x12, 0x08, 0x00, 0x3B -}; - -struct fsdata_file const file_img_QP_datasheet_gif[] = { - { - file_img_PSiCC2_gif, - data_img_QP_datasheet_gif, - data_img_QP_datasheet_gif + 22, - sizeof(data_img_QP_datasheet_gif) - 22 - } -}; - -/* /index.htm */ -static unsigned char const data_index_htm[] = { - /* name: */ - 0x2F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D , 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0A, 0x3C, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0A, 0x3C, - 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x3C, 0x4D, 0x45, 0x54, - 0x41, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2D, 0x45, 0x51, 0x55, - 0x49, 0x56, 0x3D, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, - 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x3D, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3B, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x3D, 0x49, 0x53, 0x4F, 0x2D, 0x38, - 0x38, 0x36, 0x39, 0x2D, 0x31, 0x22, 0x3E, 0x0A, 0x3C, 0x54, - 0x49, 0x54, 0x4C, 0x45, 0x3E, 0x51, 0x50, 0x2F, 0x6C, 0x77, - 0x49, 0x50, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x54, 0x49, 0x54, 0x4C, - 0x45, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, 0x68, - 0x72, 0x65, 0x66, 0x3D, 0x22, 0x73, 0x74, 0x79, 0x6C, 0x65, - 0x2E, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x3D, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x63, 0x73, 0x73, 0x20, - 0x72, 0x65, 0x6C, 0x3D, 0x53, 0x74, 0x79, 0x6C, 0x65, 0x73, - 0x68, 0x65, 0x65, 0x74, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, - 0x4B, 0x20, 0x72, 0x65, 0x6C, 0x3D, 0x22, 0x69, 0x63, 0x6F, - 0x6E, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x69, - 0x6D, 0x67, 0x2F, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6F, 0x6E, - 0x2E, 0x69, 0x63, 0x6F, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, - 0x69, 0x63, 0x6F, 0x6E, 0x22, 0x20, 0x2F, 0x3E, 0x0A, 0x3C, - 0x2F, 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x0A, 0x3C, 0x42, - 0x4F, 0x44, 0x59, 0x3E, 0x0A, 0x3C, 0x54, 0x41, 0x42, 0x4C, - 0x45, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x53, 0x70, 0x61, 0x63, - 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x63, 0x65, 0x6C, 0x6C, - 0x50, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, - 0x25, 0x22, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, - 0x22, 0x30, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x69, 0x64, 0x3D, 0x6D, 0x61, 0x73, 0x74, 0x68, 0x65, 0x61, - 0x64, 0x20, 0x6E, 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x3E, - 0x3C, 0x41, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x3C, - 0x49, 0x4D, 0x47, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x72, 0x63, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, - 0x6F, 0x67, 0x6F, 0x5F, 0x71, 0x6C, 0x2E, 0x6A, 0x70, 0x67, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, - 0x74, 0x6C, 0x65, 0x3D, 0x22, 0x51, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, - 0x20, 0x69, 0x6E, 0x6E, 0x6F, 0x76, 0x61, 0x74, 0x69, 0x6E, - 0x67, 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, - 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6C, 0x74, 0x3D, - 0x22, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, - 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, 0x6E, - 0x6F, 0x76, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6D, - 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, - 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2D, 0x62, 0x6F, 0x74, - 0x74, 0x6F, 0x6D, 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, - 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x54, 0x44, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, - 0x31, 0x30, 0x30, 0x25, 0x22, 0x3E, 0x3C, 0x2F, 0x54, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x6E, 0x6F, 0x77, 0x72, 0x61, 0x70, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x42, 0x3E, 0x51, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x2C, 0x20, - 0x4C, 0x4C, 0x43, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, - 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, 0x3A, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, - 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, - 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, 0x3E, 0x3C, 0x62, 0x72, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, 0x20, 0x48, - 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x77, 0x77, 0x77, 0x2E, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x44, 0x3E, - 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0A, 0x20, - 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x6D, 0x65, - 0x6E, 0x75, 0x22, 0x20, 0x63, 0x6F, 0x6C, 0x73, 0x70, 0x61, - 0x6E, 0x3D, 0x22, 0x33, 0x22, 0x20, 0x6E, 0x6F, 0x57, 0x72, - 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x6C, - 0x65, 0x66, 0x74, 0x20, 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, - 0x72, 0x3D, 0x22, 0x23, 0x30, 0x30, 0x30, 0x30, 0x39, 0x39, - 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3D, 0x22, - 0x32, 0x35, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x42, 0x49, 0x47, 0x3E, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x42, - 0x3E, 0x48, 0x4F, 0x4D, 0x45, 0x3C, 0x2F, 0x42, 0x3E, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, - 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x73, 0x73, 0x69, 0x5F, - 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x53, 0x53, 0x49, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, - 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, - 0x63, 0x67, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x68, - 0x74, 0x6D, 0x22, 0x3E, 0x43, 0x47, 0x49, 0x20, 0x44, 0x45, - 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x75, 0x64, 0x70, 0x5F, 0x64, 0x65, 0x6D, - 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x55, 0x44, 0x50, - 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x3C, - 0x2F, 0x42, 0x49, 0x47, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, - 0x54, 0x52, 0x3E, 0x0A, 0x3C, 0x2F, 0x54, 0x41, 0x42, 0x4C, - 0x45, 0x3E, 0x0A, 0x0A, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x20, - 0x42, 0x45, 0x47, 0x49, 0x4E, 0x5F, 0x43, 0x4F, 0x4E, 0x54, - 0x45, 0x4E, 0x54, 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x3C, 0x41, - 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x41, 0x62, 0x6F, - 0x75, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x3C, - 0x48, 0x31, 0x3E, 0x41, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x54, - 0x68, 0x69, 0x73, 0x20, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x3C, 0x2F, 0x48, 0x31, 0x3E, 0x0A, 0x0A, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, - 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, - 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, 0x66, 0x22, - 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, - 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x49, 0x4D, - 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, 0x6D, 0x67, - 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, - 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x6A, 0x70, 0x67, 0x22, - 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x41, 0x70, 0x70, 0x6C, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, 0x6F, - 0x74, 0x65, 0x20, 0x28, 0x31, 0x2E, 0x34, 0x4D, 0x42, 0x20, - 0x50, 0x44, 0x46, 0x29, 0x22, 0x20, 0x61, 0x6C, 0x69, 0x67, - 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, - 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, 0x30, - 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, - 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, 0x3C, - 0x50, 0x3E, 0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x43, 0x50, 0x2F, 0x49, - 0x50, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6B, 0x20, 0x63, 0x61, - 0x6C, 0x6C, 0x65, 0x64, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x31, 0x2E, 0x34, 0x2E, 0x31, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x29, 0x20, - 0x72, 0x75, 0x6E, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x6E, - 0x20, 0x74, 0x6F, 0x70, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x51, 0x50, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3B, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x77, 0x6F, - 0x72, 0x6B, 0x2C, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x62, 0x6F, 0x74, 0x68, 0x20, 0x62, - 0x72, 0x69, 0x65, 0x66, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x62, 0x65, 0x6C, - 0x6F, 0x77, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, - 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x65, 0x78, 0x61, 0x6D, - 0x70, 0x6C, 0x65, 0x20, 0x70, 0x72, 0x6F, 0x76, 0x69, 0x64, - 0x65, 0x73, 0x20, 0x61, 0x6E, 0x20, 0x48, 0x54, 0x54, 0x50, - 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x73, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x73, - 0x73, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, - 0x74, 0x6D, 0x22, 0x3E, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x20, 0x53, 0x69, 0x64, 0x65, 0x20, 0x49, 0x6E, 0x63, 0x6C, - 0x75, 0x64, 0x65, 0x20, 0x28, 0x53, 0x53, 0x49, 0x29, 0x3C, - 0x2F, 0x41, 0x3E, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x63, 0x67, 0x69, - 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x43, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x49, 0x6E, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x28, 0x43, 0x47, 0x49, - 0x29, 0x3C, 0x2F, 0x41, 0x3E, 0x20, 0x20, 0x63, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x20, 0x73, - 0x6F, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x79, 0x6E, - 0x61, 0x6D, 0x69, 0x63, 0x20, 0x77, 0x65, 0x62, 0x20, 0x70, - 0x61, 0x67, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, - 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61, - 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, - 0x65, 0x73, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x73, 0x65, 0x6E, - 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6F, 0x72, 0x20, - 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x73, 0x20, 0x74, - 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2E, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, - 0x61, 0x6C, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x77, - 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, - 0x6E, 0x64, 0x20, 0x61, 0x20, 0x75, 0x74, 0x69, 0x6C, 0x69, - 0x74, 0x79, 0x20, 0x28, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, - 0x71, 0x66, 0x73, 0x67, 0x65, 0x6E, 0x2E, 0x65, 0x78, 0x65, - 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x29, 0x20, 0x66, - 0x6F, 0x72, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x54, - 0x4D, 0x4C, 0x2D, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x61, - 0x6E, 0x64, 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x70, 0x72, - 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, - 0x50, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, - 0x63, 0x6F, 0x64, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, - 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x6C, 0x77, - 0x49, 0x50, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x73, - 0x20, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x61, 0x6C, 0x6C, 0x79, - 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x74, 0x6F, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x44, 0x48, 0x43, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x74, 0x6F, 0x20, - 0x6F, 0x62, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x2C, 0x20, 0x73, 0x6F, 0x20, 0x69, 0x74, 0x20, 0x61, - 0x73, 0x73, 0x75, 0x6D, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x63, 0x65, 0x20, - 0x6F, 0x66, 0x20, 0x61, 0x20, 0x44, 0x48, 0x43, 0x50, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2C, 0x20, 0x73, 0x75, - 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, - 0x70, 0x69, 0x63, 0x61, 0x6C, 0x20, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x6E, 0x65, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x74, 0x65, - 0x72, 0x2E, 0x20, 0x42, 0x79, 0x20, 0x6D, 0x6F, 0x64, 0x69, - 0x66, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x6C, 0x77, 0x69, 0x70, - 0x6F, 0x70, 0x74, 0x73, 0x2E, 0x68, 0x3C, 0x2F, 0x43, 0x4F, - 0x44, 0x45, 0x3E, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x20, 0x66, 0x69, 0x6C, 0x65, 0x2C, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x61, 0x6C, 0x73, - 0x6F, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6F, - 0x70, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x20, 0x76, 0x69, 0x61, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x41, 0x55, 0x54, 0x4F, 0x49, 0x50, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, - 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x52, 0x46, 0x43, 0x20, - 0x33, 0x39, 0x32, 0x37, 0x29, 0x2C, 0x20, 0x6F, 0x72, 0x20, - 0x74, 0x6F, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x49, 0x50, 0x20, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2E, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, - 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x64, 0x65, 0x6D, 0x6F, 0x6E, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x75, 0x64, 0x70, - 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x55, 0x44, 0x50, 0x3C, 0x2F, 0x41, 0x3E, 0x2E, 0x20, - 0x41, 0x20, 0x55, 0x44, 0x50, 0x20, 0x74, 0x65, 0x73, 0x74, - 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x28, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, - 0x71, 0x75, 0x64, 0x70, 0x2E, 0x65, 0x78, 0x65, 0x3C, 0x2F, - 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x29, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x73, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x61, - 0x6E, 0x64, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, - 0x6E, 0x67, 0x20, 0x55, 0x44, 0x50, 0x20, 0x70, 0x61, 0x63, - 0x6B, 0x65, 0x74, 0x73, 0x20, 0x28, 0x6F, 0x6E, 0x20, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x4C, 0x69, 0x6E, 0x75, 0x78, 0x20, 0x68, 0x6F, 0x73, - 0x74, 0x73, 0x29, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, 0x50, - 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x63, - 0x6F, 0x64, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, - 0x3C, 0x50, 0x3E, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, - 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x41, 0x70, 0x70, - 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, - 0x6F, 0x74, 0x65, 0x3A, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, - 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x2F, 0x41, 0x4E, - 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, 0x5F, 0x6C, 0x77, - 0x49, 0x50, 0x2E, 0x70, 0x64, 0x66, 0x22, 0x20, 0x54, 0x41, - 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, - 0x6E, 0x6B, 0x22, 0x3E, 0x22, 0x51, 0x50, 0x20, 0x61, 0x6E, - 0x64, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x54, 0x43, 0x50, - 0x2F, 0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6B, 0x22, - 0x3C, 0x2F, 0x41, 0x3E, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6D, - 0x6F, 0x72, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x69, 0x6E, - 0x20, 0x50, 0x44, 0x46, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, - 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, - 0x50, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, - 0x63, 0x6F, 0x64, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, - 0x0A, 0x0A, 0x3C, 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, - 0x22, 0x50, 0x6F, 0x72, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x41, 0x62, 0x6F, 0x75, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x50, 0x2D, 0x6C, - 0x77, 0x49, 0x50, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x48, 0x31, 0x3E, - 0x0A, 0x0A, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, - 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, - 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x6C, 0x77, 0x69, 0x70, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, - 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, - 0x22, 0x3E, 0x3C, 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, - 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, - 0x5F, 0x6C, 0x77, 0x69, 0x70, 0x5F, 0x71, 0x70, 0x2E, 0x6A, - 0x70, 0x67, 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x51, - 0x50, 0x2D, 0x6C, 0x77, 0x49, 0x50, 0x22, 0x20, 0x61, 0x6C, - 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, 0x22, - 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, - 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, - 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, - 0x3C, 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x2D, 0x6C, 0x77, - 0x49, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, - 0x65, 0x6E, 0x20, 0x63, 0x61, 0x72, 0x65, 0x66, 0x75, 0x6C, - 0x6C, 0x79, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x65, - 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x68, 0x61, 0x72, 0x64, 0x20, 0x72, - 0x65, 0x61, 0x6C, 0x2D, 0x74, 0x69, 0x6D, 0x65, 0x3C, 0x2F, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x2D, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x73, 0x2C, 0x20, 0x69, 0x6E, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x43, - 0x50, 0x2F, 0x49, 0x50, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6B, - 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, - 0x6F, 0x20, 0x6D, 0x6F, 0x6E, 0x69, 0x74, 0x6F, 0x72, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, - 0x6C, 0x6C, 0x20, 0x61, 0x73, 0x20, 0x74, 0x6F, 0x20, 0x70, - 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x20, 0x72, 0x65, 0x6D, - 0x6F, 0x74, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, - 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x28, - 0x65, 0x2E, 0x67, 0x2E, 0x2C, 0x20, 0x62, 0x79, 0x20, 0x6D, - 0x65, 0x61, 0x6E, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x20, - 0x77, 0x65, 0x62, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x73, 0x65, - 0x72, 0x29, 0x2E, 0x20, 0x49, 0x6E, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x75, 0x6C, 0x61, 0x72, 0x2C, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6B, - 0x2C, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, - 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6E, - 0x6F, 0x74, 0x20, 0x70, 0x72, 0x65, 0x65, 0x6D, 0x70, 0x74, - 0x69, 0x76, 0x65, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x2C, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x6C, 0x79, 0x20, 0x65, 0x6E, 0x63, 0x61, - 0x70, 0x73, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, - 0x6E, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x64, 0x65, - 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x20, 0x6F, 0x62, 0x6A, 0x65, 0x63, - 0x74, 0x20, 0x28, 0x4C, 0x77, 0x49, 0x50, 0x2D, 0x4D, 0x61, - 0x6E, 0x61, 0x67, 0x65, 0x72, 0x29, 0x2C, 0x20, 0x73, 0x6F, - 0x20, 0x6E, 0x6F, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x72, - 0x75, 0x70, 0x74, 0x20, 0x6C, 0x6F, 0x63, 0x6B, 0x69, 0x6E, - 0x67, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x65, 0x63, 0x65, 0x73, - 0x73, 0x61, 0x72, 0x79, 0x2C, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6C, - 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6C, 0x6F, 0x77, 0x20, 0x69, - 0x6E, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x6C, - 0x61, 0x74, 0x65, 0x6E, 0x63, 0x79, 0x2E, 0x20, 0x41, 0x6C, - 0x73, 0x6F, 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x69, 0x6E, 0x74, - 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x20, 0x72, 0x6F, 0x75, 0x74, 0x69, - 0x6E, 0x65, 0x20, 0x28, 0x49, 0x53, 0x52, 0x29, 0x20, 0x72, - 0x75, 0x6E, 0x73, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x66, - 0x61, 0x73, 0x74, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6F, 0x6E, - 0x6C, 0x79, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x61, 0x6C, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6B, 0x20, - 0x6C, 0x65, 0x76, 0x65, 0x6C, 0x20, 0x28, 0x74, 0x68, 0x65, - 0x20, 0x49, 0x53, 0x52, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, - 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6F, 0x72, - 0x6D, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x79, 0x20, - 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x61, 0x74, 0x20, 0x61, - 0x6C, 0x6C, 0x29, 0x2E, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, - 0x6D, 0x65, 0x61, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x68, 0x61, 0x72, 0x64, 0x2D, 0x72, 0x65, 0x61, 0x6C, - 0x2D, 0x74, 0x69, 0x6D, 0x65, 0x20, 0x70, 0x72, 0x6F, 0x63, - 0x65, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x61, 0x6E, - 0x20, 0x62, 0x65, 0x20, 0x64, 0x6F, 0x6E, 0x65, 0x20, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6B, - 0x20, 0x6C, 0x65, 0x76, 0x65, 0x6C, 0x2C, 0x20, 0x65, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x77, - 0x68, 0x65, 0x6E, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x65, 0x6D, 0x70, - 0x74, 0x69, 0x76, 0x65, 0x20, 0x51, 0x4B, 0x20, 0x6B, 0x65, - 0x72, 0x6E, 0x65, 0x6C, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x79, - 0x6F, 0x75, 0x72, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x51, 0x50, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, - 0x3B, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, - 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, - 0x6E, 0x20, 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x63, 0x61, 0x72, - 0x65, 0x66, 0x75, 0x6C, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x73, - 0x69, 0x67, 0x6E, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, - 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x70, 0x6F, - 0x72, 0x74, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x2E, 0x20, - 0x41, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, - 0x72, 0x65, 0x2D, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, - 0x63, 0x6C, 0x65, 0x61, 0x72, 0x6C, 0x79, 0x20, 0x73, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6E, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x6E, 0x65, 0x74, 0x2F, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6C, 0x65, 0x61, 0x6E, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, - 0x3E, 0x0A, 0x0A, 0x3C, 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, - 0x3D, 0x22, 0x51, 0x50, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, - 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x41, 0x62, 0x6F, 0x75, 0x74, - 0x20, 0x51, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, - 0x4D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x20, 0x46, 0x72, - 0x61, 0x6D, 0x65, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x3C, 0x2F, - 0x48, 0x31, 0x3E, 0x0A, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, - 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, - 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x70, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x2F, 0x51, 0x50, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x73, 0x68, - 0x65, 0x65, 0x74, 0x2E, 0x70, 0x64, 0x66, 0x22, 0x20, 0x54, - 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, - 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x49, 0x4D, 0x47, 0x20, - 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x51, - 0x50, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x73, 0x68, 0x65, 0x65, - 0x74, 0x2E, 0x67, 0x69, 0x66, 0x22, 0x20, 0x41, 0x4C, 0x54, - 0x3D, 0x22, 0x51, 0x50, 0x20, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x68, 0x65, 0x65, 0x74, 0x20, 0x28, 0x31, 0x2E, 0x34, 0x4D, - 0x42, 0x20, 0x50, 0x44, 0x46, 0x29, 0x22, 0x20, 0x61, 0x6C, - 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, 0x22, - 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, - 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, - 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, - 0x3C, 0x50, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x51, 0x50, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3B, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x61, 0x6D, 0x69, 0x6C, - 0x79, 0x20, 0x6F, 0x66, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, - 0x6C, 0x69, 0x67, 0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x2C, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, - 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, - 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, - 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, - 0x2F, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x69, 0x6E, 0x67, - 0x2F, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, - 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x6F, - 0x70, 0x65, 0x6E, 0x20, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x3C, 0x2F, 0x41, 0x3E, 0x2C, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2D, - 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x66, 0x72, 0x61, 0x6D, - 0x65, 0x77, 0x6F, 0x72, 0x6B, 0x73, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, - 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x70, 0x72, 0x6F, 0x63, 0x65, - 0x73, 0x73, 0x6F, 0x72, 0x73, 0x2C, 0x20, 0x6D, 0x69, 0x63, - 0x72, 0x6F, 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x6C, - 0x65, 0x72, 0x73, 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x44, - 0x53, 0x50, 0x73, 0x2E, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x65, 0x6E, 0x61, 0x62, 0x6C, - 0x65, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, - 0x69, 0x6E, 0x67, 0x20, 0x77, 0x65, 0x6C, 0x6C, 0x2D, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x20, - 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61, - 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, - 0x20, 0x6F, 0x66, 0x20, 0x63, 0x6F, 0x6E, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x68, 0x69, 0x65, - 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6C, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x73, 0x20, 0x28, 0x55, 0x4D, 0x4C, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x63, 0x68, 0x61, 0x72, 0x74, - 0x73, 0x29, 0x2E, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x2C, 0x20, - 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, - 0x6D, 0x6F, 0x64, 0x65, 0x72, 0x6E, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x20, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6C, 0x79, - 0x20, 0x69, 0x6E, 0x20, 0x43, 0x20, 0x6F, 0x72, 0x20, 0x43, - 0x2B, 0x2B, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6E, 0x6F, - 0x6E, 0x2D, 0x69, 0x73, 0x73, 0x75, 0x65, 0x2E, 0x20, 0x4E, - 0x6F, 0x20, 0x62, 0x69, 0x67, 0x20, 0x64, 0x65, 0x73, 0x69, - 0x67, 0x6E, 0x20, 0x61, 0x75, 0x74, 0x6F, 0x6D, 0x61, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x6F, 0x6F, 0x6C, 0x73, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x6E, 0x65, 0x65, 0x64, 0x65, 0x64, - 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x0A, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x73, 0x69, 0x63, - 0x63, 0x32, 0x2F, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, - 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, - 0x3E, 0x3C, 0x69, 0x6D, 0x67, 0x20, 0x61, 0x6C, 0x74, 0x3D, - 0x22, 0x50, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, 0x6C, - 0x20, 0x55, 0x4D, 0x4C, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x63, 0x68, 0x61, 0x72, 0x74, 0x73, 0x20, 0x69, 0x6E, 0x20, - 0x43, 0x2F, 0x43, 0x2B, 0x2B, 0x2C, 0x20, 0x32, 0x6E, 0x64, - 0x20, 0x45, 0x64, 0x2E, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3D, - 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x50, 0x53, 0x69, 0x43, 0x43, - 0x32, 0x2E, 0x67, 0x69, 0x66, 0x22, 0x20, 0x68, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, 0x30, 0x22, 0x20, 0x76, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x35, 0x22, 0x20, - 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, - 0x3C, 0x50, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x20, - 0x6F, 0x66, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x20, 0x61, 0x72, 0x65, 0x3A, 0x20, 0x51, 0x50, - 0x2F, 0x43, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3B, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x51, 0x50, 0x2F, 0x43, 0x2B, 0x2B, - 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3B, 0x2C, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x34, - 0x4B, 0x42, 0x20, 0x6F, 0x66, 0x20, 0x63, 0x6F, 0x64, 0x65, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, - 0x20, 0x68, 0x75, 0x6E, 0x64, 0x72, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x52, 0x41, - 0x4D, 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x6C, 0x74, 0x72, 0x61, 0x2D, 0x6C, 0x69, 0x67, - 0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x51, - 0x50, 0x2D, 0x6E, 0x61, 0x6E, 0x6F, 0x2C, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x73, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x31, 0x2D, - 0x32, 0x4B, 0x42, 0x20, 0x6F, 0x66, 0x20, 0x63, 0x6F, 0x64, - 0x65, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6A, 0x75, 0x73, 0x74, - 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6C, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x52, 0x41, - 0x4D, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, 0x50, - 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x51, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x63, 0x61, 0x6E, 0x20, 0x77, 0x6F, 0x72, 0x6B, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x6F, 0x72, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6F, 0x75, 0x74, 0x20, 0x61, 0x20, 0x74, 0x72, - 0x61, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, - 0x4F, 0x53, 0x2F, 0x52, 0x54, 0x4F, 0x53, 0x2E, 0x20, 0x49, - 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6E, - 0x64, 0x61, 0x6C, 0x6F, 0x6E, 0x65, 0x20, 0x63, 0x6F, 0x6E, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x2C, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x63, 0x6F, 0x6D, 0x70, - 0x6C, 0x65, 0x74, 0x65, 0x6C, 0x79, 0x20, 0x3C, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x72, 0x65, 0x70, 0x6C, 0x61, - 0x63, 0x65, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x52, 0x54, 0x4F, 0x53, - 0x2E, 0x20, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x73, - 0x20, 0x61, 0x20, 0x73, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20, - 0x6E, 0x6F, 0x6E, 0x2D, 0x70, 0x72, 0x65, 0x65, 0x6D, 0x70, - 0x74, 0x69, 0x76, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6C, 0x65, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x61, - 0x20, 0x66, 0x75, 0x6C, 0x6C, 0x79, 0x20, 0x70, 0x72, 0x65, - 0x65, 0x6D, 0x70, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6B, 0x65, - 0x72, 0x6E, 0x65, 0x6C, 0x20, 0x28, 0x51, 0x4B, 0x29, 0x2E, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x51, 0x50, 0x2F, 0x43, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x51, 0x50, 0x2F, 0x43, 0x2B, 0x2B, - 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x77, 0x6F, 0x72, 0x6B, - 0x73, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x61, 0x6C, 0x73, 0x6F, - 0x20, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x4F, 0x53, 0x2F, 0x52, 0x54, - 0x4F, 0x53, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x61, 0x6B, 0x65, - 0x20, 0x61, 0x64, 0x76, 0x61, 0x6E, 0x74, 0x61, 0x67, 0x65, - 0x20, 0x6F, 0x66, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6E, 0x67, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, - 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2C, 0x20, 0x63, - 0x6F, 0x6D, 0x6D, 0x75, 0x6E, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6B, 0x73, 0x2C, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6F, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x77, 0x61, 0x72, - 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, 0x50, - 0x3E, 0x41, 0x6C, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6F, 0x6E, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x3C, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, - 0x20, 0x69, 0x6E, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6C, - 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6F, - 0x6F, 0x6B, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, - 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, - 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, - 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, - 0x2F, 0x70, 0x73, 0x69, 0x63, 0x63, 0x32, 0x22, 0x20, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, 0x22, 0x5F, 0x62, 0x6C, - 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x45, 0x4D, 0x3E, 0x3C, - 0x49, 0x3E, 0x50, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, - 0x6C, 0x20, 0x55, 0x4D, 0x4C, 0x20, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x63, 0x68, 0x61, 0x72, 0x74, 0x73, 0x20, 0x69, 0x6E, - 0x20, 0x43, 0x2F, 0x43, 0x2B, 0x2B, 0x2C, 0x20, 0x53, 0x65, - 0x63, 0x6F, 0x6E, 0x64, 0x20, 0x45, 0x64, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x3A, 0x20, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x2D, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x6E, 0x20, 0x50, 0x72, 0x6F, - 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x20, 0x66, - 0x6F, 0x72, 0x20, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, - 0x64, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x3C, - 0x2F, 0x49, 0x3E, 0x3C, 0x2F, 0x45, 0x4D, 0x3E, 0x3C, 0x2F, - 0x41, 0x3E, 0x20, 0x62, 0x79, 0x20, 0x44, 0x72, 0x2E, 0x20, - 0x4D, 0x69, 0x72, 0x6F, 0x20, 0x53, 0x61, 0x6D, 0x65, 0x6B, - 0x2C, 0x20, 0x28, 0x49, 0x53, 0x42, 0x4E, 0x3A, 0x20, 0x39, - 0x37, 0x38, 0x2D, 0x30, 0x37, 0x35, 0x30, 0x36, 0x38, 0x37, - 0x30, 0x36, 0x35, 0x29, 0x2E, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x68, 0x61, 0x73, 0x20, - 0x61, 0x20, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x20, 0x75, - 0x73, 0x65, 0x72, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x74, 0x79, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x68, 0x61, - 0x73, 0x20, 0x62, 0x65, 0x65, 0x6E, 0x20, 0x61, 0x70, 0x70, - 0x6C, 0x69, 0x65, 0x64, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, - 0x77, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x73, 0x6F, - 0x6D, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6C, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x0A, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x2F, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x65, 0x72, - 0x73, 0x2E, 0x70, 0x68, 0x70, 0x22, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, - 0x6B, 0x22, 0x3E, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x6E, 0x69, - 0x65, 0x73, 0x3C, 0x2F, 0x41, 0x3E, 0x20, 0x69, 0x6E, 0x20, - 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6E, 0x64, - 0x75, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2C, 0x20, 0x73, - 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x3A, 0x20, 0x63, 0x6F, - 0x6E, 0x73, 0x75, 0x6D, 0x65, 0x72, 0x20, 0x65, 0x6C, 0x65, - 0x63, 0x74, 0x72, 0x6F, 0x6E, 0x69, 0x63, 0x73, 0x2C, 0x20, - 0x74, 0x65, 0x6C, 0x65, 0x63, 0x6F, 0x6D, 0x6D, 0x75, 0x6E, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x65, - 0x71, 0x75, 0x69, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x2C, 0x20, - 0x69, 0x6E, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6C, - 0x20, 0x61, 0x75, 0x74, 0x6F, 0x6D, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x2C, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, - 0x72, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6D, 0x73, 0x2C, 0x20, 0x6D, 0x65, 0x64, - 0x69, 0x63, 0x61, 0x6C, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2C, 0x20, 0x6E, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x61, 0x6C, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6E, 0x73, 0x65, - 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x61, 0x6E, 0x79, - 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, - 0x3E, 0x0A, 0x3C, 0x50, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x69, 0x73, 0x20, 0x6C, 0x69, - 0x63, 0x65, 0x6E, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6E, 0x64, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x4C, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x32, - 0x20, 0x6F, 0x70, 0x65, 0x6E, 0x20, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, - 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6C, 0x6C, 0x20, 0x61, - 0x73, 0x20, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6F, - 0x6D, 0x6D, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6C, 0x20, 0x63, - 0x6C, 0x6F, 0x73, 0x65, 0x64, 0x2D, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, - 0x73, 0x2C, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x6C, 0x79, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x65, - 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x2C, 0x20, 0x77, 0x68, 0x6F, 0x20, 0x77, 0x69, 0x73, - 0x68, 0x20, 0x74, 0x6F, 0x20, 0x72, 0x65, 0x74, 0x61, 0x69, - 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6F, 0x70, - 0x72, 0x69, 0x65, 0x74, 0x61, 0x72, 0x79, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x6F, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6F, 0x64, - 0x65, 0x2E, 0x20, 0x4D, 0x6F, 0x72, 0x65, 0x20, 0x69, 0x6E, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x3C, 0x2F, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x6C, 0x69, 0x63, 0x65, - 0x6E, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x61, 0x6E, 0x20, - 0x62, 0x65, 0x20, 0x66, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x61, - 0x74, 0x20, 0x3C, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, - 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, - 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x69, 0x6E, 0x67, 0x22, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, 0x22, 0x5F, - 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x69, 0x63, 0x65, - 0x6E, 0x73, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x61, 0x3E, 0x2E, - 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x0A, 0x3C, 0x41, 0x20, - 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x6C, 0x77, 0x49, 0x50, - 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x3C, 0x48, 0x31, - 0x3E, 0x41, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x6C, 0x77, 0x49, - 0x50, 0x20, 0x54, 0x43, 0x50, 0x2F, 0x49, 0x50, 0x20, 0x53, - 0x74, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x48, 0x31, 0x3E, 0x0A, - 0x0A, 0x3C, 0x41, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, - 0x2E, 0x73, 0x69, 0x63, 0x73, 0x2E, 0x73, 0x65, 0x22, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, 0x22, 0x5F, 0x62, - 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, 0x49, 0x4D, 0x47, - 0x20, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x3D, 0x22, 0x53, 0x49, - 0x43, 0x53, 0x22, 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, 0x53, - 0x49, 0x43, 0x53, 0x2D, 0x2D, 0x68, 0x6F, 0x6D, 0x65, 0x20, - 0x6F, 0x66, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x22, 0x20, 0x73, - 0x72, 0x63, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, - 0x67, 0x6F, 0x5F, 0x73, 0x69, 0x63, 0x73, 0x2E, 0x67, 0x69, - 0x66, 0x22, 0x20, 0x41, 0x4C, 0x49, 0x47, 0x4E, 0x3D, 0x22, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x3C, 0x2F, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x69, 0x73, - 0x20, 0x61, 0x20, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x2D, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x69, 0x6D, 0x70, 0x6C, - 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x43, - 0x50, 0x2F, 0x49, 0x50, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, - 0x63, 0x6F, 0x6C, 0x20, 0x73, 0x75, 0x69, 0x74, 0x65, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6F, - 0x72, 0x69, 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x6C, 0x79, 0x20, - 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6E, 0x20, 0x62, 0x79, - 0x20, 0x41, 0x64, 0x61, 0x6D, 0x20, 0x44, 0x75, 0x6E, 0x6B, - 0x65, 0x6C, 0x73, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, - 0x6B, 0x73, 0x20, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x28, 0x43, 0x4E, - 0x41, 0x29, 0x20, 0x6C, 0x61, 0x62, 0x20, 0x6F, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x3C, 0x41, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, - 0x77, 0x77, 0x77, 0x2E, 0x73, 0x69, 0x63, 0x73, 0x2E, 0x73, - 0x65, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, - 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x53, - 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6E, 0x73, - 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x20, 0x6F, 0x66, 0x20, - 0x43, 0x6F, 0x6D, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x53, - 0x63, 0x69, 0x65, 0x6E, 0x63, 0x65, 0x3C, 0x2F, 0x41, 0x3E, - 0x20, 0x62, 0x75, 0x74, 0x20, 0x6E, 0x6F, 0x77, 0x20, 0x69, - 0x73, 0x20, 0x62, 0x65, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x76, - 0x65, 0x6C, 0x6F, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x61, 0x20, 0x74, 0x65, 0x61, 0x6D, 0x20, 0x6F, 0x66, 0x20, - 0x64, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x65, 0x72, 0x73, - 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x64, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x2D, 0x77, - 0x69, 0x64, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x4B, 0x69, 0x65, 0x72, 0x61, 0x6E, - 0x20, 0x4D, 0x61, 0x6E, 0x73, 0x6C, 0x65, 0x79, 0x2E, 0x0A, - 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, 0x50, 0x3E, 0x3C, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, - 0x6C, 0x65, 0x20, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x61, - 0x20, 0x42, 0x53, 0x44, 0x2D, 0x73, 0x74, 0x79, 0x6C, 0x65, - 0x20, 0x6F, 0x70, 0x65, 0x6E, 0x20, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, - 0x20, 0x69, 0x6E, 0x20, 0x43, 0x20, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x20, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x63, - 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x64, 0x6F, 0x77, 0x6E, - 0x6C, 0x6F, 0x61, 0x64, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, - 0x6D, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, - 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x68, 0x6F, - 0x6D, 0x65, 0x70, 0x61, 0x67, 0x65, 0x20, 0x61, 0x74, 0x20, - 0x3C, 0x41, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x73, 0x61, 0x76, 0x61, - 0x6E, 0x6E, 0x61, 0x68, 0x2E, 0x6E, 0x6F, 0x6E, 0x67, 0x6E, - 0x75, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x72, 0x6F, 0x6A, - 0x65, 0x63, 0x74, 0x73, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x22, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3D, 0x22, 0x5F, - 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x73, 0x61, 0x76, 0x61, 0x6E, 0x6E, - 0x61, 0x68, 0x2E, 0x6E, 0x6F, 0x6E, 0x67, 0x6E, 0x75, 0x2E, - 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x72, 0x6F, 0x6A, 0x65, 0x63, - 0x74, 0x73, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x3C, 0x2F, 0x41, - 0x3E, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x6F, 0x63, - 0x75, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6C, 0x77, 0x49, 0x50, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6F, - 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x52, 0x41, 0x4D, 0x20, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x20, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x20, 0x73, 0x74, - 0x69, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x76, 0x69, 0x6E, 0x67, - 0x20, 0x61, 0x20, 0x66, 0x75, 0x6C, 0x6C, 0x20, 0x73, 0x63, - 0x61, 0x6C, 0x65, 0x20, 0x54, 0x43, 0x50, 0x2F, 0x49, 0x50, - 0x20, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, 0x68, 0x69, - 0x73, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x73, 0x20, 0x6C, 0x77, - 0x49, 0x50, 0x20, 0x73, 0x75, 0x69, 0x74, 0x61, 0x62, 0x6C, - 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x69, 0x6E, 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, - 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x65, 0x6E, 0x73, 0x20, - 0x6F, 0x66, 0x20, 0x6B, 0x69, 0x6C, 0x6F, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x52, 0x41, 0x4D, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x61, 0x72, 0x6F, 0x75, 0x6E, 0x64, - 0x20, 0x34, 0x30, 0x20, 0x4B, 0x42, 0x20, 0x6F, 0x66, 0x20, - 0x63, 0x6F, 0x64, 0x65, 0x20, 0x52, 0x4F, 0x4D, 0x2E, 0x0A, - 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x3C, 0x50, 0x3E, 0x53, 0x69, - 0x6E, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, - 0x6C, 0x65, 0x61, 0x73, 0x65, 0x2C, 0x20, 0x3C, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x68, - 0x61, 0x73, 0x20, 0x73, 0x70, 0x75, 0x72, 0x72, 0x65, 0x64, - 0x20, 0x61, 0x20, 0x6C, 0x6F, 0x74, 0x20, 0x6F, 0x66, 0x20, - 0x69, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, - 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6F, 0x64, 0x61, - 0x79, 0x20, 0x62, 0x65, 0x69, 0x6E, 0x67, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x6D, 0x61, 0x6E, 0x79, - 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x65, 0x72, 0x63, 0x69, 0x61, - 0x6C, 0x20, 0x70, 0x72, 0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x2E, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x62, 0x65, 0x65, 0x6E, 0x20, 0x70, 0x6F, 0x72, 0x74, - 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x75, 0x6C, 0x74, - 0x69, 0x70, 0x6C, 0x65, 0x20, 0x70, 0x6C, 0x61, 0x74, 0x66, - 0x6F, 0x72, 0x6D, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6F, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, - 0x6E, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x6F, 0x72, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x6F, 0x75, 0x74, 0x20, 0x61, 0x6E, 0x20, 0x75, 0x6E, - 0x64, 0x65, 0x72, 0x6C, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x4F, - 0x53, 0x2E, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x69, 0x6E, - 0x63, 0x6C, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x6F, 0x6C, 0x6C, 0x6F, 0x77, 0x69, 0x6E, 0x67, - 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x73, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x3A, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, - 0x3C, 0x55, 0x4C, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x49, 0x50, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, - 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x50, - 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x20, 0x69, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x70, - 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x66, 0x6F, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x76, 0x65, - 0x72, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, - 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x69, - 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x3C, - 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x49, 0x43, 0x4D, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x28, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x65, 0x74, - 0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x20, 0x4D, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x50, 0x72, 0x6F, - 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x6D, - 0x61, 0x69, 0x6E, 0x74, 0x65, 0x6E, 0x61, 0x6E, 0x63, 0x65, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x67, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x4C, 0x49, 0x3E, 0x0A, - 0x3C, 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x49, 0x47, 0x4D, 0x50, 0x3C, 0x2F, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x49, 0x6E, 0x74, - 0x65, 0x72, 0x6E, 0x65, 0x74, 0x20, 0x47, 0x72, 0x6F, 0x75, - 0x70, 0x20, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x6D, 0x65, - 0x6E, 0x74, 0x20, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, - 0x6C, 0x29, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x6D, 0x75, 0x6C, - 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x20, 0x74, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x20, 0x6D, 0x61, 0x6E, 0x61, 0x67, - 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x3C, 0x2F, 0x4C, 0x49, 0x3E, - 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x55, 0x44, 0x50, 0x3C, 0x2F, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x55, 0x73, 0x65, - 0x72, 0x20, 0x44, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6D, - 0x20, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, - 0x20, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x69, 0x6E, 0x67, - 0x20, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6D, 0x65, 0x6E, - 0x74, 0x61, 0x6C, 0x20, 0x55, 0x44, 0x50, 0x2D, 0x6C, 0x69, - 0x74, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6E, 0x73, 0x69, - 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, - 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x54, 0x43, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x43, 0x6F, - 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x20, 0x50, 0x72, 0x6F, 0x74, - 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x63, 0x6F, 0x6E, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6F, - 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x2C, - 0x20, 0x52, 0x54, 0x54, 0x20, 0x65, 0x73, 0x74, 0x69, 0x6D, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, 0x20, - 0x66, 0x61, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6F, 0x76, - 0x65, 0x72, 0x79, 0x2F, 0x66, 0x61, 0x73, 0x74, 0x20, 0x72, - 0x65, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x6D, 0x69, 0x74, 0x3C, - 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x4E, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6E, 0x74, 0x2D, - 0x64, 0x72, 0x69, 0x76, 0x65, 0x6E, 0x20, 0x41, 0x50, 0x49, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x66, 0x6F, 0x72, 0x20, 0x65, 0x6E, 0x68, 0x61, 0x6E, 0x63, - 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x6E, 0x63, 0x65, 0x20, 0x28, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x69, 0x64, 0x65, 0x61, 0x6C, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x66, - 0x6F, 0x72, 0x20, 0x51, 0x50, 0x29, 0x3C, 0x2F, 0x4C, 0x49, - 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x44, 0x4E, 0x53, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x44, 0x6F, - 0x6D, 0x61, 0x69, 0x6E, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x73, - 0x20, 0x72, 0x65, 0x73, 0x6F, 0x6C, 0x76, 0x65, 0x72, 0x3C, - 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x53, 0x4E, 0x4D, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x28, 0x53, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x4E, - 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x4D, 0x61, 0x6E, - 0x61, 0x67, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x50, 0x72, - 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x3C, 0x2F, 0x4C, - 0x49, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x44, 0x48, 0x43, 0x50, 0x3C, - 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x28, - 0x44, 0x79, 0x6E, 0x61, 0x6D, 0x69, 0x63, 0x20, 0x48, 0x6F, - 0x73, 0x74, 0x20, 0x43, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x50, 0x72, 0x6F, - 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x3C, 0x2F, 0x4C, 0x49, - 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x41, 0x55, 0x54, 0x4F, 0x49, 0x50, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x28, 0x66, 0x6F, 0x72, 0x20, 0x49, 0x50, 0x76, 0x34, 0x2C, - 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x52, 0x46, 0x43, 0x20, 0x33, 0x39, - 0x32, 0x37, 0x29, 0x3C, 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, - 0x4C, 0x49, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x50, 0x50, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, - 0x6E, 0x67, 0x3E, 0x20, 0x28, 0x50, 0x6F, 0x69, 0x6E, 0x74, - 0x2D, 0x74, 0x6F, 0x2D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x20, - 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x3C, - 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x3E, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x41, 0x52, 0x50, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, - 0x28, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x29, 0x20, - 0x66, 0x6F, 0x72, 0x20, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6E, - 0x65, 0x74, 0x3C, 0x2F, 0x4C, 0x49, 0x3E, 0x0A, 0x3C, 0x2F, - 0x55, 0x4C, 0x3E, 0x0A, 0x0A, 0x3C, 0x64, 0x69, 0x76, 0x20, - 0x69, 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, - 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x3E, 0x26, 0x63, 0x6F, 0x70, - 0x79, 0x3B, 0x20, 0x32, 0x30, 0x30, 0x32, 0x2D, 0x32, 0x30, - 0x31, 0x31, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, - 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, 0x41, - 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x31, 0x30, 0x33, 0x20, 0x43, - 0x6F, 0x62, 0x62, 0x6C, 0x65, 0x20, 0x52, 0x69, 0x64, 0x67, - 0x65, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x2C, 0x20, 0x43, - 0x68, 0x61, 0x70, 0x65, 0x6C, 0x20, 0x48, 0x69, 0x6C, 0x6C, - 0x2C, 0x20, 0x4E, 0x43, 0x20, 0x32, 0x37, 0x35, 0x31, 0x36, - 0x2C, 0x20, 0x55, 0x53, 0x41, 0x3C, 0x62, 0x72, 0x20, 0x2F, - 0x3E, 0x0A, 0x54, 0x6F, 0x6C, 0x6C, 0x2D, 0x66, 0x72, 0x65, - 0x65, 0x3A, 0x20, 0x38, 0x36, 0x36, 0x2E, 0x34, 0x35, 0x30, - 0x2E, 0x4C, 0x45, 0x41, 0x50, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x3A, 0x20, - 0x39, 0x31, 0x39, 0x2E, 0x33, 0x36, 0x30, 0x2E, 0x35, 0x36, - 0x36, 0x38, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x46, - 0x61, 0x78, 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, 0x38, 0x36, - 0x39, 0x2E, 0x32, 0x39, 0x39, 0x38, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x3C, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, - 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, 0x3A, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, 0x61, 0x6E, 0x74, 0x75, - 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, 0x73, 0x2E, 0x63, 0x6F, - 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, - 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, - 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x61, 0x3E, 0x3C, - 0x2F, 0x70, 0x3E, 0x0A, 0x3C, 0x2F, 0x64, 0x69, 0x76, 0x3E, - 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x69, 0x64, 0x3D, 0x22, - 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, 0x22, 0x20, 0x2D, 0x2D, - 0x3E, 0x0A, 0x0A, 0x3C, 0x2F, 0x42, 0x4F, 0x44, 0x59, 0x3E, - 0x0A, 0x3C, 0x2F, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0A -}; - -struct fsdata_file const file_index_htm[] = { - { - file_img_QP_datasheet_gif, - data_index_htm, - data_index_htm + 11, - sizeof(data_index_htm) - 11 - } -}; - -/* /ssi_demo.shtm */ -static unsigned char const data_ssi_demo_shtm[] = { - /* name: */ - 0x2F, 0x73, 0x73, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, - 0x73, 0x68, 0x74, 0x6D, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, - 0x0D, 0x0A, 0x50, 0x72, 0x61, 0x67, 0x6D, 0x61, 0x3A, 0x20, - 0x6E, 0x6F, 0x2D, 0x63, 0x61, 0x63, 0x68, 0x65, 0x0D, 0x0A, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0D, 0x0A, 0x3C, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0D, - 0x0A, 0x3C, 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0D, 0x0A, 0x3C, - 0x4D, 0x45, 0x54, 0x41, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2D, - 0x45, 0x51, 0x55, 0x49, 0x56, 0x3D, 0x22, 0x63, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x3D, 0x22, - 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3B, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3D, 0x49, 0x53, - 0x4F, 0x2D, 0x38, 0x38, 0x36, 0x39, 0x2D, 0x31, 0x22, 0x3E, - 0x0D, 0x0A, 0x3C, 0x54, 0x49, 0x54, 0x4C, 0x45, 0x3E, 0x51, - 0x50, 0x2F, 0x6C, 0x77, 0x49, 0x50, 0x2D, 0x2D, 0x53, 0x53, - 0x49, 0x20, 0x44, 0x65, 0x6D, 0x6F, 0x3C, 0x2F, 0x54, 0x49, - 0x54, 0x4C, 0x45, 0x3E, 0x0D, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, - 0x4B, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x73, 0x74, - 0x79, 0x6C, 0x65, 0x2E, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x3D, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x63, - 0x73, 0x73, 0x20, 0x72, 0x65, 0x6C, 0x3D, 0x53, 0x74, 0x79, - 0x6C, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x3E, 0x0D, 0x0A, - 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, 0x72, 0x65, 0x6C, 0x3D, - 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x22, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x66, 0x61, 0x76, - 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x69, 0x63, 0x6F, 0x22, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, 0x69, 0x6D, 0x61, 0x67, - 0x65, 0x2F, 0x78, 0x2D, 0x69, 0x63, 0x6F, 0x6E, 0x22, 0x20, - 0x2F, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x48, 0x45, 0x41, 0x44, - 0x3E, 0x0D, 0x0A, 0x0D, 0x0A, 0x3C, 0x42, 0x4F, 0x44, 0x59, - 0x3E, 0x0D, 0x0A, 0x3C, 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, - 0x3D, 0x22, 0x54, 0x6F, 0x70, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0D, 0x0A, 0x3C, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x20, - 0x63, 0x65, 0x6C, 0x6C, 0x53, 0x70, 0x61, 0x63, 0x69, 0x6E, - 0x67, 0x3D, 0x30, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x50, 0x61, - 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, - 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, - 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x69, 0x64, 0x3D, 0x6D, 0x61, 0x73, 0x74, 0x68, 0x65, 0x61, - 0x64, 0x20, 0x6E, 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x3E, - 0x3C, 0x41, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x3C, - 0x49, 0x4D, 0x47, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x72, 0x63, 0x3D, 0x22, 0x69, 0x6D, 0x67, - 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, 0x71, 0x6C, 0x2E, 0x6A, - 0x70, 0x67, 0x22, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x3D, 0x22, 0x51, - 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, - 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, 0x6E, 0x6F, 0x76, - 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6D, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6D, 0x73, 0x22, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, 0x51, 0x75, 0x61, 0x6E, - 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, - 0x2D, 0x20, 0x69, 0x6E, 0x6E, 0x6F, 0x76, 0x61, 0x74, 0x69, - 0x6E, 0x67, 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, - 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x22, - 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6E, 0x67, 0x2D, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, - 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, - 0x44, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, - 0x30, 0x30, 0x25, 0x22, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x6E, 0x6F, 0x77, 0x72, 0x61, 0x70, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x42, 0x3E, 0x51, 0x75, 0x61, 0x6E, - 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x2C, - 0x20, 0x4C, 0x4C, 0x43, 0x3C, 0x2F, 0x42, 0x3E, 0x3C, 0x62, - 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x6D, 0x61, 0x69, - 0x6C, 0x74, 0x6F, 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, - 0x66, 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, - 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, - 0x3C, 0x2F, 0x41, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x0D, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, - 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, - 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, - 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x22, 0x3E, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, 0x3E, 0x0D, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, - 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, 0x0A, - 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, 0x3D, 0x22, - 0x6D, 0x65, 0x6E, 0x75, 0x22, 0x20, 0x63, 0x6F, 0x6C, 0x73, - 0x70, 0x61, 0x6E, 0x3D, 0x22, 0x33, 0x22, 0x20, 0x6E, 0x6F, - 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x62, 0x67, 0x63, 0x6F, - 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x30, 0x30, 0x30, 0x30, - 0x39, 0x39, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3D, 0x22, 0x32, 0x35, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x42, 0x49, 0x47, 0x3E, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, - 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x22, - 0x3E, 0x48, 0x4F, 0x4D, 0x45, 0x3C, 0x2F, 0x41, 0x3E, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x20, 0x7C, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x42, - 0x3E, 0x53, 0x53, 0x49, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, - 0x2F, 0x42, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, - 0x22, 0x63, 0x67, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, - 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x43, 0x47, 0x49, 0x20, 0x44, - 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, - 0x7C, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, - 0x52, 0x45, 0x46, 0x3D, 0x22, 0x75, 0x64, 0x70, 0x5F, 0x64, - 0x65, 0x6D, 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x55, - 0x44, 0x50, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, - 0x3E, 0x3C, 0x2F, 0x42, 0x49, 0x47, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, - 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x3C, - 0x2F, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x0D, 0x0A, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x20, - 0x42, 0x45, 0x47, 0x49, 0x4E, 0x5F, 0x43, 0x4F, 0x4E, 0x54, - 0x45, 0x4E, 0x54, 0x20, 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x3C, - 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x41, 0x62, - 0x6F, 0x75, 0x74, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0D, - 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x41, 0x62, 0x6F, 0x75, 0x74, - 0x20, 0x53, 0x53, 0x49, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6F, - 0x72, 0x74, 0x3C, 0x2F, 0x48, 0x31, 0x3E, 0x0D, 0x0A, 0x0D, - 0x0A, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, - 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, - 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, - 0x77, 0x69, 0x70, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, - 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, - 0x3E, 0x3C, 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, - 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, - 0x6C, 0x77, 0x69, 0x70, 0x5F, 0x71, 0x70, 0x2E, 0x6A, 0x70, - 0x67, 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x51, 0x50, - 0x2D, 0x6C, 0x77, 0x49, 0x50, 0x22, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, 0x22, 0x20, - 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, 0x30, - 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, - 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0D, 0x0A, 0x0D, - 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x48, 0x54, - 0x54, 0x50, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6F, 0x6D, 0x65, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, 0x49, 0x50, 0x3C, 0x2F, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x68, 0x61, - 0x73, 0x20, 0x62, 0x65, 0x65, 0x6E, 0x20, 0x65, 0x78, 0x74, - 0x65, 0x6E, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x73, - 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x72, 0x75, 0x64, - 0x69, 0x6D, 0x65, 0x6E, 0x74, 0x61, 0x72, 0x79, 0x20, 0x3C, - 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x20, 0x53, 0x69, 0x64, 0x65, 0x20, 0x49, - 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x20, 0x28, 0x53, 0x53, - 0x49, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6C, 0x69, 0x74, 0x79, - 0x2E, 0x20, 0x54, 0x6F, 0x20, 0x65, 0x6E, 0x61, 0x62, 0x6C, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x53, 0x49, 0x20, - 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x69, 0x6E, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x2D, - 0x48, 0x54, 0x54, 0x50, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2C, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x6E, 0x65, 0x65, - 0x64, 0x20, 0x74, 0x6F, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x61, 0x63, 0x72, - 0x6F, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x49, 0x4E, - 0x43, 0x4C, 0x55, 0x44, 0x45, 0x5F, 0x48, 0x54, 0x54, 0x50, - 0x44, 0x5F, 0x53, 0x53, 0x49, 0x3C, 0x2F, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x6C, 0x77, 0x69, 0x70, - 0x6F, 0x70, 0x74, 0x73, 0x2E, 0x68, 0x3C, 0x2F, 0x43, 0x4F, - 0x44, 0x45, 0x3E, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x20, 0x66, 0x69, 0x6C, 0x65, 0x2E, 0x0D, 0x0A, 0x0D, 0x0A, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, - 0x69, 0x70, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, - 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, - 0x66, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, - 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, - 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, - 0x6D, 0x67, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, - 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x6A, 0x70, - 0x67, 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x41, 0x70, - 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x28, 0x31, 0x2E, 0x34, 0x4D, - 0x42, 0x20, 0x50, 0x44, 0x46, 0x29, 0x22, 0x20, 0x61, 0x6C, - 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, - 0x31, 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x3D, 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0D, - 0x0A, 0x20, 0x0D, 0x0A, 0x59, 0x6F, 0x75, 0x20, 0x6D, 0x75, - 0x73, 0x74, 0x20, 0x61, 0x6C, 0x73, 0x6F, 0x20, 0x70, 0x72, - 0x6F, 0x76, 0x69, 0x64, 0x65, 0x20, 0x79, 0x6F, 0x75, 0x72, - 0x20, 0x53, 0x53, 0x49, 0x20, 0x63, 0x61, 0x6C, 0x6C, 0x62, - 0x61, 0x63, 0x6B, 0x20, 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x62, - 0x79, 0x20, 0x63, 0x61, 0x6C, 0x6C, 0x69, 0x6E, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, - 0x68, 0x74, 0x74, 0x70, 0x5F, 0x73, 0x65, 0x74, 0x5F, 0x73, - 0x73, 0x69, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, - 0x28, 0x29, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, - 0x66, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6C, 0x6C, - 0x20, 0x74, 0x68, 0x65, 0x6E, 0x20, 0x73, 0x63, 0x61, 0x6E, - 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6C, 0x65, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x65, 0x78, 0x74, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x3C, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x6C, 0x3C, 0x2F, - 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x2C, 0x20, 0x3C, 0x43, 0x4F, - 0x44, 0x45, 0x3E, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x3C, 0x2F, - 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, 0x6F, 0x72, 0x20, 0x3C, - 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x2E, 0x73, 0x73, 0x69, 0x3C, - 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x53, 0x49, 0x20, 0x74, - 0x61, 0x67, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x3C, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x26, 0x6C, 0x74, 0x3B, 0x21, 0x2D, 0x2D, 0x23, - 0x74, 0x61, 0x67, 0x2D, 0x2D, 0x26, 0x67, 0x74, 0x3B, 0x3C, - 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x72, 0x65, 0x70, 0x6C, - 0x61, 0x63, 0x65, 0x20, 0x6F, 0x6E, 0x2D, 0x74, 0x68, 0x65, - 0x2D, 0x66, 0x6C, 0x79, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, - 0x20, 0x72, 0x65, 0x63, 0x6F, 0x67, 0x6E, 0x69, 0x7A, 0x65, - 0x64, 0x20, 0x53, 0x53, 0x49, 0x20, 0x74, 0x61, 0x67, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x6F, 0x6D, 0x70, - 0x6F, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x79, 0x6F, - 0x75, 0x72, 0x20, 0x53, 0x53, 0x49, 0x20, 0x63, 0x61, 0x6C, - 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x20, 0x66, 0x75, 0x6E, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x53, 0x65, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x48, 0x54, 0x4D, 0x4C, 0x20, 0x73, - 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6F, 0x64, 0x65, - 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x77, 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x28, - 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x73, 0x73, 0x69, 0x5F, - 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x3C, - 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x29, 0x20, 0x61, 0x6E, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x53, 0x49, 0x20, - 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x20, 0x66, - 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x64, 0x65, - 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, - 0x6E, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x6C, 0x77, - 0x69, 0x70, 0x6D, 0x67, 0x72, 0x2E, 0x63, 0x3C, 0x2F, 0x43, - 0x4F, 0x44, 0x45, 0x3E, 0x2E, 0x0D, 0x0A, 0x3C, 0x2F, 0x50, - 0x3E, 0x0D, 0x0A, 0x3C, 0x50, 0x3E, 0x57, 0x68, 0x69, 0x6C, - 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, - 0x67, 0x20, 0x79, 0x6F, 0x75, 0x72, 0x20, 0x6F, 0x77, 0x6E, - 0x20, 0x53, 0x53, 0x49, 0x20, 0x74, 0x61, 0x67, 0x73, 0x2C, - 0x20, 0x72, 0x65, 0x6D, 0x65, 0x6D, 0x62, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x67, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x6C, 0x69, 0x6D, 0x69, 0x74, 0x65, 0x64, - 0x20, 0x74, 0x6F, 0x20, 0x38, 0x20, 0x63, 0x68, 0x61, 0x72, - 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, - 0x68, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, - 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x6D, 0x65, 0x6E, 0x74, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x73, 0x20, 0x63, - 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x65, 0x78, 0x63, 0x65, - 0x65, 0x64, 0x20, 0x31, 0x39, 0x32, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2E, 0x20, 0x59, - 0x6F, 0x75, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x72, 0x65, 0x2D, - 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x73, 0x65, 0x20, 0x6C, 0x69, 0x6D, 0x69, 0x74, 0x73, 0x20, - 0x62, 0x79, 0x20, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x69, 0x6E, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x61, 0x63, 0x72, - 0x6F, 0x73, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x4D, - 0x41, 0x58, 0x5F, 0x54, 0x41, 0x47, 0x5F, 0x4E, 0x41, 0x4D, - 0x45, 0x5F, 0x4C, 0x45, 0x4E, 0x3C, 0x2F, 0x43, 0x4F, 0x44, - 0x45, 0x3E, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x3C, 0x43, 0x4F, - 0x44, 0x45, 0x3E, 0x4D, 0x41, 0x58, 0x5F, 0x54, 0x41, 0x47, - 0x5F, 0x49, 0x4E, 0x53, 0x45, 0x52, 0x54, 0x5F, 0x4C, 0x45, - 0x4E, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x2C, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x6C, 0x79, 0x2C, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x68, 0x74, 0x74, - 0x70, 0x2E, 0x68, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, - 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, 0x69, - 0x6C, 0x65, 0x2E, 0x20, 0x0D, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, - 0x0D, 0x0A, 0x3C, 0x50, 0x3E, 0x50, 0x6C, 0x65, 0x61, 0x73, - 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6F, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x41, - 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x3A, 0x20, 0x3C, 0x41, 0x20, - 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x2F, - 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, 0x5F, - 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, 0x66, 0x22, 0x20, - 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, - 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x22, 0x51, 0x50, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x54, - 0x43, 0x50, 0x2F, 0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, - 0x6B, 0x22, 0x3C, 0x2F, 0x41, 0x3E, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, - 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, - 0x50, 0x2D, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x65, 0x78, 0x61, - 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x20, - 0x64, 0x6F, 0x77, 0x6E, 0x6C, 0x6F, 0x61, 0x64, 0x2E, 0x0D, - 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0D, 0x0A, 0x0D, 0x0A, 0x3C, - 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x45, 0x78, - 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0D, 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x53, 0x53, 0x49, - 0x20, 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x3C, 0x2F, - 0x48, 0x31, 0x3E, 0x0D, 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x68, - 0x65, 0x20, 0x66, 0x6F, 0x6C, 0x6C, 0x6F, 0x77, 0x69, 0x6E, - 0x67, 0x20, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x53, 0x53, 0x49, - 0x20, 0x74, 0x61, 0x67, 0x73, 0x20, 0x65, 0x6D, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x48, 0x54, 0x4D, 0x4C, 0x20, 0x6F, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x65, 0x62, 0x20, 0x70, - 0x61, 0x67, 0x65, 0x2E, 0x20, 0x43, 0x6C, 0x69, 0x65, 0x6E, - 0x74, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0x73, - 0x20, 0x6E, 0x65, 0x76, 0x65, 0x72, 0x20, 0x73, 0x65, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x61, 0x67, - 0x73, 0x2C, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6C, 0x77, 0x49, 0x50, 0x2D, 0x48, 0x54, 0x54, 0x50, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, - 0x6C, 0x61, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6D, - 0x20, 0x6F, 0x6E, 0x2D, 0x74, 0x68, 0x65, 0x2D, 0x66, 0x6C, - 0x79, 0x20, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x20, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x70, 0x61, 0x67, 0x65, 0x2E, 0x20, 0x54, 0x68, 0x65, - 0x73, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, - 0x6C, 0x61, 0x72, 0x20, 0x53, 0x53, 0x49, 0x20, 0x74, 0x61, - 0x67, 0x73, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, - 0x74, 0x6F, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6F, 0x75, 0x73, 0x20, - 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x6C, 0x77, - 0x49, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x20, 0x6C, 0x69, 0x6E, 0x6B, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2E, 0x20, 0x50, - 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x63, 0x6C, 0x69, 0x63, - 0x6B, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, - 0x20, 0x6F, 0x6E, 0x20, 0x79, 0x6F, 0x75, 0x72, 0x20, 0x62, - 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, - 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x72, 0x65, 0x2D, 0x6C, - 0x6F, 0x61, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x69, - 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3A, 0x20, 0x0D, - 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0D, 0x0A, 0x0D, 0x0A, 0x3C, - 0x54, 0x41, 0x42, 0x4C, 0x45, 0x20, 0x73, 0x75, 0x6D, 0x6D, - 0x61, 0x72, 0x79, 0x3D, 0x22, 0x63, 0x67, 0x69, 0x20, 0x65, - 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x20, 0x63, 0x65, - 0x6C, 0x6C, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6E, 0x67, 0x3D, - 0x34, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6E, 0x67, 0x3D, 0x31, 0x20, 0x61, 0x6C, 0x69, 0x67, - 0x6E, 0x3D, 0x22, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x22, - 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6D, - 0x69, 0x64, 0x64, 0x6C, 0x65, 0x22, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x3C, 0x54, 0x52, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, 0x22, 0x3E, 0x0D, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x63, 0x6F, - 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x22, 0x32, 0x22, 0x20, - 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, - 0x66, 0x66, 0x66, 0x66, 0x36, 0x36, 0x22, 0x20, 0x61, 0x6C, - 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x63, 0x65, 0x6E, 0x74, 0x65, - 0x72, 0x22, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x53, 0x53, 0x49, 0x20, 0x45, 0x78, 0x61, 0x6D, 0x70, - 0x6C, 0x65, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, - 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, - 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, - 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x65, - 0x65, 0x65, 0x65, 0x65, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x50, - 0x61, 0x63, 0x6B, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6E, - 0x74, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, - 0x30, 0x70, 0x78, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, - 0x73, 0x5F, 0x78, 0x6D, 0x69, 0x74, 0x2D, 0x2D, 0x3E, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, - 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x65, 0x65, 0x65, - 0x65, 0x65, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x50, 0x61, 0x63, - 0x6B, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, 0x5F, - 0x72, 0x65, 0x63, 0x76, 0x2D, 0x2D, 0x3E, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, 0x43, 0x6F, 0x6C, - 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, - 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x50, 0x61, 0x63, 0x6B, 0x65, - 0x74, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x77, 0x61, 0x72, 0x65, - 0x64, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, 0x5F, 0x66, 0x77, - 0x2D, 0x2D, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, - 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, - 0x20, 0x62, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x3E, 0x3C, 0x54, 0x44, - 0x3E, 0x50, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x73, 0x20, 0x64, - 0x72, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x3A, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, - 0x44, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, - 0x23, 0x73, 0x5F, 0x64, 0x72, 0x6F, 0x70, 0x2D, 0x2D, 0x3E, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x30, 0x65, - 0x30, 0x65, 0x30, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x43, 0x68, - 0x65, 0x63, 0x6B, 0x73, 0x75, 0x6D, 0x20, 0x65, 0x72, 0x72, - 0x6F, 0x72, 0x73, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, 0x5F, - 0x63, 0x68, 0x6B, 0x65, 0x72, 0x72, 0x2D, 0x2D, 0x3E, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, - 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x65, 0x65, 0x65, - 0x65, 0x65, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x50, 0x61, 0x63, - 0x6B, 0x65, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x69, 0x6E, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x6C, 0x65, - 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, - 0x5F, 0x6C, 0x65, 0x6E, 0x65, 0x72, 0x72, 0x2D, 0x2D, 0x3E, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x30, 0x65, - 0x30, 0x65, 0x30, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x4D, 0x65, - 0x6D, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, - 0x73, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, 0x5F, 0x6D, 0x65, - 0x6D, 0x65, 0x72, 0x72, 0x2D, 0x2D, 0x3E, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, - 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, 0x43, 0x6F, 0x6C, - 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x52, 0x6F, 0x75, 0x74, 0x69, - 0x6E, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x73, 0x3A, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, - 0x21, 0x2D, 0x2D, 0x23, 0x73, 0x5F, 0x72, 0x74, 0x65, 0x72, - 0x72, 0x2D, 0x2D, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, - 0x2F, 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, - 0x52, 0x20, 0x62, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, - 0x23, 0x65, 0x30, 0x65, 0x30, 0x65, 0x30, 0x3E, 0x3C, 0x54, - 0x44, 0x3E, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, - 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x73, 0x3A, 0x3C, 0x2F, - 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, - 0x2D, 0x23, 0x73, 0x5F, 0x70, 0x72, 0x6F, 0x65, 0x72, 0x72, - 0x2D, 0x2D, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, - 0x54, 0x52, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, - 0x20, 0x62, 0x67, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x3E, 0x3C, 0x54, 0x44, - 0x3E, 0x4F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x65, 0x72, - 0x72, 0x6F, 0x72, 0x73, 0x3A, 0x3C, 0x2F, 0x54, 0x44, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x21, 0x2D, 0x2D, 0x23, 0x73, - 0x5F, 0x6F, 0x70, 0x74, 0x65, 0x72, 0x72, 0x2D, 0x2D, 0x3E, - 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, 0x3E, - 0x0D, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x20, 0x62, 0x67, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x23, 0x65, 0x30, 0x65, - 0x30, 0x65, 0x30, 0x3E, 0x3C, 0x54, 0x44, 0x3E, 0x4D, 0x69, - 0x73, 0x63, 0x61, 0x6C, 0x6C, 0x61, 0x6E, 0x65, 0x6F, 0x75, - 0x73, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x73, 0x3A, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x54, 0x44, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, - 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3E, 0x3C, 0x21, - 0x2D, 0x2D, 0x23, 0x73, 0x5F, 0x65, 0x72, 0x72, 0x2D, 0x2D, - 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x3C, 0x2F, 0x54, 0x52, - 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x3E, 0x0D, 0x0A, 0x3C, 0x62, 0x72, 0x20, 0x2F, 0x3E, 0x0D, - 0x0A, 0x3C, 0x50, 0x3E, 0x3C, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x4E, 0x4F, 0x54, 0x45, 0x3A, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x77, 0x65, 0x62, 0x70, 0x61, 0x67, 0x65, 0x20, 0x6C, - 0x6F, 0x61, 0x64, 0x73, 0x20, 0x6D, 0x75, 0x63, 0x68, 0x20, - 0x73, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6F, 0x74, 0x68, 0x65, - 0x72, 0x73, 0x2C, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x20, 0x69, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, - 0x69, 0x6E, 0x73, 0x20, 0x31, 0x32, 0x20, 0x53, 0x53, 0x49, - 0x20, 0x74, 0x61, 0x67, 0x73, 0x2C, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x74, 0x61, 0x67, 0x20, - 0x69, 0x73, 0x20, 0x73, 0x65, 0x6E, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x65, 0x20, 0x54, 0x43, 0x50, 0x2F, 0x49, 0x50, 0x20, 0x70, - 0x61, 0x63, 0x6B, 0x65, 0x74, 0x2E, 0x20, 0x20, 0x0D, 0x0A, - 0x3C, 0x2F, 0x50, 0x3E, 0x0D, 0x0A, 0x3C, 0x62, 0x72, 0x20, - 0x2F, 0x3E, 0x0D, 0x0A, 0x0D, 0x0A, 0x3C, 0x64, 0x69, 0x76, - 0x20, 0x69, 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, - 0x72, 0x22, 0x3E, 0x0D, 0x0A, 0x3C, 0x70, 0x3E, 0x26, 0x63, - 0x6F, 0x70, 0x79, 0x3B, 0x20, 0x32, 0x30, 0x30, 0x32, 0x2D, - 0x32, 0x30, 0x31, 0x30, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, - 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x31, 0x30, 0x33, - 0x20, 0x43, 0x6F, 0x62, 0x62, 0x6C, 0x65, 0x20, 0x52, 0x69, - 0x64, 0x67, 0x65, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x2C, - 0x20, 0x43, 0x68, 0x61, 0x70, 0x65, 0x6C, 0x20, 0x48, 0x69, - 0x6C, 0x6C, 0x2C, 0x20, 0x4E, 0x43, 0x20, 0x32, 0x37, 0x35, - 0x31, 0x36, 0x2C, 0x20, 0x55, 0x53, 0x41, 0x3C, 0x62, 0x72, - 0x20, 0x2F, 0x3E, 0x0A, 0x54, 0x6F, 0x6C, 0x6C, 0x2D, 0x66, - 0x72, 0x65, 0x65, 0x3A, 0x20, 0x38, 0x36, 0x36, 0x2E, 0x34, - 0x35, 0x30, 0x2E, 0x4C, 0x45, 0x41, 0x50, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, 0x33, 0x36, 0x30, 0x2E, - 0x35, 0x36, 0x36, 0x38, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x46, 0x61, 0x78, 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, - 0x38, 0x36, 0x39, 0x2E, 0x32, 0x39, 0x39, 0x38, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x61, 0x20, 0x68, 0x72, - 0x65, 0x66, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, - 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, 0x61, 0x6E, - 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, 0x73, 0x2E, - 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, - 0x71, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, - 0x61, 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x61, - 0x3E, 0x3C, 0x2F, 0x70, 0x3E, 0x0A, 0x3C, 0x2F, 0x64, 0x69, - 0x76, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, 0x22, 0x20, - 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x0D, 0x0A, 0x3C, 0x2F, 0x42, - 0x4F, 0x44, 0x59, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x48, 0x54, - 0x4D, 0x4C, 0x3E, 0x0D, 0x0A -}; - -struct fsdata_file const file_ssi_demo_shtm[] = { - { - file_index_htm, - data_ssi_demo_shtm, - data_ssi_demo_shtm + 15, - sizeof(data_ssi_demo_shtm) - 15 - } -}; - -/* /style.css */ -static unsigned char const data_style_css[] = { - /* name: */ - 0x2F, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2E, 0x63, 0x73, 0x73 , 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x63, 0x73, 0x73, 0x0D, - 0x0A, 0x0D, 0x0A, - /* data: */ - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x7B, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3A, 0x31, 0x30, 0x30, 0x25, 0x3B, 0x7D, 0x0A, - 0x2F, 0x2A, 0x20, 0x66, 0x69, 0x78, 0x20, 0x73, 0x63, 0x72, - 0x6F, 0x6C, 0x6C, 0x62, 0x61, 0x72, 0x20, 0x74, 0x6F, 0x20, - 0x61, 0x6C, 0x77, 0x61, 0x79, 0x73, 0x20, 0x73, 0x63, 0x72, - 0x6F, 0x6C, 0x6C, 0x20, 0x2A, 0x2F, 0x0A, 0x68, 0x74, 0x6D, - 0x6C, 0x20, 0x7B, 0x6F, 0x76, 0x65, 0x72, 0x66, 0x6C, 0x6F, - 0x77, 0x2D, 0x59, 0x3A, 0x20, 0x73, 0x63, 0x72, 0x6F, 0x6C, - 0x6C, 0x3B, 0x20, 0x7D, 0x0A, 0x62, 0x6F, 0x64, 0x79, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x67, 0x72, - 0x6F, 0x75, 0x6E, 0x64, 0x2D, 0x63, 0x6F, 0x6C, 0x6F, 0x72, - 0x3A, 0x23, 0x66, 0x66, 0x66, 0x3B, 0x0A, 0x20, 0x20, 0x66, - 0x6F, 0x6E, 0x74, 0x2D, 0x66, 0x61, 0x6D, 0x69, 0x6C, 0x79, - 0x3A, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6C, 0x2C, 0x20, 0x48, - 0x65, 0x6C, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2C, 0x20, - 0x73, 0x61, 0x6E, 0x73, 0x2D, 0x73, 0x65, 0x72, 0x69, 0x66, - 0x3B, 0x0A, 0x20, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, - 0x69, 0x7A, 0x65, 0x3A, 0x31, 0x32, 0x70, 0x78, 0x3B, 0x0A, - 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, - 0x36, 0x36, 0x36, 0x3B, 0x0A, 0x20, 0x20, 0x6D, 0x61, 0x72, - 0x67, 0x69, 0x6E, 0x3A, 0x31, 0x35, 0x70, 0x78, 0x3B, 0x0A, - 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A, - 0x30, 0x3B, 0x0A, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2D, - 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3A, 0x20, 0x6C, 0x65, 0x66, - 0x74, 0x3B, 0x0A, 0x7D, 0x0A, 0x0A, 0x70, 0x20, 0x7B, 0x6D, - 0x61, 0x72, 0x67, 0x69, 0x6E, 0x2D, 0x62, 0x6F, 0x74, 0x74, - 0x6F, 0x6D, 0x3A, 0x20, 0x36, 0x70, 0x78, 0x3B, 0x7D, 0x0A, - 0x69, 0x6D, 0x67, 0x20, 0x7B, 0x62, 0x6F, 0x72, 0x64, 0x65, - 0x72, 0x3A, 0x6E, 0x6F, 0x6E, 0x65, 0x3B, 0x7D, 0x0A, 0x68, - 0x31, 0x20, 0x7B, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, - 0x7A, 0x65, 0x3A, 0x32, 0x32, 0x70, 0x78, 0x3B, 0x20, 0x66, - 0x6F, 0x6E, 0x74, 0x2D, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3A, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x3B, 0x20, 0x63, - 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x23, 0x30, 0x30, 0x30, 0x30, - 0x39, 0x39, 0x3B, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, - 0x67, 0x3A, 0x31, 0x30, 0x70, 0x78, 0x20, 0x30, 0x20, 0x30, - 0x70, 0x78, 0x20, 0x30, 0x3B, 0x7D, 0x0A, 0x68, 0x32, 0x20, - 0x7B, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, - 0x3A, 0x31, 0x38, 0x70, 0x78, 0x3B, 0x20, 0x66, 0x6F, 0x6E, - 0x74, 0x2D, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x6E, - 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x3B, 0x20, 0x63, 0x6F, 0x6C, - 0x6F, 0x72, 0x3A, 0x23, 0x30, 0x30, 0x30, 0x30, 0x39, 0x39, - 0x3B, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A, - 0x31, 0x30, 0x70, 0x78, 0x20, 0x30, 0x20, 0x30, 0x70, 0x78, - 0x20, 0x30, 0x3B, 0x7D, 0x0A, 0x68, 0x33, 0x20, 0x7B, 0x66, - 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A, 0x31, - 0x34, 0x70, 0x78, 0x3B, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x62, 0x6F, 0x6C, - 0x64, 0x3B, 0x20, 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, - 0x3A, 0x23, 0x30, 0x30, 0x30, 0x30, 0x39, 0x39, 0x3B, 0x20, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A, 0x31, 0x30, - 0x70, 0x78, 0x20, 0x30, 0x20, 0x30, 0x70, 0x78, 0x20, 0x30, - 0x3B, 0x7D, 0x0A, 0x75, 0x6C, 0x20, 0x7B, 0x6C, 0x69, 0x73, - 0x74, 0x2D, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2D, 0x70, 0x6F, - 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x6F, 0x75, 0x74, - 0x73, 0x69, 0x64, 0x65, 0x3B, 0x20, 0x6D, 0x61, 0x72, 0x67, - 0x69, 0x6E, 0x2D, 0x6C, 0x65, 0x66, 0x74, 0x3A, 0x32, 0x30, - 0x70, 0x78, 0x3B, 0x7D, 0x0A, 0x6F, 0x6C, 0x20, 0x7B, 0x6C, - 0x69, 0x73, 0x74, 0x2D, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2D, - 0x70, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x6F, - 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x3B, 0x20, 0x6D, 0x61, - 0x72, 0x67, 0x69, 0x6E, 0x2D, 0x6C, 0x65, 0x66, 0x74, 0x3A, - 0x32, 0x30, 0x70, 0x78, 0x3B, 0x7D, 0x0D, 0x0A, 0x73, 0x74, - 0x72, 0x6F, 0x6E, 0x67, 0x20, 0x7B, 0x66, 0x6F, 0x6E, 0x74, - 0x2D, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x62, 0x6F, - 0x6C, 0x64, 0x3B, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, - 0x23, 0x30, 0x30, 0x39, 0x3B, 0x20, 0x7D, 0x0A, 0x0D, 0x0A, - 0x23, 0x6D, 0x65, 0x6E, 0x75, 0x20, 0x7B, 0x63, 0x6F, 0x6C, - 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3B, 0x20, - 0x7D, 0x0A, 0x23, 0x6D, 0x65, 0x6E, 0x75, 0x20, 0x61, 0x20, - 0x7B, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x66, - 0x66, 0x66, 0x3B, 0x20, 0x7D, 0x0A, 0x23, 0x66, 0x6F, 0x6F, - 0x74, 0x65, 0x72, 0x20, 0x7B, 0x6D, 0x61, 0x72, 0x67, 0x69, - 0x6E, 0x3A, 0x30, 0x20, 0x61, 0x75, 0x74, 0x6F, 0x3B, 0x20, - 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2D, 0x74, 0x6F, - 0x70, 0x3A, 0x31, 0x70, 0x78, 0x3B, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2D, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3A, 0x63, 0x65, - 0x6E, 0x74, 0x65, 0x72, 0x3B, 0x20, 0x62, 0x61, 0x63, 0x6B, - 0x67, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x3A, 0x75, 0x72, 0x6C, - 0x28, 0x62, 0x67, 0x5F, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, - 0x2E, 0x67, 0x69, 0x66, 0x29, 0x20, 0x6E, 0x6F, 0x2D, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x20, 0x74, 0x6F, 0x70, 0x20, - 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x3B, 0x7D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x23, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, - 0x20, 0x70, 0x20, 0x7B, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x31, 0x38, 0x70, 0x78, - 0x3B, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, - 0x65, 0x3A, 0x31, 0x31, 0x70, 0x78, 0x3B, 0x7D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x23, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, - 0x20, 0x70, 0x20, 0x61, 0x20, 0x7B, 0x63, 0x6F, 0x6C, 0x6F, - 0x72, 0x3A, 0x20, 0x23, 0x36, 0x36, 0x36, 0x3B, 0x7D, 0x0A -}; - -struct fsdata_file const file_style_css[] = { - { - file_ssi_demo_shtm, - data_style_css, - data_style_css + 11, - sizeof(data_style_css) - 11 - } -}; - -/* /thank_you.htm */ -static unsigned char const data_thank_you_htm[] = { - /* name: */ - 0x2F, 0x74, 0x68, 0x61, 0x6E, 0x6B, 0x5F, 0x79, 0x6F, 0x75, - 0x2E, 0x68, 0x74, 0x6D, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0A, 0x3C, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0A, 0x3C, - 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x3C, 0x4D, 0x45, 0x54, - 0x41, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2D, 0x45, 0x51, 0x55, - 0x49, 0x56, 0x3D, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, - 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x3D, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3B, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x3D, 0x49, 0x53, 0x4F, 0x2D, 0x38, - 0x38, 0x36, 0x39, 0x2D, 0x31, 0x22, 0x3E, 0x0A, 0x3C, 0x54, - 0x49, 0x54, 0x4C, 0x45, 0x3E, 0x51, 0x50, 0x2F, 0x6C, 0x77, - 0x49, 0x50, 0x2D, 0x2D, 0x54, 0x61, 0x68, 0x6E, 0x6B, 0x20, - 0x59, 0x6F, 0x75, 0x3C, 0x2F, 0x54, 0x49, 0x54, 0x4C, 0x45, - 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, 0x68, 0x72, - 0x65, 0x66, 0x3D, 0x22, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2E, - 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, - 0x74, 0x65, 0x78, 0x74, 0x2F, 0x63, 0x73, 0x73, 0x20, 0x72, - 0x65, 0x6C, 0x3D, 0x53, 0x74, 0x79, 0x6C, 0x65, 0x73, 0x68, - 0x65, 0x65, 0x74, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, - 0x20, 0x72, 0x65, 0x6C, 0x3D, 0x22, 0x69, 0x63, 0x6F, 0x6E, - 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x69, 0x6D, - 0x67, 0x2F, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6F, 0x6E, 0x2E, - 0x69, 0x63, 0x6F, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x69, - 0x63, 0x6F, 0x6E, 0x22, 0x20, 0x2F, 0x3E, 0x0A, 0x3C, 0x2F, - 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x0A, 0x3C, 0x42, 0x4F, - 0x44, 0x59, 0x3E, 0x0A, 0x3C, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x53, 0x70, 0x61, 0x63, 0x69, - 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x50, - 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, 0x25, - 0x22, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, - 0x30, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, - 0x64, 0x3D, 0x6D, 0x61, 0x73, 0x74, 0x68, 0x65, 0x61, 0x64, - 0x20, 0x6E, 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, - 0x69, 0x67, 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x3E, 0x3C, - 0x41, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x3C, 0x49, - 0x4D, 0x47, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x72, 0x63, 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, - 0x67, 0x6F, 0x5F, 0x71, 0x6C, 0x2E, 0x6A, 0x70, 0x67, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x74, - 0x6C, 0x65, 0x3D, 0x22, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, - 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, - 0x69, 0x6E, 0x6E, 0x6F, 0x76, 0x61, 0x74, 0x69, 0x6E, 0x67, - 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, - 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, - 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, 0x6E, 0x6F, - 0x76, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6D, 0x62, - 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6E, 0x67, 0x2D, 0x62, 0x6F, 0x74, 0x74, - 0x6F, 0x6D, 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x3C, - 0x2F, 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, - 0x44, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, - 0x30, 0x30, 0x25, 0x22, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x6E, - 0x6F, 0x77, 0x72, 0x61, 0x70, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x42, 0x3E, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, - 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x2C, 0x20, 0x4C, - 0x4C, 0x43, 0x3C, 0x2F, 0x42, 0x3E, 0x3C, 0x62, 0x72, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, - 0x45, 0x46, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, - 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, - 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x77, - 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, - 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, - 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x52, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x6D, 0x65, 0x6E, 0x75, 0x22, 0x20, 0x63, 0x6F, - 0x6C, 0x73, 0x70, 0x61, 0x6E, 0x3D, 0x22, 0x33, 0x22, 0x20, - 0x6E, 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, - 0x67, 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x62, 0x67, - 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x30, 0x30, - 0x30, 0x30, 0x39, 0x39, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x3D, 0x22, 0x32, 0x35, 0x22, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x42, 0x49, 0x47, 0x3E, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, - 0x22, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, - 0x22, 0x3E, 0x48, 0x4F, 0x4D, 0x45, 0x3C, 0x2F, 0x41, 0x3E, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x73, 0x73, 0x69, - 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, 0x74, 0x6D, - 0x22, 0x3E, 0x53, 0x53, 0x49, 0x20, 0x44, 0x45, 0x4D, 0x4F, - 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, - 0x22, 0x63, 0x67, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, - 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x43, 0x47, 0x49, 0x20, 0x44, - 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, - 0x7C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, 0x52, - 0x45, 0x46, 0x3D, 0x22, 0x75, 0x64, 0x70, 0x5F, 0x64, 0x65, - 0x6D, 0x6F, 0x2E, 0x68, 0x74, 0x6D, 0x22, 0x3E, 0x55, 0x44, - 0x50, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x41, 0x3E, - 0x3C, 0x2F, 0x42, 0x49, 0x47, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, - 0x2F, 0x54, 0x52, 0x3E, 0x0A, 0x3C, 0x2F, 0x54, 0x41, 0x42, - 0x4C, 0x45, 0x3E, 0x0A, 0x0A, 0x3C, 0x21, 0x2D, 0x2D, 0x20, - 0x20, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x5F, 0x43, 0x4F, 0x4E, - 0x54, 0x45, 0x4E, 0x54, 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x3C, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, - 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, - 0x70, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, - 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, - 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, - 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x5F, 0x6C, 0x77, - 0x69, 0x70, 0x5F, 0x71, 0x70, 0x2E, 0x6A, 0x70, 0x67, 0x22, - 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x51, 0x50, 0x2D, 0x6C, - 0x77, 0x49, 0x50, 0x22, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, - 0x72, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6C, 0x69, 0x67, - 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, - 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, 0x31, 0x30, - 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, - 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, 0x0A, 0x3C, - 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x54, 0x68, - 0x61, 0x6E, 0x6B, 0x73, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, - 0x0A, 0x3C, 0x48, 0x31, 0x3E, 0x54, 0x68, 0x61, 0x6E, 0x6B, - 0x20, 0x59, 0x6F, 0x75, 0x2C, 0x20, 0x49, 0x74, 0x20, 0x57, - 0x6F, 0x72, 0x6B, 0x65, 0x64, 0x21, 0x3C, 0x2F, 0x48, 0x31, - 0x3E, 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x59, 0x6F, 0x75, 0x72, - 0x20, 0x43, 0x47, 0x49, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, - 0x6E, 0x20, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x2E, 0x20, 0x59, 0x6F, 0x75, 0x20, 0x73, 0x68, 0x6F, - 0x75, 0x6C, 0x64, 0x20, 0x73, 0x65, 0x65, 0x20, 0x79, 0x6F, - 0x75, 0x72, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6F, 0x6E, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, - 0x6E, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6F, 0x61, 0x72, - 0x64, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x3C, 0x62, 0x72, - 0x3E, 0x0A, 0x3C, 0x62, 0x72, 0x20, 0x2F, 0x3E, 0x0A, 0x0A, - 0x3C, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x66, - 0x6F, 0x6F, 0x74, 0x65, 0x72, 0x22, 0x3E, 0x0A, 0x3C, 0x70, - 0x3E, 0x26, 0x63, 0x6F, 0x70, 0x79, 0x3B, 0x20, 0x32, 0x30, - 0x30, 0x32, 0x2D, 0x32, 0x30, 0x31, 0x31, 0x20, 0x51, 0x75, - 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, - 0x73, 0x20, 0x2D, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x31, 0x30, 0x33, 0x20, 0x43, 0x6F, 0x62, 0x62, 0x6C, 0x65, - 0x20, 0x52, 0x69, 0x64, 0x67, 0x65, 0x20, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x2C, 0x20, 0x43, 0x68, 0x61, 0x70, 0x65, 0x6C, - 0x20, 0x48, 0x69, 0x6C, 0x6C, 0x2C, 0x20, 0x4E, 0x43, 0x20, - 0x32, 0x37, 0x35, 0x31, 0x36, 0x2C, 0x20, 0x55, 0x53, 0x41, - 0x3C, 0x62, 0x72, 0x20, 0x2F, 0x3E, 0x0A, 0x54, 0x6F, 0x6C, - 0x6C, 0x2D, 0x66, 0x72, 0x65, 0x65, 0x3A, 0x20, 0x38, 0x36, - 0x36, 0x2E, 0x34, 0x35, 0x30, 0x2E, 0x4C, 0x45, 0x41, 0x50, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, 0x33, - 0x36, 0x30, 0x2E, 0x35, 0x36, 0x36, 0x38, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x46, 0x61, 0x78, 0x3A, 0x20, 0x39, - 0x31, 0x39, 0x2E, 0x38, 0x36, 0x39, 0x2E, 0x32, 0x39, 0x39, - 0x38, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x61, - 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x6D, 0x61, 0x69, - 0x6C, 0x74, 0x6F, 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, - 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, - 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, - 0x66, 0x6F, 0x40, 0x71, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, - 0x2D, 0x6C, 0x65, 0x61, 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, - 0x3C, 0x2F, 0x61, 0x3E, 0x3C, 0x2F, 0x70, 0x3E, 0x0A, 0x3C, - 0x2F, 0x64, 0x69, 0x76, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, - 0x20, 0x69, 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, - 0x72, 0x22, 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x0A, 0x3C, 0x2F, - 0x42, 0x4F, 0x44, 0x59, 0x3E, 0x0A, 0x3C, 0x2F, 0x48, 0x54, - 0x4D, 0x4C, 0x3E, 0x0A -}; - -struct fsdata_file const file_thank_you_htm[] = { - { - file_style_css, - data_thank_you_htm, - data_thank_you_htm + 15, - sizeof(data_thank_you_htm) - 15 - } -}; - -/* /udp_demo.htm */ -static unsigned char const data_udp_demo_htm[] = { - /* name: */ - 0x2F, 0x75, 0x64, 0x70, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, - 0x68, 0x74, 0x6D, 0x00, - /* HTTP header: */ - 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, - 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x3A, 0x20, 0x51, 0x4C, 0x20, 0x28, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, - 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, - 0x0D, 0x0A, 0x0D, 0x0A, - /* data: */ - 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, - 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, - 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, - 0x2F, 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4D, 0x4C, - 0x20, 0x31, 0x2E, 0x30, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, - 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, - 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x78, 0x68, 0x74, 0x6D, 0x6C, - 0x31, 0x2F, 0x44, 0x54, 0x44, 0x2F, 0x78, 0x68, 0x74, 0x6D, - 0x6C, 0x31, 0x2D, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x69, 0x74, - 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2E, 0x64, 0x74, 0x64, 0x22, - 0x3E, 0x0A, 0x3C, 0x48, 0x54, 0x4D, 0x4C, 0x3E, 0x0A, 0x3C, - 0x48, 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x3C, 0x4D, 0x45, 0x54, - 0x41, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2D, 0x45, 0x51, 0x55, - 0x49, 0x56, 0x3D, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, - 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x3D, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3B, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x3D, 0x49, 0x53, 0x4F, 0x2D, 0x38, - 0x38, 0x36, 0x39, 0x2D, 0x31, 0x22, 0x3E, 0x0A, 0x3C, 0x54, - 0x49, 0x54, 0x4C, 0x45, 0x3E, 0x51, 0x50, 0x2F, 0x6C, 0x77, - 0x49, 0x50, 0x2D, 0x2D, 0x55, 0x44, 0x50, 0x20, 0x44, 0x65, - 0x6D, 0x6F, 0x3C, 0x2F, 0x54, 0x49, 0x54, 0x4C, 0x45, 0x3E, - 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, 0x68, 0x72, 0x65, - 0x66, 0x3D, 0x22, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x2E, 0x63, - 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x74, - 0x65, 0x78, 0x74, 0x2F, 0x63, 0x73, 0x73, 0x20, 0x72, 0x65, - 0x6C, 0x3D, 0x53, 0x74, 0x79, 0x6C, 0x65, 0x73, 0x68, 0x65, - 0x65, 0x74, 0x3E, 0x0A, 0x3C, 0x4C, 0x49, 0x4E, 0x4B, 0x20, - 0x72, 0x65, 0x6C, 0x3D, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x22, - 0x20, 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x69, 0x6D, 0x67, - 0x2F, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x69, - 0x63, 0x6F, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, - 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x69, 0x63, - 0x6F, 0x6E, 0x22, 0x20, 0x2F, 0x3E, 0x0A, 0x3C, 0x2F, 0x48, - 0x45, 0x41, 0x44, 0x3E, 0x0A, 0x0A, 0x3C, 0x42, 0x4F, 0x44, - 0x59, 0x3E, 0x0A, 0x3C, 0x41, 0x20, 0x4E, 0x41, 0x4D, 0x45, - 0x3D, 0x22, 0x54, 0x6F, 0x70, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0A, 0x3C, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x20, 0x63, - 0x65, 0x6C, 0x6C, 0x53, 0x70, 0x61, 0x63, 0x69, 0x6E, 0x67, - 0x3D, 0x30, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x50, 0x61, 0x64, - 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x30, 0x20, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x20, - 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, 0x3D, - 0x6D, 0x61, 0x73, 0x74, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6E, - 0x6F, 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, 0x67, - 0x6E, 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x3E, 0x3C, 0x41, 0x20, - 0x68, 0x72, 0x65, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x3C, 0x49, 0x4D, 0x47, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, - 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, - 0x5F, 0x71, 0x6C, 0x2E, 0x6A, 0x70, 0x67, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x74, 0x6C, 0x65, - 0x3D, 0x22, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, - 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, - 0x6E, 0x6F, 0x76, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, - 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, 0x51, 0x75, - 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, - 0x73, 0x20, 0x2D, 0x20, 0x69, 0x6E, 0x6E, 0x6F, 0x76, 0x61, - 0x74, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6D, 0x62, 0x65, 0x64, - 0x64, 0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, - 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, 0x64, 0x64, - 0x69, 0x6E, 0x67, 0x2D, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, - 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x3C, 0x2F, 0x41, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, - 0x25, 0x22, 0x3E, 0x3C, 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x6E, 0x6F, 0x77, - 0x72, 0x61, 0x70, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x42, 0x3E, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, - 0x4C, 0x65, 0x61, 0x70, 0x73, 0x2C, 0x20, 0x4C, 0x4C, 0x43, - 0x3C, 0x2F, 0x42, 0x3E, 0x3C, 0x62, 0x72, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, - 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, 0x6F, 0x3A, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, - 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, 0x41, 0x3E, 0x3C, - 0x62, 0x72, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x41, - 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x77, 0x77, 0x77, - 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, - 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, - 0x41, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, 0x52, 0x3E, - 0x0A, 0x20, 0x20, 0x3C, 0x54, 0x52, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x54, 0x44, 0x20, 0x69, 0x64, 0x3D, 0x22, - 0x6D, 0x65, 0x6E, 0x75, 0x22, 0x20, 0x63, 0x6F, 0x6C, 0x73, - 0x70, 0x61, 0x6E, 0x3D, 0x22, 0x33, 0x22, 0x20, 0x6E, 0x6F, - 0x57, 0x72, 0x61, 0x70, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, - 0x3D, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x62, 0x67, 0x63, 0x6F, - 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x30, 0x30, 0x30, 0x30, - 0x39, 0x39, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x3D, 0x22, 0x32, 0x35, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x42, 0x49, 0x47, 0x3E, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x69, - 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x22, 0x3E, - 0x48, 0x4F, 0x4D, 0x45, 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x20, 0x7C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x41, 0x20, 0x48, - 0x52, 0x45, 0x46, 0x3D, 0x22, 0x73, 0x73, 0x69, 0x5F, 0x64, - 0x65, 0x6D, 0x6F, 0x2E, 0x73, 0x68, 0x74, 0x6D, 0x22, 0x3E, - 0x53, 0x53, 0x49, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, - 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x63, - 0x67, 0x69, 0x5F, 0x64, 0x65, 0x6D, 0x6F, 0x2E, 0x68, 0x74, - 0x6D, 0x22, 0x3E, 0x43, 0x47, 0x49, 0x20, 0x44, 0x45, 0x4D, - 0x4F, 0x3C, 0x2F, 0x41, 0x3E, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x20, 0x7C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x3C, 0x42, 0x3E, 0x55, 0x44, 0x50, 0x20, - 0x44, 0x45, 0x4D, 0x4F, 0x3C, 0x2F, 0x42, 0x3E, 0x3C, 0x2F, - 0x42, 0x49, 0x47, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x54, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x3C, 0x2F, 0x54, - 0x52, 0x3E, 0x0A, 0x3C, 0x2F, 0x54, 0x41, 0x42, 0x4C, 0x45, - 0x3E, 0x0A, 0x0A, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x20, 0x42, - 0x45, 0x47, 0x49, 0x4E, 0x5F, 0x43, 0x4F, 0x4E, 0x54, 0x45, - 0x4E, 0x54, 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x3C, 0x41, 0x20, - 0x4E, 0x41, 0x4D, 0x45, 0x3D, 0x22, 0x45, 0x78, 0x61, 0x6D, - 0x70, 0x6C, 0x65, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, - 0x3C, 0x48, 0x31, 0x3E, 0x55, 0x44, 0x50, 0x20, 0x45, 0x78, - 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x3C, 0x2F, 0x48, 0x31, 0x3E, - 0x0A, 0x0A, 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, - 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, - 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x6C, 0x77, 0x69, 0x70, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, - 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, - 0x22, 0x3E, 0x3C, 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, - 0x3D, 0x22, 0x69, 0x6D, 0x67, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, - 0x5F, 0x6C, 0x77, 0x69, 0x70, 0x5F, 0x71, 0x70, 0x2E, 0x6A, - 0x70, 0x67, 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x51, - 0x50, 0x2D, 0x6C, 0x77, 0x49, 0x50, 0x22, 0x20, 0x62, 0x6F, - 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6C, 0x65, 0x66, 0x74, - 0x22, 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, 0x22, - 0x31, 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x3D, 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, 0x0A, - 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x68, 0x65, 0x20, 0x65, 0x78, - 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6C, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6F, 0x70, - 0x65, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x55, 0x44, 0x50, 0x3C, 0x2F, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x20, 0x63, 0x6F, 0x6E, - 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6F, 0x72, 0x74, 0x20, - 0x37, 0x37, 0x37, 0x2E, 0x20, 0x41, 0x6E, 0x79, 0x20, 0x55, - 0x44, 0x50, 0x20, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x73, - 0x20, 0x73, 0x65, 0x6E, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, - 0x6E, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, - 0x20, 0x61, 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, - 0x6F, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x20, - 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4C, 0x43, 0x44, - 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6C, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6F, 0x6E, 0x64, 0x73, 0x20, 0x62, 0x61, 0x63, - 0x6B, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x65, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x61, 0x20, 0x55, 0x44, 0x50, 0x20, 0x70, 0x61, 0x63, - 0x6B, 0x65, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6F, 0x72, 0x69, 0x67, 0x69, 0x6E, 0x61, 0x6C, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x70, 0x6C, 0x75, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x70, 0x65, - 0x6E, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6E, - 0x63, 0x65, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x2E, - 0x20, 0x4F, 0x62, 0x76, 0x69, 0x6F, 0x75, 0x73, 0x6C, 0x79, - 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6D, 0x70, - 0x6C, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x73, 0x69, 0x6D, - 0x70, 0x6C, 0x69, 0x63, 0x69, 0x74, 0x79, 0x2E, 0x20, 0x49, - 0x6E, 0x20, 0x72, 0x65, 0x61, 0x6C, 0x2D, 0x6C, 0x69, 0x66, - 0x65, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x62, 0x69, 0x6E, 0x61, 0x72, - 0x79, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x20, 0x63, - 0x6F, 0x75, 0x6C, 0x64, 0x20, 0x62, 0x65, 0x20, 0x6D, 0x6F, - 0x72, 0x65, 0x20, 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, - 0x6E, 0x74, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, 0x0A, - 0x3C, 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, - 0x69, 0x6E, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, - 0x69, 0x70, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, - 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, - 0x66, 0x22, 0x20, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, - 0x22, 0x5F, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x3C, - 0x49, 0x4D, 0x47, 0x20, 0x53, 0x52, 0x43, 0x3D, 0x22, 0x69, - 0x6D, 0x67, 0x2F, 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, - 0x6E, 0x64, 0x5F, 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x6A, 0x70, - 0x67, 0x22, 0x20, 0x41, 0x4C, 0x54, 0x3D, 0x22, 0x41, 0x70, - 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x28, 0x31, 0x2E, 0x34, 0x4D, - 0x42, 0x20, 0x50, 0x44, 0x46, 0x29, 0x22, 0x20, 0x62, 0x6F, - 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x61, - 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x20, 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3D, - 0x22, 0x31, 0x30, 0x22, 0x20, 0x76, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x3D, 0x22, 0x35, 0x22, 0x3E, 0x3C, 0x2F, 0x41, 0x3E, - 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x54, 0x6F, 0x20, 0x66, 0x61, - 0x63, 0x69, 0x6C, 0x69, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, - 0x55, 0x44, 0x50, 0x20, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2C, 0x20, 0x61, 0x20, - 0x73, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x63, 0x6F, 0x6E, - 0x73, 0x6F, 0x6C, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x61, 0x6C, - 0x6C, 0x65, 0x64, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, - 0x71, 0x75, 0x64, 0x70, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, - 0x3E, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x57, 0x69, 0x6E, 0x64, - 0x6F, 0x77, 0x73, 0x20, 0x6F, 0x72, 0x20, 0x4C, 0x69, 0x6E, - 0x75, 0x78, 0x20, 0x68, 0x6F, 0x73, 0x74, 0x73, 0x20, 0x69, - 0x73, 0x20, 0x70, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, - 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3C, 0x73, - 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x2D, 0x6C, - 0x77, 0x49, 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, - 0x67, 0x3E, 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, - 0x20, 0x63, 0x6F, 0x64, 0x65, 0x2E, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x66, 0x6F, 0x6C, 0x6C, 0x6F, 0x77, 0x69, 0x6E, 0x67, - 0x20, 0x6C, 0x69, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x73, - 0x68, 0x6F, 0x77, 0x73, 0x20, 0x61, 0x6E, 0x20, 0x65, 0x78, - 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x6F, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x3C, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x71, 0x75, - 0x64, 0x70, 0x3C, 0x2F, 0x43, 0x4F, 0x44, 0x45, 0x3E, 0x20, - 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x69, 0x74, 0x6F, - 0x6E, 0x3A, 0x0A, 0x0A, 0x3C, 0x70, 0x72, 0x65, 0x3E, 0x0A, - 0x43, 0x3A, 0x5C, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, - 0x65, 0x5C, 0x71, 0x70, 0x63, 0x70, 0x70, 0x5C, 0x74, 0x6F, - 0x6F, 0x6C, 0x73, 0x5C, 0x71, 0x75, 0x64, 0x70, 0x5C, 0x77, - 0x69, 0x6E, 0x33, 0x32, 0x5C, 0x76, 0x63, 0x36, 0x3E, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x5C, 0x71, 0x75, 0x64, 0x70, 0x20, - 0x31, 0x39, 0x32, 0x2E, 0x31, 0x36, 0x38, 0x2E, 0x30, 0x2E, - 0x31, 0x30, 0x30, 0x0A, 0x71, 0x75, 0x64, 0x70, 0x20, 0x75, - 0x74, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x28, 0x63, 0x29, - 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x20, 0x4C, - 0x65, 0x61, 0x70, 0x73, 0x2C, 0x20, 0x4C, 0x4C, 0x43, 0x2C, - 0x20, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x0A, 0x4F, 0x70, 0x65, 0x6E, 0x69, 0x6E, 0x67, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x69, - 0x6E, 0x67, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x20, 0x73, - 0x6F, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x61, 0x74, 0x20, 0x70, - 0x6F, 0x72, 0x74, 0x3D, 0x31, 0x37, 0x37, 0x37, 0x2E, 0x2E, - 0x2E, 0x72, 0x65, 0x61, 0x64, 0x79, 0x0A, 0x52, 0x65, 0x6D, - 0x6F, 0x74, 0x65, 0x20, 0x55, 0x44, 0x50, 0x20, 0x63, 0x6F, - 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, - 0x49, 0x50, 0x2D, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x3D, 0x31, 0x39, 0x32, 0x2E, 0x31, 0x36, 0x38, 0x2E, 0x30, - 0x2E, 0x31, 0x30, 0x30, 0x2C, 0x20, 0x70, 0x6F, 0x72, 0x74, - 0x3D, 0x37, 0x37, 0x37, 0x0A, 0x54, 0x79, 0x70, 0x65, 0x20, - 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x28, 0x73, 0x29, - 0x3B, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x45, 0x6E, - 0x74, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x73, 0x65, 0x6E, - 0x64, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x2C, - 0x20, 0x45, 0x53, 0x43, 0x20, 0x74, 0x6F, 0x20, 0x71, 0x75, - 0x69, 0x74, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x0A, 0x53, - 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x3A, 0x20, 0x20, 0x22, - 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x22, 0x0A, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x3A, 0x20, 0x22, 0x48, 0x65, - 0x6C, 0x6C, 0x6F, 0x2D, 0x31, 0x22, 0x0A, 0x48, 0x6F, 0x77, - 0x20, 0x61, 0x72, 0x65, 0x0A, 0x53, 0x65, 0x6E, 0x64, 0x69, - 0x6E, 0x67, 0x3A, 0x20, 0x20, 0x22, 0x48, 0x6F, 0x77, 0x20, - 0x61, 0x72, 0x65, 0x22, 0x0A, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x3A, 0x20, 0x22, 0x48, 0x6F, 0x77, 0x20, - 0x61, 0x72, 0x65, 0x2D, 0x32, 0x22, 0x0A, 0x79, 0x6F, 0x75, - 0x3F, 0x0A, 0x53, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x3A, - 0x20, 0x20, 0x22, 0x79, 0x6F, 0x75, 0x3F, 0x22, 0x0A, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x3A, 0x20, 0x22, - 0x79, 0x6F, 0x75, 0x3F, 0x2D, 0x33, 0x22, 0x0A, 0x44, 0x6F, - 0x6E, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x70, 0x72, 0x65, 0x3E, - 0x0A, 0x0A, 0x3C, 0x50, 0x3E, 0x50, 0x6C, 0x65, 0x61, 0x73, - 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6F, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x51, 0x75, 0x61, 0x6E, 0x74, - 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, 0x41, - 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x3A, 0x20, 0x3C, 0x41, 0x20, - 0x48, 0x52, 0x45, 0x46, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2D, 0x6D, 0x61, 0x63, 0x68, 0x69, 0x6E, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x6C, 0x77, 0x69, 0x70, 0x2F, - 0x41, 0x4E, 0x5F, 0x51, 0x50, 0x5F, 0x61, 0x6E, 0x64, 0x5F, - 0x6C, 0x77, 0x49, 0x50, 0x2E, 0x70, 0x64, 0x66, 0x22, 0x20, - 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x3D, 0x22, 0x5F, 0x62, - 0x6C, 0x61, 0x6E, 0x6B, 0x22, 0x3E, 0x22, 0x51, 0x50, 0x20, - 0x61, 0x6E, 0x64, 0x20, 0x6C, 0x77, 0x49, 0x50, 0x20, 0x54, - 0x43, 0x50, 0x2F, 0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, - 0x6B, 0x22, 0x3C, 0x2F, 0x41, 0x3E, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x4E, 0x6F, 0x74, 0x65, 0x20, - 0x69, 0x6E, 0x20, 0x50, 0x44, 0x46, 0x20, 0x69, 0x73, 0x20, - 0x70, 0x72, 0x6F, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, - 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3C, 0x73, 0x74, 0x72, - 0x6F, 0x6E, 0x67, 0x3E, 0x51, 0x50, 0x2D, 0x6C, 0x77, 0x49, - 0x50, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x6F, 0x6E, 0x67, 0x3E, - 0x20, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x63, - 0x6F, 0x64, 0x65, 0x2E, 0x0A, 0x3C, 0x2F, 0x50, 0x3E, 0x0A, - 0x3C, 0x62, 0x72, 0x20, 0x2F, 0x3E, 0x0A, 0x0A, 0x3C, 0x64, - 0x69, 0x76, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, - 0x74, 0x65, 0x72, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x3E, 0x26, - 0x63, 0x6F, 0x70, 0x79, 0x3B, 0x20, 0x32, 0x30, 0x30, 0x32, - 0x2D, 0x32, 0x30, 0x31, 0x31, 0x20, 0x51, 0x75, 0x61, 0x6E, - 0x74, 0x75, 0x6D, 0x20, 0x4C, 0x65, 0x61, 0x70, 0x73, 0x20, - 0x2D, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, - 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x31, 0x30, - 0x33, 0x20, 0x43, 0x6F, 0x62, 0x62, 0x6C, 0x65, 0x20, 0x52, - 0x69, 0x64, 0x67, 0x65, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x2C, 0x20, 0x43, 0x68, 0x61, 0x70, 0x65, 0x6C, 0x20, 0x48, - 0x69, 0x6C, 0x6C, 0x2C, 0x20, 0x4E, 0x43, 0x20, 0x32, 0x37, - 0x35, 0x31, 0x36, 0x2C, 0x20, 0x55, 0x53, 0x41, 0x3C, 0x62, - 0x72, 0x20, 0x2F, 0x3E, 0x0A, 0x54, 0x6F, 0x6C, 0x6C, 0x2D, - 0x66, 0x72, 0x65, 0x65, 0x3A, 0x20, 0x38, 0x36, 0x36, 0x2E, - 0x34, 0x35, 0x30, 0x2E, 0x4C, 0x45, 0x41, 0x50, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x3A, 0x20, 0x39, 0x31, 0x39, 0x2E, 0x33, 0x36, 0x30, - 0x2E, 0x35, 0x36, 0x36, 0x38, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, - 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, - 0x70, 0x3B, 0x46, 0x61, 0x78, 0x3A, 0x20, 0x39, 0x31, 0x39, - 0x2E, 0x38, 0x36, 0x39, 0x2E, 0x32, 0x39, 0x39, 0x38, 0x26, - 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, - 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x7C, 0x26, 0x6E, - 0x62, 0x73, 0x70, 0x3B, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, - 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x3C, 0x61, 0x20, 0x68, - 0x72, 0x65, 0x66, 0x3D, 0x22, 0x6D, 0x61, 0x69, 0x6C, 0x74, - 0x6F, 0x3A, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x71, 0x75, 0x61, - 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, 0x65, 0x61, 0x70, 0x73, - 0x2E, 0x63, 0x6F, 0x6D, 0x22, 0x3E, 0x69, 0x6E, 0x66, 0x6F, - 0x40, 0x71, 0x75, 0x61, 0x6E, 0x74, 0x75, 0x6D, 0x2D, 0x6C, - 0x65, 0x61, 0x70, 0x73, 0x2E, 0x63, 0x6F, 0x6D, 0x3C, 0x2F, - 0x61, 0x3E, 0x3C, 0x2F, 0x70, 0x3E, 0x0A, 0x3C, 0x2F, 0x64, - 0x69, 0x76, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x69, - 0x64, 0x3D, 0x22, 0x66, 0x6F, 0x6F, 0x74, 0x65, 0x72, 0x22, - 0x20, 0x2D, 0x2D, 0x3E, 0x0A, 0x0A, 0x3C, 0x2F, 0x42, 0x4F, - 0x44, 0x59, 0x3E, 0x0A, 0x3C, 0x2F, 0x48, 0x54, 0x4D, 0x4C, - 0x3E, 0x0A -}; - -struct fsdata_file const file_udp_demo_htm[] = { - { - file_thank_you_htm, - data_udp_demo_htm, - data_udp_demo_htm + 14, - sizeof(data_udp_demo_htm) - 14 - } -}; - -#define FS_ROOT file_udp_demo_htm - -#define FS_NUMFILES 17 diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.c b/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.c deleted file mode 100644 index 17d64efa9..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.c +++ /dev/null @@ -1,116 +0,0 @@ -/***************************************************************************** -* Product: lwIP consolidated file for QP-lwIP integration -* Last Updated for Version: lwIPv1.3.1 / QPv4.1.00 -* Date of the Last Update: Oct 12, 2009 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2009 Quantum Leaps, LLC. All rights reserved. -* -* This software may be distributed and modified under the terms of the GNU -* General Public License version 2 (GPL) as published by the Free Software -* Foundation and appearing in the file GPL.TXT included in the packaging of -* this file. Please note that GPL Section 2[b] requires that all works based -* on this software must also be made publicly available under the terms of -* the GPL ("Copyleft"). -* -* Alternatively, this software may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GPL and are specifically designed for licensees interested in -* retaining the proprietary status of their code. -* -* Contact information: -* Quantum Leaps Web site: http://www.quantum-leaps.com -* e-mail: info@quantum-leaps.com -*****************************************************************************/ -#include "lwip/opt.h" /* lwIP options come first */ -#include "lwip/api.h" -#include "lwip/tcp.h" -#include "lwip/udp.h" -#include "lwip/tcpip.h" -#include "lwip/mem.h" - -/* NOTE: all the following modules contain conditional compilation protection, -* so that code will be actually generated only if the appropriate options are -* set in the lwipopts.h header file included from lwip/opt.h. -*/ - -/* Core lwIP TCP/IP stack ..................................................*/ -#include "core/def.c" -#include "core/dhcp.c" -#include "core/dns.c" -#include "core/init.c" -#include "core/mem.c" -#include "core/memp.c" -#include "core/netif.c" -#include "core/pbuf.c" -#include "core/raw.c" -#include "core/stats.c" -#include "core/sys.c" -#include "core/tcp.c" -#include "core/tcp_in.c" -#include "core/tcp_out.c" -#include "core/timers.c" -#include "core/udp.c" - -/* IPv4 ....................................................................*/ -#include "core/ipv4/autoip.c" -#include "core/ipv4/icmp.c" -#include "core/ipv4/igmp.c" -#include "core/ipv4/inet.c" -#include "core/ipv4/inet_chksum.c" -#include "core/ipv4/ip.c" -#include "core/ipv4/ip_addr.c" -#include "core/ipv4/ip_frag.c" - -/* SNMP ....................................................................*/ -#include "core/snmp/asn1_dec.c" -#include "core/snmp/asn1_enc.c" -#include "core/snmp/mib2.c" -#include "core/snmp/mib_structs.c" -#include "core/snmp/msg_in.c" -#include "core/snmp/msg_out.c" - -/* Ethernet interface ......................................................*/ -#include "netif/etharp.c" -//???#include "netif/loopif.c" - -/* PPP .....................................................................*/ -#if PPP_SUPPORT - #include "netif/ppp/auth.c" - #include "netif/ppp/chap.c" - #include "netif/ppp/chpms.c" - #include "netif/ppp/fsm.c" - #include "netif/ppp/ipcp.c" - #include "netif/ppp/lcp.c" - #include "netif/ppp/magic.c" - #include "netif/ppp/md5.c" - #include "netif/ppp/pap.c" - #include "netif/ppp/ppp.c" - #include "netif/ppp/ppp_oe.c" - #include "netif/ppp/randm.c" - #include "netif/ppp/vj.c" -#endif /* PPP_SUPPORT */ - -/* utilities added by QL ...................................................*/ -/** -* Allocate a transport-layer pbuf and copies the provided data buffer 'data' -* of length 'len' bytes into the payload(s) of the pbuf. The function takes -* care of splitting the data into successive pbuf payloads, if necessary. -* -* The function returns the newly created pbuf or NULL if the pbuf cannot -* be allocated. -*/ -struct pbuf *pbuf_new(u8_t *data, u16_t len) { - struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM); - struct pbuf *q = p; - while ((q != (struct pbuf *)0) && (len >= q->len)) { - memcpy(q->payload, data, q->len); /* copy data into payload */ - len -= q->len; /* remaining length */ - data += q->len; /* remaining data chunk */ - q = q->next; /* get next pbuf */ - } - return p; -} diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.h b/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.h deleted file mode 100644 index 49e041c6c..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwip.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************** -* Product: lwIP consolidated file for QP-lwIP integration -* Last Updated for Version: LwIP 1.4.1/QP 5.1.1 -* Date of the Last Update: Oct 21, 2013 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* Quantum Leaps Web sites: http://www.quantum-leaps.com -* https://state-machine.com -* e-mail: info@quantum-leaps.com -*****************************************************************************/ -#ifndef LWIP_H -#define LWIP_H - -/* protection against including lwIP in unauthorized modules */ -#ifndef LWIP_ALLOWED -#error "The lwIP code is not reentrant and is not allowed in this module." -#endif - -#include "lwip/opt.h" /* lwIP options come first */ -#include "lwip/stats.h" -#include "lwip/tcp.h" -#include "lwip/tcp_impl.h" -#include "lwip/udp.h" -#include "lwip/tcpip.h" -#include "lwip/mem.h" -#include "lwip/autoip.h" -#include "lwip/dhcp.h" - -#include "netif/etharp.h" -#include "netif/eth_driver.h" - -/* utilities added by QL... */ -#ifdef __cplusplus -extern "C" { -#endif - -/** -* Allocate a transport-layer pbuf and copies the provided data buffer 'data' -* of length 'len' bytes into the payload(s) of the pbuf. The function takes -* care of splitting the data into successive pbuf payloads, if necessary. -* -* The function returns the newly created pbuf or NULL if the pbuf cannot -* be allocated. -*/ -struct pbuf *pbuf_new(u8_t *data, u16_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_H */ diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.cpp deleted file mode 100644 index f92797260..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipmgr.cpp +++ /dev/null @@ -1,345 +0,0 @@ -//============================================================================ -// Product: lwIP-Manager Active Object -// Last Updated for Version: 6.8.0 -// Date of the Last Update: 2020-01-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#define LWIP_ALLOWED - -#include "qpcpp.hpp" // QP/C++ API -#include "dpp.hpp" // application events and active objects -#include "bsp.hpp" // Board Support Package - -#include "lwip.h" // lwIP stack -#include "httpd.h" // lwIP application - -#include -#include - -Q_DEFINE_THIS_FILE - -// application signals cannot overlap the device-driver signals -Q_ASSERT_STATIC((LWIP_DRIVER_END - LWIP_DRIVER_GROUP) >= LWIP_MAX_OFFSET); - -#define FLASH_USERREG0 (*(uint32_t const *)0x400FE1E0) -#define FLASH_USERREG1 (*(uint32_t const *)0x400FE1E4) -#define LWIP_SLOW_TICK_MS TCP_TMR_INTERVAL - -// Active object class ------------------------------------------------------- -class LwIPMgr : public QActive { - - QTimeEvt m_te_LWIP_SLOW_TICK; - struct netif *m_netif; - struct udp_pcb *m_upcb; - uint32_t m_ip_addr; // IP address in the native host byte order - -#if LWIP_TCP - uint32_t m_tcp_tmr; -#endif -#if LWIP_ARP - uint32_t m_arp_tmr; -#endif -#if LWIP_DHCP - uint32_t m_dhcp_fine_tmr; - uint32_t m_dhcp_coarse_tmr; -#endif -#if LWIP_AUTOIP - uint32_t m_auto_ip_tmr; -#endif - -public: - LwIPMgr(); // ctor - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(running); -}; - - -// Local objects ------------------------------------------------------------- -static LwIPMgr l_lwIPMgr; // the single instance of LwIPMgr AO - -// Global-scope objects ------------------------------------------------------ -QActive * const AO_LwIPMgr = (QActive *)&l_lwIPMgr; // "opaque" pointer - -// Server-Side Include (SSI) demo ............................................ -static char const * const ssi_tags[] = { - "s_xmit", - "s_recv", - "s_fw", - "s_drop", - "s_chkerr", - "s_lenerr", - "s_memerr", - "s_rterr", - "s_proerr", - "s_opterr", - "s_err", -}; -static int ssi_handler(int iIndex, char *pcInsert, int iInsertLen); - -// Common Gateway Iinterface (CG) demo ....................................... -static char const *cgi_display(int index, int numParams, - char const *param[], - char const *value[]); -static tCGI const cgi_handlers[] = { - { "/display.cgi", &cgi_display }, -}; - -// UDP handler ............................................................... -static void udp_rx_handler(void *arg, struct udp_pcb *upcb, - struct pbuf *p, struct ip_addr *addr, u16_t port); -//............................................................................ -LwIPMgr::LwIPMgr() - : QActive((QStateHandler)&LwIPMgr::initial), - m_te_LWIP_SLOW_TICK(this, LWIP_SLOW_TICK_SIG) -{} -//............................................................................ -Q_STATE_DEF(LwIPMgr, initial) { - unsigned long user0, user1; - uint8_t macaddr[NETIF_MAX_HWADDR_LEN]; - - (void)e; // suppress the compiler warning about unused parameter - - // Configure the hardware MAC address for the Ethernet Controller - // - // For the Stellaris Eval Kits, the MAC address will be stored in the - // non-volatile USER0 and USER1 registers. These registers can be read - // using the FlashUserGet function, as illustrated below. - // - user0 = FLASH_USERREG0; - user1 = FLASH_USERREG1; - // the MAC address must have been programmed! - Q_ASSERT((user0 != 0xFFFFFFFF) && (user1 != 0xFFFFFFFF)); - - // - // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC - // address needed to program the hardware registers, then program the MAC - // address into the Ethernet Controller registers. - // - macaddr[0] = (uint8_t)user0; user0 >>= 8; - macaddr[1] = (uint8_t)user0; user0 >>= 8; - macaddr[2] = (uint8_t)user0; user0 >>= 8; - macaddr[3] = (uint8_t)user1; user1 >>= 8; - macaddr[4] = (uint8_t)user1; user1 >>= 8; - macaddr[5] = (uint8_t)user1; - - // initialize the Ethernet Driver - m_netif = eth_driver_init(this, LWIP_DRIVER_GROUP, macaddr); - - m_ip_addr = 0xFFFFFFFF; // initialize to impossible value - - // initialize the lwIP applications... - httpd_init(); // initialize the simple HTTP-Deamon (web server) - http_set_ssi_handler(&ssi_handler, ssi_tags, Q_DIM(ssi_tags)); - http_set_cgi_handlers(cgi_handlers, Q_DIM(cgi_handlers)); - - m_upcb = udp_new(); - udp_bind(m_upcb, IP_ADDR_ANY, 777); // use port 777 for UDP - udp_recv(m_upcb, &udp_rx_handler, this); - - QS_OBJ_DICTIONARY(&l_lwIPMgr); - QS_OBJ_DICTIONARY(&l_lwIPMgr.m_te_LWIP_SLOW_TICK); - QS_FUN_DICTIONARY(&top); - QS_FUN_DICTIONARY(&initial); - QS_FUN_DICTIONARY(&running); - - QS_SIG_DICTIONARY(SEND_UDP_SIG, this); - QS_SIG_DICTIONARY(LWIP_SLOW_TICK_SIG, this); - QS_SIG_DICTIONARY(LWIP_DRIVER_GROUP + LWIP_RX_READY_OFFSET, this); - QS_SIG_DICTIONARY(LWIP_DRIVER_GROUP + LWIP_TX_READY_OFFSET, this); - QS_SIG_DICTIONARY(LWIP_DRIVER_GROUP + LWIP_RX_OVERRUN_OFFSET, this); - - return tran(&running); -} -//............................................................................ -Q_STATE_DEF(LwIPMgr, running) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_te_LWIP_SLOW_TICK.armX( - (LWIP_SLOW_TICK_MS * BSP_TICKS_PER_SEC) / 1000); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - m_te_LWIP_SLOW_TICK.disarm(); - return Q_RET_HANDLED; - } - - case SEND_UDP_SIG: { - if (m_upcb->remote_port != (uint16_t)0) { - struct pbuf *p = pbuf_new((u8_t *)((TextEvt const *)e)->text, - strlen(((TextEvt const *)e)->text) + 1); - if (p != (struct pbuf *)0) { - udp_send(m_upcb, p); - pbuf_free(p); // don't leak the pbuf! - } - } - return Q_RET_HANDLED; - } - - case LWIP_DRIVER_GROUP + LWIP_RX_READY_OFFSET: { - eth_driver_read(); - return Q_RET_HANDLED; - } - case LWIP_DRIVER_GROUP + LWIP_TX_READY_OFFSET: { - eth_driver_write(); - return Q_RET_HANDLED; - } - case LWIP_SLOW_TICK_SIG: { - if (m_ip_addr != m_netif->ip_addr.addr) { - m_ip_addr = m_netif->ip_addr.addr; // save the IP addr - uint32_t ip_net = ntohl(m_ip_addr);// IP in network order - // publish the text event to display the new IP address - TextEvt *te = Q_NEW(TextEvt, DISPLAY_IPADDR_SIG); - snprintf(te->text, Q_DIM(te->text), "%d.%d.%d.%d", - ((ip_net) >> 24) & 0xFF, - ((ip_net) >> 16) & 0xFF, - ((ip_net) >> 8) & 0xFF, - ip_net & 0xFF); - QF::PUBLISH(te, this); - } - -#if LWIP_TCP - m_tcp_tmr += LWIP_SLOW_TICK_MS; - if (m_tcp_tmr >= TCP_TMR_INTERVAL) { - m_tcp_tmr = 0; - tcp_tmr(); - } -#endif -#if LWIP_ARP - m_arp_tmr += LWIP_SLOW_TICK_MS; - if (m_arp_tmr >= ARP_TMR_INTERVAL) { - m_arp_tmr = 0; - etharp_tmr(); - } -#endif -#if LWIP_DHCP - m_dhcp_fine_tmr += LWIP_SLOW_TICK_MS; - if (m_dhcp_fine_tmr >= DHCP_FINE_TIMER_MSECS) { - m_dhcp_fine_tmr = 0; - dhcp_fine_tmr(); - } - m_dhcp_coarse_tmr += LWIP_SLOW_TICK_MS; - if (m_dhcp_coarse_tmr >= DHCP_COARSE_TIMER_MSECS) { - m_dhcp_coarse_tmr = 0; - dhcp_coarse_tmr(); - } -#endif -#if LWIP_AUTOIP - auto_ip_tmr += LWIP_SLOW_TICK_MS; - if (auto_ip_tmr >= AUTOIP_TMR_INTERVAL) { - auto_ip_tmr = 0; - autoip_tmr(); - } -#endif - return Q_RET_HANDLED; - } - case LWIP_DRIVER_GROUP + LWIP_RX_OVERRUN_OFFSET: { - LINK_STATS_INC(link.err); - return Q_RET_HANDLED; - } - } - return super(&top); -} - -// HTTPD customizations ------------------------------------------------------ - -// Server-Side Include (SSI) handler ......................................... -static int ssi_handler(int iIndex, char *pcInsert, int iInsertLen) { - struct stats_proto *stats = &lwip_stats.link; - STAT_COUNTER value; - - switch (iIndex) { - case 0: // s_xmit - value = stats->xmit; - break; - case 1: // s_recv - value = stats->recv; - break; - case 2: // s_fw - value = stats->fw; - break; - case 3: // s_drop - value = stats->drop; - break; - case 4: // s_chkerr - value = stats->chkerr; - break; - case 5: // s_lenerr - value = stats->lenerr; - break; - case 6: // s_memerr - value = stats->memerr; - break; - case 7: // s_rterr - value = stats->rterr; - break; - case 8: // s_proerr - value = stats->proterr; - break; - case 9: // s_opterr - value = stats->opterr; - break; - case 10: // s_err - value = stats->err; - break; - } - - return snprintf(pcInsert, MAX_TAG_INSERT_LEN, "%d", value); -} - -// Common Gateway Iinterface (CG) handler .................................... -static char const *cgi_display(int index, int numParams, - char const *param[], - char const *value[]) -{ - for (int i = 0; i < numParams; ++i) { - if (strstr(param[i], "text") != (char *)0) { // param text found? - TextEvt *te = Q_NEW(TextEvt, DISPLAY_CGI_SIG); - strncpy(te->text, value[i], Q_DIM(te->text)); - QF::PUBLISH((QEvt *)te, AO_LwIPMgr); - return "/thank_you.htm"; - } - } - return (char *)0; // no URI, HTTPD will send 404 error page to the browser -} - -// UDP receive handler ------------------------------------------------------- -static void udp_rx_handler(void *arg, struct udp_pcb *upcb, - struct pbuf *p, struct ip_addr *addr, u16_t port) -{ - TextEvt *te = Q_NEW(TextEvt, DISPLAY_UDP_SIG); - strncpy(te->text, (char *)p->payload, Q_DIM(te->text)); - QF::PUBLISH(te, AO_LwIPMgr); - - udp_connect(upcb, addr, port); // connect to the remote host - pbuf_free(p); // don't leak the pbuf! -} - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipopts.h b/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipopts.h deleted file mode 100644 index a457a592f..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/lwipopts.h +++ /dev/null @@ -1,489 +0,0 @@ -/***************************************************************************** -* Product: lwIP options for the LM3S6965 evaluaiton board -* Last Updated for lwIP Version: 1.4.0.rc2 -* Date of the Last Update: Feb 10, 2011 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2011 Quantum Leaps, LLC. All rights reserved. -* -* This software may be distributed and modified under the terms of the GNU -* General Public License version 2 (GPL) as published by the Free Software -* Foundation and appearing in the file GPL.TXT included in the packaging of -* this file. Please note that GPL Section 2[b] requires that all works based -* on this software must also be made publicly available under the terms of -* the GPL ("Copyleft"). -* -* Alternatively, this software may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GPL and are specifically designed for licensees interested in -* retaining the proprietary status of their code. -* -* Contact information: -* Quantum Leaps Web site: http://www.quantum-leaps.com -* e-mail: info@quantum-leaps.com -*****************************************************************************/ -/* -* NOTE: This file has been derived from the lwip/src/include/lwip/opt.h -* header file. For additional details, refer to the original "opt.h" file -* and lwIP documentation. -*/ -#ifndef __LWIPOPTS_H__ -#define __LWIPOPTS_H__ - -//============================================================================ -// -// -------------- Static IPv4 addresses ---------------- -// (relevant only when DHCP or AUTOIP are NOT configured -// -//============================================================================ - // the default IP address of the host... -#define STATIC_IPADDR0 192 -#define STATIC_IPADDR1 168 -#define STATIC_IPADDR2 0 -#define STATIC_IPADDR3 100 - // the default network mask... -#define STATIC_NET_MASK0 255 -#define STATIC_NET_MASK1 255 -#define STATIC_NET_MASK2 255 -#define STATIC_NET_MASK3 0 - // the default gateway IP address... -#define STATIC_GW_IPADDR0 0 -#define STATIC_GW_IPADDR1 0 -#define STATIC_GW_IPADDR2 0 -#define STATIC_GW_IPADDR3 0 - -//============================================================================ -// -// ---------------- lwIP Port Options ---------- -// -//============================================================================ -//#define HOST_TMR_INTERVAL -//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) -//#define TX_PBUF_QUEUE_LEN 8 - -//============================================================================ -// -// ---------- Platform specific locking ---------- -// -//============================================================================ -//#define SYS_LIGHTWEIGHT_PROT 0 -#define NO_SYS 1 // default is 0 -//#define NO_SYS_NO_TIMERS 0 -//#define MEMCPY(dst,src,len) memcpy(dst,src,len) -//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) - -//============================================================================ -// -// ---------------- HTTPD Options ---------- -// -//============================================================================ -#define INCLUDE_HTTPD_SSI -#define INCLUDE_HTTPD_CGI -//#define DYNAMIC_HTTP_HEADERS -//#define INCLUDE_HTTPD_DEBUG - -//============================================================================ -// -// ---------- Memory options ---------- -// -//============================================================================ -//#define MEM_LIBC_MALLOC 0 -//#define MEMP_MEM_MALLOC 0 -#define MEM_ALIGNMENT 4 // default is 1 -#define MEM_SIZE (8 * 1024) // default is 1600 -//#define MEMP_SEPARATE_POOLS 0 -//#define MEMP_OVERFLOW_CHECK 0 -//#define MEMP_SANITY_CHECK 0 -//#define MEM_USE_POOLS 0 -//#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -//#define MEMP_USE_CUSTOM_POOLS 0 -//#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 - -//============================================================================ -// -// ---------- Internal Memory Pool Sizes ---------- -// -//============================================================================ -//#define MEMP_NUM_PBUF 16 -//#define MEMP_NUM_RAW_PCB 4 -//#define MEMP_NUM_UDP_PCB 4 -#define MEMP_NUM_TCP_PCB 10 // default 5 -//#define MEMP_NUM_TCP_PCB_LISTEN 8 -//#define MEMP_NUM_TCP_SEG 16 -//#define MEMP_NUM_REASSDATA 5 -//#define MEMP_NUM_ARP_QUEUE 30 -//#define MEMP_NUM_IGMP_GROUP 8 -#define MEMP_NUM_SYS_TIMEOUT 4 // default 3 -//#define MEMP_NUM_NETBUF 2 -//#define MEMP_NUM_NETCONN 4 -//#define MEMP_NUM_TCPIP_MSG_API 8 -//#define MEMP_NUM_TCPIP_MSG_INPKT 8 -//#define MEMP_NUM_SNMP_NODE 50 -//#define MEMP_NUM_SNMP_ROOTNODE 30 -//#define MEMP_NUM_SNMP_VARBIND 2 -//#define MEMP_NUM_SNMP_VALUE 3 -//#define MEMP_NUM_NETDB 1 -//#define MEMP_NUM_LOCALHOSTLIST 1 -//#define MEMP_NUM_PPPOE_INTERFACES 1 -//#define PBUF_POOL_SIZE 16 - -//============================================================================ -// -// ---------- ARP options ---------- -// -//============================================================================ -//#define LWIP_ARP 1 -//#define ARP_TABLE_SIZE 10 -//#define ARP_QUEUEING 0 -//#define ETHARP_TRUST_IP_MAC 0 -//#define ETHARP_SUPPORT_VLAN 0 -//#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -//#define ETH_PAD_SIZE 0 -//#define ETHARP_SUPPORT_STATIC_ENTRIES 0 - -//============================================================================ -// -// ---------- IP options ---------- -// -//============================================================================ -//#define IP_FORWARD 0 -//#define IP_OPTIONS_ALLOWED 1 -#define IP_REASSEMBLY 0 // default is 1 -#define IP_FRAG 0 // default is 1 -//#define IP_REASS_MAXAGE 3 -//#define IP_REASS_MAX_PBUFS 10 -//#define IP_FRAG_USES_STATIC_BUF 0 -//#define IP_FRAG_MAX_MTU 1500 -//#define IP_DEFAULT_TTL 255 -//#define IP_SOF_BROADCAST 0 -//#define IP_SOF_BROADCAST_RECV 0 - -//============================================================================ -// -// ---------- ICMP options ---------- -// -//============================================================================ -//#define LWIP_ICMP 1 -//#define ICMP_TTL (IP_DEFAULT_TTL) -//#define LWIP_BROADCAST_PING 0 -//#define LWIP_MULTICAST_PING 0 - -//============================================================================ -// -// ---------- RAW options ---------- -// -//============================================================================ -//#define LWIP_RAW 1 -//#define RAW_TTL (IP_DEFAULT_TTL) - -//============================================================================ -// -// ---------- DHCP options ---------- -// -//============================================================================ -#define LWIP_DHCP 1 // default is 0 -//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) - -//============================================================================ -// -// ---------- AUTOIP options ---------- -// -//============================================================================ -//#define LWIP_AUTOIP 1 // default is 0 -//#define LWIP_DHCP_AUTOIP_COOP 0 -//#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 - -//============================================================================ -// -// ---------- SNMP options ---------- -// -//============================================================================ -//#define LWIP_SNMP 0 -//#define SNMP_CONCURRENT_REQUESTS 1 -//#define SNMP_TRAP_DESTINATIONS 1 -//#define SNMP_PRIVATE_MIB 0 -//#define SNMP_SAFE_REQUESTS 1 -//#define SNMP_MAX_OCTET_STRING_LEN 127 -//#define SNMP_MAX_TREE_DEPTH 15 - -//============================================================================ -// -// ---------- IGMP options ---------- -// -//============================================================================ -//#define LWIP_IGMP 0 - -//============================================================================ -// -// ---------- DNS options ----------- -// -//============================================================================ -//#define LWIP_DNS 0 -//#define DNS_TABLE_SIZE 4 -//#define DNS_MAX_NAME_LENGTH 256 -//#define DNS_MAX_SERVERS 2 -//#define DNS_DOES_NAME_CHECK 1 -//#define DNS_USES_STATIC_BUF 1 -//#define DNS_MSG_SIZE 512 -//#define DNS_LOCAL_HOSTLIST 0 -//#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 - -//============================================================================ -// -// ---------- UDP options ---------- -// -//============================================================================ -//#define LWIP_UDP 1 -//#define LWIP_UDPLITE 0 -//#define UDP_TTL (IP_DEFAULT_TTL) -//#define LWIP_NETBUF_RECVINFO 0 - -//============================================================================ -// -// ---------- UPNP options ---------- -// -//============================================================================ -//#define LWIP_UPNP 0 - -//============================================================================ -// -// ---------- PTPD options ---------- -// -//============================================================================ -//#define LWIP_PTPD 0 - -//============================================================================ -// -// ---------- TCP options ---------- -// -//============================================================================ -//#define LWIP_TCP 1 -//#define TCP_TTL (IP_DEFAULT_TTL) -//#define TCP_WND (4 * TCP_MSS) -//#define TCP_MAXRTX 12 -//#define TCP_SYNMAXRTX 6 -//#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#define TCP_MSS 256 // default is 536 -//#define TCP_CALCULATE_EFF_SEND_MSS 1 -#define TCP_SND_BUF (2 * TCP_MSS) // default is 256 -//#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -//#define TCP_SNDQUEUELOWAT ((TCP_SND_QUEUELEN)/2) -//#define TCP_LISTEN_BACKLOG 0 -//#define TCP_DEFAULT_LISTEN_BACKLOG 0xFF -//#define TCP_OVERSIZE TCP_MSS -//#define LWIP_TCP_TIMESTAMPS 0 -//#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) - -//============================================================================ -// -// ---------- API options ---------- -// -//============================================================================ -//#define LWIP_EVENT_API 0 -//#define LWIP_CALLBACK_API 1 - -//============================================================================ -// -// ---------- Pbuf options ---------- -// -//============================================================================ -#define ETH_PAD_SIZE 2 // default is 0 -//#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -//#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) - -//============================================================================ -// -// ---------- Network Interfaces options ---------- -// -//============================================================================ -#define LWIP_NETIF_HOSTNAME 1 // default is 0 -//#define LWIP_NETIF_API 0 -//#define LWIP_NETIF_STATUS_CALLBACK 0 -//#define LWIP_NETIF_LINK_CALLBACK 0 -//#define LWIP_NETIF_HWADDRHINT 0 -//#define LWIP_NETIF_LOOPBACK 0 -//#define LWIP_LOOPBACK_MAX_PBUFS 0 -//#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -//#define LWIP_NETIF_TX_SINGLE_PBUF 0 - - -//============================================================================ -// -// ---------- LOOPIF options ---------- -// -//============================================================================ -//#define LWIP_HAVE_LOOPIF 0 - -//============================================================================ -// -// ---------- SLIPIF options ---------- -// -//============================================================================ -//#define LWIP_HAVE_SLIPIF 0 - -//============================================================================ -// -// ---------- Thread options ---------- -// -//============================================================================ -//#define TCPIP_THREAD_NAME "tcpip_thread" -//#define TCPIP_THREAD_STACKSIZE 0 -//#define TCPIP_THREAD_PRIO 1 -//#define TCPIP_MBOX_SIZE 0 -//#define SLIPIF_THREAD_NAME "slipif_loop" -//#define SLIPIF_THREAD_STACKSIZE 0 -//#define SLIPIF_THREAD_PRIO 1 -//#define PPP_THREAD_NAME "pppInputThread" -//#define PPP_THREAD_STACKSIZE 0 -//#define PPP_THREAD_PRIO 1 -//#define DEFAULT_THREAD_NAME "lwIP" -//#define DEFAULT_THREAD_STACKSIZE 0 -//#define DEFAULT_THREAD_PRIO 1 -//#define DEFAULT_RAW_RECVMBOX_SIZE 0 -//#define DEFAULT_UDP_RECVMBOX_SIZE 0 -//#define DEFAULT_TCP_RECVMBOX_SIZE 0 -//#define DEFAULT_ACCEPTMBOX_SIZE 0 - -//============================================================================ -// -// ---------- Sequential layer options ---------- -// -//============================================================================ -//#define LWIP_TCPIP_CORE_LOCKING 0 -//#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#define LWIP_NETCONN 0 // default is 1 -//#define LWIP_TCPIP_TIMEOUT 1 - -//============================================================================ -// -// ---------- Socket Options ---------- -// -//============================================================================ -#define LWIP_SOCKET 0 // default is 1 -//#define LWIP_COMPAT_SOCKETS 1 -//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -//#define LWIP_TCP_KEEPALIVE 0 -//#define LWIP_SO_RCVTIMEO 0 -//#define LWIP_SO_RCVBUF 0 -//#define RECV_BUFSIZE_DEFAULT INT_MAX -//#define SO_REUSE 0 -//#define SO_REUSE_RXTOALL 0 - -//============================================================================ -// -// ---------- Statistics options ---------- -// -//============================================================================ -#define LWIP_STATS 1 -//#define LWIP_STATS_DISPLAY 0 -#define LINK_STATS 1 -//#define ETHARP_STATS (LWIP_ARP) -//#define IP_STATS 1 -//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -//#define ICMP_STATS 1 -//#define IGMP_STATS (LWIP_IGMP) -//#define UDP_STATS (LWIP_UDP) -//#define TCP_STATS (LWIP_TCP) -//#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -//#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -//#define SYS_STATS (NO_SYS == 0) - -//============================================================================ -// -// ---------- PPP options ---------- -// -//============================================================================ -//#define PPP_SUPPORT 0 -//#define PPPOE_SUPPORT 0 -//#define PPPOS_SUPPORT PPP_SUPPORT - -#if PPP_SUPPORT -//#define NUM_PPP 1 -//#define PAP_SUPPORT 0 -//#define CHAP_SUPPORT 0 -//#define MSCHAP_SUPPORT 0 -//#define CBCP_SUPPORT 0 -//#define CCP_SUPPORT 0 -//#define VJ_SUPPORT 0 -//#define MD5_SUPPORT 0 -//#define FSM_DEFTIMEOUT 6 -//#define FSM_DEFMAXTERMREQS 2 -//#define FSM_DEFMAXCONFREQS 10 -//#define FSM_DEFMAXNAKLOOPS 5 -//#define UPAP_DEFTIMEOUT 6 -//#define UPAP_DEFREQTIME 30 -//#define CHAP_DEFTIMEOUT 6 -//#define CHAP_DEFTRANSMITS 10 -//#define LCP_ECHOINTERVAL 0 -//#define LCP_MAXECHOFAILS 3 -//#define PPP_MAXIDLEFLAG 100 - -//#define PPP_MAXMTU 1500 -//#define PPP_DEFMRU 296 -#endif - -//============================================================================ -// -// ---------- checksum options ---------- -// -//============================================================================ -//#define CHECKSUM_GEN_IP 1 -//#define CHECKSUM_GEN_UDP 1 -//#define CHECKSUM_GEN_TCP 1 -//#define CHECKSUM_CHECK_IP 1 -//#define CHECKSUM_CHECK_UDP 1 -//#define CHECKSUM_CHECK_TCP 1 -//#define LWIP_CHECKSUM_ON_COPY 0 - -//============================================================================ -// -// ---------- Debugging options ---------- -// -//============================================================================ -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF // LWIP_DBG_LEVEL_ALL -//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING -//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS -//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE - -//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#define LWIP_DBG_TYPES_ON \ - (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) - -//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF -//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF -//#define PBUF_DEBUG LWIP_DBG_OFF -//#define API_LIB_DEBUG LWIP_DBG_OFF -//#define API_MSG_DEBUG LWIP_DBG_OFF -//#define SOCKETS_DEBUG LWIP_DBG_OFF -//#define ICMP_DEBUG LWIP_DBG_OFF -//#define IGMP_DEBUG LWIP_DBG_OFF -//#define INET_DEBUG LWIP_DBG_OFF -//#define IP_DEBUG LWIP_DBG_ON // default is OFF -//#define IP_REASS_DEBUG LWIP_DBG_OFF -//#define RAW_DEBUG LWIP_DBG_OFF -//#define MEM_DEBUG LWIP_DBG_OFF -//#define MEMP_DEBUG LWIP_DBG_OFF -//#define SYS_DEBUG LWIP_DBG_OFF -//#define TCP_DEBUG LWIP_DBG_OFF -//#define TCP_INPUT_DEBUG LWIP_DBG_OFF -//#define TCP_FR_DEBUG LWIP_DBG_OFF -//#define TCP_RTO_DEBUG LWIP_DBG_OFF -//#define TCP_CWND_DEBUG LWIP_DBG_OFF -//#define TCP_WND_DEBUG LWIP_DBG_OFF -//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -//#define TCP_RST_DEBUG LWIP_DBG_OFF -//#define TCP_QLEN_DEBUG LWIP_DBG_OFF -//#define UDP_DEBUG LWIP_DBG_ON // default is OFF -//#define TCPIP_DEBUG LWIP_DBG_OFF -//#define PPP_DEBUG LWIP_DBG_OFF -//#define SLIP_DEBUG LWIP_DBG_OFF -//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF -//#define AUTOIP_DEBUG LWIP_DBG_OFF -//#define SNMP_MSG_DEBUG LWIP_DBG_OFF -//#define SNMP_MIB_DEBUG LWIP_DBG_OFF -//#define DNS_DEBUG LWIP_DBG_OFF - -#endif /* __LWIPOPTS_H__ */ diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/main.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/main.cpp deleted file mode 100644 index 9e8091024..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/main.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//============================================================================ -// Product: QP-lwIP demonstration -// Last Updated for Version: 5.4.0 -// Date of the Last Update: 2015-05-12 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//............................................................................ -int main(void) { - static QEvt const *tableQueueSto[N_PHILO + 5]; - static QEvt const *philoQueueSto[N_PHILO][N_PHILO]; - static QEvt const *lwIPMgrQueueSto[10]; - static QSubscrList subscrSto[MAX_PUB_SIG]; - - static QF_MPOOL_EL(TableEvt) smlPoolSto[20]; // storage for small pool - static QF_MPOOL_EL(TextEvt) medPoolSto[4]; // storage for med. pool - - QF::init(); // initialize the framework and the underlying RT kernel - BSP_init(); // initialize the BSP - - // initialize publish-subscribe... - QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0])); - - // start the active objects... - AO_LwIPMgr->start(1U, - lwIPMgrQueueSto, Q_DIM(lwIPMgrQueueSto), - nullptr, 0U); - - for (uint8_t n = 0U; n < N_PHILO; ++n) { - AO_Philo[n]->start(n + 2U, - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - nullptr, 0U); - } - AO_Table->start(N_PHILO + 2U, - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QF::run(); // run the application -} - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/philo.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/philo.cpp deleted file mode 100644 index db43a4e12..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/philo.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 6.8.0 -// Date of the Last Update: 2020-01-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Philo : public QActive { -private: - QTimeEvt m_timeEvt; // to timeout thinking or eating - -public: - Philo(); - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -#define THINK_TIME (BSP_TICKS_PER_SEC/2) -#define EAT_TIME (BSP_TICKS_PER_SEC/5) - - // helper macro to provide the ID of Philo "me_" -#define PHILO_ID(me_) ((uint8_t)((me_) - l_philo)) - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; -// Global objects ------------------------------------------------------------ -QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AOs - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -//............................................................................ -Philo::Philo() - : QActive((QStateHandler)&Philo::initial), - m_timeEvt(this, TIMEOUT_SIG) -{} -//............................................................................ -Q_STATE_DEF(Philo, initial) { - static bool registered; // starts off with 0, per C-standard - if (!registered) { - QS_OBJ_DICTIONARY(&l_philo[0]); - QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[1]); - QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[2]); - QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[3]); - QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[4]); - QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); - - QS_FUN_DICTIONARY(&initial); - QS_FUN_DICTIONARY(&thinking); - QS_FUN_DICTIONARY(&hungry); - QS_FUN_DICTIONARY(&eating); - - registered = true; - } - QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philos - QS_SIG_DICTIONARY(TIMEOUT_SIG, this); // signal for each Philos - - subscribe(EAT_SIG); - - return tran(&thinking); -} -//............................................................................ -Q_STATE_DEF(Philo, thinking) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(THINK_TIME); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&hungry); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, hungry) { - switch (e->sig) { - case Q_ENTRY_SIG: { - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoNum = PHILO_ID(this); - AO_Table->POST(pe, this); - return Q_RET_HANDLED; - } - case EAT_SIG: { - if (((TableEvt *)e)->philoNum == PHILO_ID(this)) { - return tran(&eating); - } - break; - } - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} -//............................................................................ -Q_STATE_DEF(Philo, eating) { - switch (e->sig) { - case Q_ENTRY_SIG: { - m_timeEvt.armX(EAT_TIME); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoNum = PHILO_ID(this); - QF::PUBLISH(pe, this); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - return tran(&thinking); - } - case EAT_SIG: // intentionally fall-through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(this)); - return Q_RET_HANDLED; - } - } - return super(&top); -} - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.cpp deleted file mode 100644 index 05f73959e..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/bsp.cpp +++ /dev/null @@ -1,360 +0,0 @@ -//============================================================================ -// Product: BSP for DPP with lwIP on EK-LM3S9665 board, QK kernel -// Last updated for version 7.3.3 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP port header file -#include "dpp.hpp" // application events and active objects -#include "bsp.hpp" // Board Support Package header file - -#include "LM3S6965.h" // the device specific header (TI) - -Q_DEFINE_THIS_FILE - -// ISRs defined in this BSP -------------------------------------------------- -extern "C" void SysTick_Handler(void); - -// Local-scope objects ------------------------------------------------------- -#define USER_LED (1U << 0) -#define USER_BTN (1U << 1) - -#define ETH0_LED (1U << 3) -#define ETH1_LED (1U << 2) - -static uint32_t l_nTicks; - -#ifdef Q_SPY - - QSTimeCtr QS_tickTime_; - QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - #define UART_BAUD_RATE 115200U - #define UART_TXFIFO_DEPTH 16U - #define UART_FR_TXFE (1U << 7) - -#endif - -//............................................................................ -extern "C" void SysTick_Handler(void) { - uint32_t volatile tmp; - - QK_ISR_ENTRY(); // inform QK about ISR entry - - ++l_nTicks; // count the number of clock ticks - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events at rate 0 - - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; // state of the button debouncing - uint32_t current; - - current = ~GPIOF->DATA_Bits[USER_BTN]; // read USER_BTN - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & USER_BTN) != 0U) { // debounced USER_BTN state changed? - if ((buttons.depressed & USER_BTN) != 0U) { // is USER_BTN depressed? - static QEvt const bd(BTN_DOWN_SIG); - QF::PUBLISH(&bd, &l_SysTick_Handler); - } - else { // the button is released - static QEvt const bu(BTN_UP_SIG); - QF::PUBLISH(&bu, &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about ISR exit -} - -//............................................................................ -void BSP_init(void) { - // NOTE: SystemInit() already called from startup_TM4C123GH6PM.s - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - SYSCTL->RCGC2 |= (1 << 5); // enable clock to GPIOF (User and Eth LEDs) - __NOP(); - __NOP(); - - // configure the pin driving the Ethernet LED - GPIOF->DIR &= ~(ETH0_LED | ETH1_LED); // set direction: hardware - GPIOF->AFSEL |= (ETH0_LED | ETH1_LED); - GPIOF->DR2R |= (ETH0_LED | ETH1_LED); - GPIOF->ODR &= ~(ETH0_LED | ETH1_LED); - GPIOF->PUR |= (ETH0_LED | ETH1_LED); - GPIOF->PDR &= ~(ETH0_LED | ETH1_LED); - GPIOF->DEN |= (ETH0_LED | ETH1_LED); - GPIOF->AMSEL &= ~(ETH0_LED | ETH1_LED); - - // configure the pin driving the User LED - GPIOF->DIR |= USER_LED; // set direction: output - GPIOF->DR2R |= USER_LED; - GPIOF->DEN |= USER_LED; - GPIOF->AMSEL &= ~USER_LED; - GPIOF->DATA_Bits[USER_LED] = 0; // turn the LED off - - // configure the pin connected to the Buttons - GPIOF->DIR &= ~USER_BTN; // set direction: input - GPIOF->DR2R |= USER_BTN; - GPIOF->ODR &= ~USER_BTN; - GPIOF->PUR |= USER_BTN; - GPIOF->PDR &= ~USER_BTN; - GPIOF->DEN |= USER_BTN; - GPIOF->AMSEL &= ~USER_BTN; - - // NOTE: - // The OLED display is encapsulated inside the Table AO, so the - // initialization of the OLED display happens in the top-most initial - // transition of the Table AO (see Table_displayInit()). - // - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP_TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - // - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority() - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(Ethernet_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - NVIC_EnableIRQ(Ethernet_IRQn); // enable the Ethernet Interrupt - // ... -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QK::onIdle(void) { - - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - GPIOF->DATA_Bits[USER_LED] = USER_LED; // turn the User LED on - GPIOF->DATA_Bits[USER_LED] = 0U; // turn the User LED off - QF_INT_ENABLE(); - -#ifdef Q_SPY - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - uint8_t const *block; - - QF_INT_DISABLE(); - block = QS::getBlock(&fifo); // try to get next block to transmit - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; - QS_ASSERTION(module, id, static_cast(10000U)); - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//............................................................................ -// sys_now() is used in the lwIP stack -extern "C" uint32_t sys_now(void) { - return l_nTicks * (1000U / BSP_TICKS_PER_SEC); -} - -//---------------------------------------------------------------------------- -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsBuf[2*1024]; // buffer for Quantum Spy - uint32_t tmp; - initBuf(qsBuf, sizeof(qsBuf)); - - // enable the peripherals used by the UART0... - SYSCTL->RCGC1 |= (1U << 0); // enable clock to UART0 - SYSCTL->RCGC2 |= (1U << 0); // enable clock to GPIOA - __NOP(); // wait after enabling clocks - __NOP(); - __NOP(); - - // configure UART0 pins for UART operation... - tmp = (1U << 0) | (1U << 1); - GPIOA->DIR &= ~tmp; - GPIOA->AFSEL |= tmp; - GPIOA->DR2R |= tmp; // set 2mA drive, DR4R and DR8R are cleared - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->DEN |= tmp; - GPIOA->AMSEL &= ~tmp; - - // configure the UART for the desired baud rate, 8-N-1 operation... - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = 0x60U; // configure 8-bit operation - UART0->LCRH |= 0x10U; // enable FIFOs - UART0->CTL |= (1U << 0) | (1U << 8) | (1U << 9); - - QS_tickPeriod_ = SystemCoreClock / BSP_TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // invoked with interrupts locked - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // flag not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - uint16_t fifo = UART_TXFIFO_DEPTH; // Tx FIFO depth - uint8_t const *block; - while ((block = QS::getBlock(&fifo)) != (uint8_t *)0) { - // busy-wait until TX FIFO empty - while ((UART0->FR & UART_FR_TXFE) == 0) { - } - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the TX FIFO - } - fifo = UART_TXFIFO_DEPTH; // re-load the Tx FIFO depth - } -} -//............................................................................ -void QS::onReset(void) { - //TBD -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - //TBD -} -#endif // Q_SPY -//---------------------------------------------------------------------------- - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF/QK services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile deleted file mode 100644 index 468854b64..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/Makefile +++ /dev/null @@ -1,319 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++, lwIP on EK-LM3S6965, QK kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# https://www.state-machine.com -# mailto:info@state-machine.com -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := lwip-qk - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qk/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qk \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-lm3s6965 \ - $(QPCPP)/3rd_party/ek-lm3s6965/gnu \ - $(QPCPP)/3rd_party/ek-lm3s6965/lwip_driver/netif_cpp \ - $(QPCPP)/3rd_party/lwip/apps/webserver_raw - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-lm3s6965 \ - -I$(QPCPP)/3rd_party/ek-lm3s6965/lwip_driver \ - -I$(QPCPP)/3rd_party/lwip/src/include \ - -I$(QPCPP)/3rd_party/lwip/src/include/ipv4 \ - -I$(QPCPP)/3rd_party/lwip/src \ - -I$(QPCPP)/3rd_party/lwip/apps/webserver_raw - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - fs.c \ - httpd.c \ - lwip.c \ - rit128x96x4.c \ - system_LM3S6965.c \ - startup_LM3S6965.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - eth_driver.cpp \ - lwipmgr.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qk.cpp \ - qk_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, FPU, and Float-ABI types -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat deleted file mode 100644 index 30a2b4b47..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program to the flash of EK-LM3S6965 -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-LM3S6965 -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-lm3s6965 -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/lwip-qk.ld b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/lwip-qk.ld deleted file mode 100644 index 75e2dd609..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/gnu/lwip-qk.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for EK-LM3S6965, GNU-ARM, QP-lwIP -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/README.txt b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/README.txt deleted file mode 100644 index a85fcb951..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/README.txt +++ /dev/null @@ -1,55 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the LM3S6965 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-lm3s6965\iar\startup_LM3S6965.s - -The file startup_LM3S6965.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intened to handle catastrophic errors and -should NOT return. -*** - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd deleted file mode 100644 index a5bdfc599..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp deleted file mode 100644 index c78778163..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.ewp +++ /dev/null @@ -1,3407 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\fsdata.h - - - $PROJ_DIR$\..\..\lwip.c - - - $PROJ_DIR$\..\..\lwip.h - - - $PROJ_DIR$\..\..\lwipmgr.cpp - - - $PROJ_DIR$\..\..\lwipopts.h - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-lm3s6965 - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\lwip_driver\netif_cpp\eth_driver.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\lwip_driver\netif\eth_driver.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\LM3S6965.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\rit128x96x4.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\rit128x96x4.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\iar\startup_LM3S6965.s - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\system_LM3S6965.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\system_LM3S6965.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qstamp.cpp - - - - webserver_raw - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\fs.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\fs.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\httpd.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\httpd.h - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.eww b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.eww deleted file mode 100644 index 4bf874933..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\lwip-qk.ewp - - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.icf b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.icf deleted file mode 100644 index 7267deeb0..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qk/iar/lwip-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.cpp deleted file mode 100644 index 1caea346a..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/bsp.cpp +++ /dev/null @@ -1,363 +0,0 @@ -//============================================================================ -// Product: BSP for DPP with lwIP on EK-LM3S9665 board, QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP port header file -#include "dpp.hpp" // application events and active objects -#include "bsp.hpp" // Board Support Package header file - -#include "LM3S6965.h" // the device specific header (TI) - -Q_DEFINE_THIS_FILE - -// ISRs defined in this BSP -------------------------------------------------- -extern "C" void SysTick_Handler(void); - -// Local-scope objects ------------------------------------------------------- -#define USER_LED (1U << 0) -#define USER_BTN (1U << 1) - -#define ETH0_LED (1U << 3) -#define ETH1_LED (1U << 2) - -static uint32_t l_nTicks; - -#ifdef Q_SPY - - QSTimeCtr QS_tickTime_; - QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - - #define UART_BAUD_RATE 115200U - #define UART_TXFIFO_DEPTH 16U - #define UART_FR_TXFE (1U << 7) - -#endif - -//............................................................................ -extern "C" void SysTick_Handler(void) { - uint32_t volatile tmp; - - ++l_nTicks; // count the number of clock ticks - -#ifdef Q_SPY - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif - - QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events at rate 0 - - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; // state of the button debouncing - uint32_t current; - - current = ~GPIOF->DATA_Bits[USER_BTN]; // read USER_BTN - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & USER_BTN) != 0U) { // debounced USER_BTN state changed? - if ((buttons.depressed & USER_BTN) != 0U) { // is USER_BTN depressed? - static QEvt const bd(BTN_DOWN_SIG); - QF::PUBLISH(&bd, &l_SysTick_Handler); - } - else { // the button is released - static QEvt const bu(BTN_UP_SIG); - QF::PUBLISH(&bu, &l_SysTick_Handler); - } - } -} - -//............................................................................ -void BSP_init(void) { - // NOTE: SystemInit() already called from startup_TM4C123GH6PM.s - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - SYSCTL->RCGC2 |= (1 << 5); // enable clock to GPIOF (User and Eth LEDs) - __NOP(); - __NOP(); - - // configure the pin driving the Ethernet LED - GPIOF->DIR &= ~(ETH0_LED | ETH1_LED); // set direction: hardware - GPIOF->AFSEL |= (ETH0_LED | ETH1_LED); - GPIOF->DR2R |= (ETH0_LED | ETH1_LED); - GPIOF->ODR &= ~(ETH0_LED | ETH1_LED); - GPIOF->PUR |= (ETH0_LED | ETH1_LED); - GPIOF->PDR &= ~(ETH0_LED | ETH1_LED); - GPIOF->DEN |= (ETH0_LED | ETH1_LED); - GPIOF->AMSEL &= ~(ETH0_LED | ETH1_LED); - - // configure the pin driving the User LED - GPIOF->DIR |= USER_LED; // set direction: output - GPIOF->DR2R |= USER_LED; - GPIOF->DEN |= USER_LED; - GPIOF->AMSEL &= ~USER_LED; - GPIOF->DATA_Bits[USER_LED] = 0; // turn the LED off - - // configure the pin connected to the Buttons - GPIOF->DIR &= ~USER_BTN; // set direction: input - GPIOF->DR2R |= USER_BTN; - GPIOF->ODR &= ~USER_BTN; - GPIOF->PUR |= USER_BTN; - GPIOF->PDR &= ~USER_BTN; - GPIOF->DEN |= USER_BTN; - GPIOF->AMSEL &= ~USER_BTN; - - // NOTE: - // The OLED display is encapsulated inside the Table AO, so the - // initialization of the OLED display happens in the top-most initial - // transition of the Table AO (see Table_displayInit()). - // - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / BSP_TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - // - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority() - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(Ethernet_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - NVIC_EnableIRQ(Ethernet_IRQn); // enable the Ethernet Interrupt - // ... -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QV::onIdle(void) { // NOTE: called with interrupts DISABLED, see NOTE01 - - // toggle the User LED on and then off, see NOTE02 - GPIOF->DATA_Bits[USER_LED] = USER_LED; // turn the User LED on - GPIOF->DATA_Bits[USER_LED] = 0U; // turn the User LED off - -#ifdef Q_SPY - QF_INT_ENABLE(); - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - uint8_t const *block; - - QF_INT_DISABLE(); - block = QS::getBlock(&fifo); // try to get next block to transmit - QF_INT_ENABLE(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; - QS_ASSERTION(module, id, static_cast(10000U)); - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//............................................................................ -// sys_now() is used in the lwIP stack -extern "C" uint32_t sys_now(void) { - return l_nTicks * (1000U / BSP_TICKS_PER_SEC); -} - -//---------------------------------------------------------------------------- -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsBuf[2*1024]; // buffer for Quantum Spy - uint32_t tmp; - initBuf(qsBuf, sizeof(qsBuf)); - - // enable the peripherals used by the UART0... - SYSCTL->RCGC1 |= (1U << 0); // enable clock to UART0 - SYSCTL->RCGC2 |= (1U << 0); // enable clock to GPIOA - __NOP(); // wait after enabling clocks - __NOP(); - __NOP(); - - // configure UART0 pins for UART operation... - tmp = (1U << 0) | (1U << 1); - GPIOA->DIR &= ~tmp; - GPIOA->AFSEL |= tmp; - GPIOA->DR2R |= tmp; // set 2mA drive, DR4R and DR8R are cleared - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->DEN |= tmp; - GPIOA->AMSEL &= ~tmp; - - // configure the UART for the desired baud rate, 8-N-1 operation... - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = 0x60U; // configure 8-bit operation - UART0->LCRH |= 0x10U; // enable FIFOs - UART0->CTL |= (1U << 0) | (1U << 8) | (1U << 9); - - QS_tickPeriod_ = SystemCoreClock / BSP_TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // invoked with interrupts locked - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0U) { // flag not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - uint16_t fifo = UART_TXFIFO_DEPTH; // Tx FIFO depth - uint8_t const *block; - while ((block = QS::getBlock(&fifo)) != (uint8_t *)0) { - // busy-wait until TX FIFO empty - while ((UART0->FR & UART_FR_TXFE) == 0) { - } - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the TX FIFO - } - fifo = UART_TXFIFO_DEPTH; // re-load the Tx FIFO depth - } -} -//............................................................................ -void QS::onReset(void) { - //TBD -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - //TBD -} -#endif // Q_SPY -//---------------------------------------------------------------------------- - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF/QK services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE01: -// The QV_onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV_onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile deleted file mode 100644 index b757b7fec..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/Makefile +++ /dev/null @@ -1,319 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++, lwIP on EK-LM3S6965, QV kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# https://www.state-machine.com -# mailto:info@state-machine.com -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := lwip-qv - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qv/gnu - -# list of all source directories used by this project -VPATH = \ - .. \ - ../.. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qv \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-lm3s6965 \ - $(QPCPP)/3rd_party/ek-lm3s6965/gnu \ - $(QPCPP)/3rd_party/ek-lm3s6965/lwip_driver/netif_cpp \ - $(QPCPP)/3rd_party/lwip/apps/webserver_raw - -# list of all include directories needed by this project -INCLUDES = \ - -I../.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-lm3s6965 \ - -I$(QPCPP)/3rd_party/ek-lm3s6965/lwip_driver \ - -I$(QPCPP)/3rd_party/lwip/src/include \ - -I$(QPCPP)/3rd_party/lwip/src/include/ipv4 \ - -I$(QPCPP)/3rd_party/lwip/src \ - -I$(QPCPP)/3rd_party/lwip/apps/webserver_raw - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - fs.c \ - httpd.c \ - lwip.c \ - rit128x96x4.c \ - system_LM3S6965.c \ - startup_LM3S6965.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - eth_driver.cpp \ - lwipmgr.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qv.cpp \ - qv_port.cpp - -QP_ASMS := - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, FPU, and Float-ABI types -ARM_CPU := -mcpu=cortex-m3 -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M4F -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat deleted file mode 100644 index 30a2b4b47..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program to the flash of EK-LM3S6965 -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-LM3S6965 -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-lm3s6965 -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/lwip-qv.ld b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/lwip-qv.ld deleted file mode 100644 index 75e2dd609..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/gnu/lwip-qv.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for EK-LM3S6965, GNU-ARM, QP-lwIP -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/README.txt b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/README.txt deleted file mode 100644 index a85fcb951..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/README.txt +++ /dev/null @@ -1,55 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code ------------- -The startup code for the LM3S6965 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-lm3s6965\iar\startup_LM3S6965.s - -The file startup_LM3S6965.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intened to handle catastrophic errors and -should NOT return. -*** - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd deleted file mode 100644 index a6b9407c2..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp deleted file mode 100644 index d42f7dce0..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.ewp +++ /dev/null @@ -1,3413 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\..\fsdata.h - - - $PROJ_DIR$\..\..\lwip.c - - - $PROJ_DIR$\..\..\lwip.h - - - $PROJ_DIR$\..\..\lwipmgr.cpp - - - $PROJ_DIR$\..\..\lwipopts.h - - - $PROJ_DIR$\..\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - ek-lm3s6965 - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\lwip_driver\netif_cpp\eth_driver.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\lwip_driver\netif_cpp\eth_driver.hpp - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\LM3S6965.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\rit128x96x4.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\rit128x96x4.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\iar\startup_LM3S6965.s - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\system_LM3S6965.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\ek-lm3s6965\system_LM3S6965.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\..\src\qs\qstamp.cpp - - - - webserver_raw - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\fs.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\fs.h - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\httpd.c - - - $PROJ_DIR$\..\..\..\..\..\..\3rd_party\lwip\apps\webserver_raw\httpd.h - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.eww b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.eww deleted file mode 100644 index 4df7ad4ca..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\lwip-qv.ewp - - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.icf b/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.icf deleted file mode 100644 index 7267deeb0..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/qv/iar/lwip-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/table.cpp b/examples/lwip/arm-cm/lwip_ek-lm3s6965/table.cpp deleted file mode 100644 index f41b8fb46..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/table.cpp +++ /dev/null @@ -1,304 +0,0 @@ -//============================================================================ -// Product: DPP example with lwIP and direct screen output -// Last updated for version 6.9.1 -// Last updated on 2020-09-21 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ API -#include "dpp.hpp" // application events and active objects -#include "bsp.hpp" // Board Support Package header file - -extern "C" { - #include "rit128x96x4.h" // RITEK 128x96x4 OLED used in Rev C-D boards -} -#include - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -class Table : public QActive { - uint8_t m_fork[N_PHILO]; - uint8_t m_isHungry[N_PHILO]; - uint8_t m_displayOn; - uint8_t m_udpCtr; - QTimeEvt m_te_DISPLAY_TIMEOUT; - -public: - Table(); // ctor - -private: - Q_STATE_DECL(initial); - Q_STATE_DECL(serving); - -private: - void displayInit(void); - void displayOn(void); - void displayOff(void); - void displayPhilStat(uint8_t n, char const *stat); - void displyIPAddr(char const *ip_addr); - void displyUdpText(char const *text); - void displyCgiText(char const *text); -}; - -#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO)) -#define LEFT(n_) ((uint8_t)(((n_) + 1) % N_PHILO)) -enum ForkState { FREE, USED }; - -#ifdef Q_SPY -enum AppRecords { // application-specific QS trace records - PHILO_STAT = QS_USER, - CGI_TEXT, - UDP_TEXT, -}; -#endif - -// Local objects ------------------------------------------------------------- -static Table l_table; // the single instance of the Table active object - -enum TablePrivateSignals { - DISPLAY_TIMEOUT_SIG = MAX_SIG -}; - -#define DISPLAY_TIMEOUT (BSP_TICKS_PER_SEC * 30) - -// Global-scope objects ------------------------------------------------------ -QActive * const AO_Table = (QActive *)&l_table; // "opaque" AO pointer - -//............................................................................ -Table::Table() - : QActive((QStateHandler)&Table::initial), - m_te_DISPLAY_TIMEOUT(this, DISPLAY_TIMEOUT_SIG) - -{ - uint8_t n; - for (n = 0; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = 0; - } - m_udpCtr = 0; -} -//............................................................................ -Q_STATE_DEF(Table, initial) { - (void)e; // unused parameter - - displayInit(); // Initialize the OLED display - - // subscribe to published events... - subscribe(DONE_SIG); - subscribe(BTN_DOWN_SIG); - subscribe(DISPLAY_IPADDR_SIG); - subscribe(DISPLAY_CGI_SIG); - subscribe(DISPLAY_UDP_SIG); - - QS_OBJ_DICTIONARY(&l_table); - QS_FUN_DICTIONARY(&top); - QS_FUN_DICTIONARY(&initial); - QS_FUN_DICTIONARY(&serving); - - // global signals... - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DISPLAY_IPADDR_SIG, nullptr); - QS_SIG_DICTIONARY(DISPLAY_CGI_SIG, nullptr); - QS_SIG_DICTIONARY(DISPLAY_UDP_SIG, nullptr); - - // signals just for Table... - QS_SIG_DICTIONARY(HUNGRY_SIG, this); - QS_SIG_DICTIONARY(DISPLAY_TIMEOUT_SIG, this); - - return tran(&serving); -} -//............................................................................ -Q_STATE_DEF(Table, serving) { - uint8_t n, m; - TableEvt *pe; - - switch (e->sig) { - case Q_ENTRY_SIG: { - m_te_DISPLAY_TIMEOUT.armX(DISPLAY_TIMEOUT); - displayOn(); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - m_te_DISPLAY_TIMEOUT.disarm(); - displayOff(); - return Q_RET_HANDLED; - } - case HUNGRY_SIG: { - n = ((TableEvt const *)e)->philoNum; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - displayPhilStat(n, "hungry "); - m = LEFT(n); - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = m_fork[n] = USED; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QF::PUBLISH(pe, this); - displayPhilStat(n, "eating "); - } - else { - m_isHungry[n] = 1; - } - return Q_RET_HANDLED; - } - case DONE_SIG: { - n = ((TableEvt const *)e)->philoNum; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - displayPhilStat(n, "thinking"); - m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = m_fork[m] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, this); - displayPhilStat(m, "eating "); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = m_fork[n] = USED; - m_isHungry[m] = 0; - pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QF::PUBLISH(pe, this); - displayPhilStat(m, "eating "); - } - return Q_RET_HANDLED; - } - case BTN_DOWN_SIG: { - displayOn(); - return Q_RET_HANDLED; - } - case DISPLAY_TIMEOUT_SIG: { - displayOff(); - return Q_RET_HANDLED; - } - case DISPLAY_IPADDR_SIG: { - displyIPAddr(((TextEvt *)e)->text); - return Q_RET_HANDLED; - } - case DISPLAY_CGI_SIG: { - displyCgiText(((TextEvt *)e)->text); - return Q_RET_HANDLED; - } - case DISPLAY_UDP_SIG: { - TextEvt *te; - - displyUdpText(((TextEvt *)e)->text); - ++m_udpCtr; - - te = Q_NEW(TextEvt, SEND_UDP_SIG); - snprintf(te->text, Q_DIM(te->text), "%s-%d", - ((TextEvt const *)e)->text, (int)m_udpCtr); - AO_LwIPMgr->POST(te, this); // post directly - - return Q_RET_HANDLED; - } - } - return super(&top); -} - -// helper functions for the display .......................................... -//............................................................................ -void Table::displayInit(void) { - RIT128x96x4Init(1000000); - RIT128x96x4StringDraw("QP-lwIP Demo", 4*6, 0*8, 9); - RIT128x96x4StringDraw("IP :", 0*6, 2*8, 5); - RIT128x96x4StringDraw("DPP: 0 ,1 ,2 ,3 ,4", 0*6, 4*8, 5); - RIT128x96x4StringDraw("CGI:", 0*6, 6*8, 5); - RIT128x96x4StringDraw("UDP:", 0*6, 8*8, 5); - RIT128x96x4StringDraw("state-machine.com", 2*6,10*8, 9); - m_displayOn = 1; -} -//............................................................................ -void Table::displayOn(void) { - m_te_DISPLAY_TIMEOUT.rearm(DISPLAY_TIMEOUT); - if (!m_displayOn) { - m_displayOn = 1; - RIT128x96x4DisplayOn(); - } -} -//............................................................................ -void Table::displayOff(void) { - if (m_displayOn) { - m_displayOn = 0; - RIT128x96x4DisplayOff(); - } -} -//............................................................................ -void Table::displayPhilStat(uint8_t n, char const *stat) { - if (m_displayOn) { - char str[2]; - str[0] = stat[0]; - str[1] = '\0'; - RIT128x96x4StringDraw(str, (6*6 + 3*6*n), 4*8, 15); - } - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void Table::displyIPAddr(char const *ip_addr) { - displayOn(); // make sure the screen is on - RIT128x96x4StringDraw(" ", 5*6, 2*8, 15); // wipe clean - RIT128x96x4StringDraw(ip_addr, 5*6, 2*8, 15); -} -//............................................................................ -void Table::displyCgiText(char const *text) { - displayOn(); // make sure the screen is on - RIT128x96x4StringDraw(" ", 5*6, 6*8, 15); // wipe clean - RIT128x96x4StringDraw(text, 5*6, 6*8, 15); - - QS_BEGIN_ID(CGI_TEXT, 0U) // app-specific record begin - QS_STR(text); // User text - QS_END() -} -//............................................................................ -void Table::displyUdpText(char const *text) { - displayOn(); // make sure the screen is on - RIT128x96x4StringDraw(" ", 5*6, 6*8, 15); // wipe clean - RIT128x96x4StringDraw(text, 5*6, 6*8, 15); - - QS_BEGIN_ID(UDP_TEXT, 0U) // app-specific record begin - QS_STR(text); // User text - QS_END() -} - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website.bat b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website.bat deleted file mode 100644 index 5e61226f0..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website.bat +++ /dev/null @@ -1,8 +0,0 @@ -:: batch file to re-generate the fsdata.h header file from -:: the contents of the "website" directory. -:: -:: The qfsgen utility is provided in the Qtools collection -:: (see http://sourceforge.net/projects/qpc/files/Qtools/). -:: The qfsgen utility is assumed to be in the PATH. - -qfsgen.exe website %1 %2 %3 \ No newline at end of file diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/404.htm b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/404.htm deleted file mode 100644 index 53618f004..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/404.htm +++ /dev/null @@ -1,10 +0,0 @@ - - - -
- - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/bg_footer.gif b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/bg_footer.gif deleted file mode 100644 index 5de5e624d637b22b91374ca89d6bc27167ec98bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmZ?wbhEHbyu!@EaFv1K|NsBLfB*jT=g;@=-#>o*`19w_n>TO%`0?Y@r%x|mzI^!b z;g>I8UcGwt_3PKqpFh8S`}Xzg*N+}Odh_PZty{MqKYslD`ST}Fp1gnm{@uHGPoF-$ zd-v|Wd-rbNzWwakvpaY0+`oVS#*G^f9z1yQ;>Cv#AHIG2_UqTLzkmP!`}dE5NdwFa{lB5Hskx=Kt-YhOtGlPSuYbbCNt35cZOF;V5Kfg#N|0CN z5)=`WlojRV5fI`RS7zbhzdHn zW?dng!Dn5TM15sw){fYe!MS^?_5nR%3BzAXNh&uCk~rq{G&C{JoT3>bvBKxTq@^9x z4U$jI@!Y)Z>}-qTS9eZsUVi@ne1~Q(S+6ZCE-v<%tQC7|%gW2k0~UMD_1e1X>T=!4 zRUw>-qO05Z+z)k`dM{ebw8QJgqp2TV+rF6O_H@`Rv^E^z;nl?0aW+Zhn4#fpfQ<@2)K`FR%aejaSk;>>k^e zEMFJxa^2h8)Qeu%afhD}=sR#hPQovI#>ZV{leOc|?b-SH`Gv*a^ZoYj`uh6D=Is0D z_U``v{=wmHdH;QTetv#&d3F5xeS3d@|ImM0y{^0L?fu<(kFV7-F);jN_%toB?&sgM z2l_>-D;_lQn7w$=Ea0Z`utg*+<6)~r+KPv5GG#9&KWtZM(|FXOGA-j#r^d1skGgcW zy?E5kFPEXvD9)L|)bQu$^2dGu9==G - - - -QP/lwIP--CGI Demo - - - - - - - - - - - - - - -
Quantum Leaps - innovating embedded systems - - Quantum Leaps, LLC
- info@state-machine.com
- www.state-machine.com -
- - - -

About CGI Support

- -QP-lwIP - -

The HTTP server that comes with lwIP has been extended to support rudimentary Common Gateway Interface (CGI) facility. To enable the CGI support in the lwIP-HTTP server, you need to define the macro INCLUDE_HTTPD_CGI in the lwipopts.h header file. You must also provide the mapping between CGI requests (strings) and CGI callback functions and register this mapping by calling the http_set_cgi_handlers() function. -

- -Application Note (1.4MB PDF) - -

The CGI implemented in the lwIP-HTTP works currently only with the GET method, which encodes all parameters within the URI rather than in a block following the request. Attempts to use the POST method will result in the request being ignored. -

-

After receiving a CGI request, the lwIP-HTTP server will scan all registered requests (strings) and call the corresponding CGI callback function, if the match is found. The lwIP-HTTP server will also parse the CGI request parameters and will pass them to the CGI callback function. Currently the maximum number of CGI parameters cannot exceed 16, but you can re-define this limit by changing the macro MAX_CGI_PARAMS in the http.h header file. -

-

Please refer to the Quantum Leaps Application Note: "QP and lwIP TCP/IP Stack" for more information. The Application Note in PDF is provided in the QP-lwIP example code. -

- - -

CGI Example

- -

The following form demonstrates sending commands to your embedded target via the lwIP-HTTP server. The form contains a text control, which allows you to type some text to be displayed on the screen in the target board. You send the command by pressing the Submit button. In response, the lwIP-HTTP server will execute the command in the target and will serve the thank_you.htm page. -

- -
- - - - - - - - -
CGI Example -
  Screen text:  - -     -
-
-
-
- - - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/AN_QP_and_lwIP.jpg b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/AN_QP_and_lwIP.jpg deleted file mode 100644 index b31ef879d0326309b3b9a614c919770fef680126..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7562 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 L@%};caq+(ZS2<&G diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/PSiCC2.gif b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/PSiCC2.gif deleted file mode 100644 index 877e814aeffab82ff5b98bf648b6a4a78e921316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6515 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 diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/arrow.gif b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/arrow.gif deleted file mode 100644 index e0878bea15667cdea9a457999f222acb2c2402c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53 zcmZ?wbhEHbWM|-HXkcVuFh2AD|9{1wEI=kBgAM}_fMgh$czXI97G|AW)bjc&H#dVd E0At1uO8@`> diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/favicon.ico b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/favicon.ico deleted file mode 100644 index f83a46f2db2db10d88e07c45b520ee76c4202f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{dr;I>6vsaVKFSA}%9=by645{bLBQl;nA*d@6-5`=5JYxY6uLY_c^Rn-2q+2$ zB$&WZHbx_)DcRU8j51PLNyaqJkd%%?Q%w!ofX(f${l`py_fO|H=bm%!{hjmsp2zQk zjd~m$ctmLvz)@)n6K{_=2j5#diJT#+542?#$qaOy;_z;X zCmjsm>SOI3`0i`T$9Zuq<`x^hB`xcmh;afR1{L1Ze0#2uEw0dMh~m?d6qQf9`u=Y! zMkf}tk^5g=W!nnL-e3(EMKmT)Xip5n5M_vzBV{CFk`M2`p^-p+r zgBLeHA4cyE_il94qzfTQ>DthbXk0ms&U2SlAA3oSkaXo}xpp*%%mwhr?-HS;8z;G5 zo3C)`@#P1klpHCzO+SPrI<8!O3+Q*}}tXe;R{-=%PsP`Lz#hKBecDU=$2xYKii zS|zsz4{}0DUC0mzc1T7?N9jn7P;#{()dBvnEZsfKQq z;`=vyIji$mxmPeUGD4XB17e+_V&4D_L3ViX4tED7voWfk{z80!R5K+gFnmc3CtWPU!#ipHv{p!#Va?wYPU;Nal+Qz(l{41@ZB9cD0)~y}e$;O#2lRckNueBxc6s z=;irSr-nNg7uZJ@CLbs)aceEL%MYH{-0;Thhk{le+PG+bYr^UXy|Gfv5oUvUN%!jM zxx1g+CuTW3X0=Z~nSFS>r+=adcU)?>=ltNgv*<+VKPm6eygkNp6R(y r<+;yR31m#LZJG8=S=qs;P<3C8C-uv4#TJTf#-IGVZGG43WA*(Th-o*d diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/footer.jpg b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/footer.jpg deleted file mode 100644 index 765f1fe1245a7109417f93e1fb7f34194880eac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 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 diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_ql.jpg b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_ql.jpg deleted file mode 100644 index 3dbecece1ed046fbdc29c777b568e21d2d7b0501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9661 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 diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_sics.gif b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/img/logo_sics.gif deleted file mode 100644 index fcab3b861d9a2850d0539527ea7a5b4b873203a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2152 zcmV-u2$%OqNk%w1VR!&F0OkMym6eq;GBW9sn%o;L>gwu>ii+P$SZ;1^EG#S_ARuyb za>ByGnVFffv9S{q6QZJ`*x1;Tl9H^ftYu|o{Qv*sLsF)uriF!txw*Lt3JUn~@_l`M z^z`(psj0QKwbs_wU0q#zdV1d8-aS1%YHDg&SXfe0QuW^9VPRn!8XDZ(+~ecpNl8iW zw7SsH(B*@T?d|R6=H}fqME2(C`tI%>9UbxU@%7>4MMXv0+S=bGHqOq@O-)TDB_(!t zcFW7lj*gDqCN{;z#h#v?=!=xo)6?y$vEbm~%*@OX$`uh6){r&Fl?(_5W`T6<&{{H;@{QLX+@9*#S_V)Vy z{{R2}`TYLhFGBnG`01po{QUj$*W2JAG~iEM;ZkGXDLMcE0RR90A^8LV00000EC2ui z0C)g3000O7fPaF6goTEOh>41ejE#<|ZX=fa0ZI_5{la-!`Xh=XHBRw@W zJpnul77%Hl761&lxBw5Lk1GuuPa_CD2|WlSB~cAWkZvv!s0azH0W1d(A8w;?KnQ-{ z;Njm+0Z<=?WC`NnDP@i^08JU|^chJ7B8waV0Z#Pc3Vg?Wc4|(WOk)D$#9nLUHbD(3#0O$TVqz5q(n*tO~T0Eep&<2?Ydk9%H0cXVy zf>y3;c__ySpC&I5Qh@Yd1Vsg!{*w^Y;81smsKk`|56U10T-QBCRAgS*a8y-V6-Sg% z1G8uU*LnSOWNX~9hfu^tTlFDULR8@H4L6tRU_W>Zt+2b!L5TuGh7=%?L@>CtLfQTm zlq1Dqxqsl)sOZ4Ng~&iijIjJIF(C^TClENaLP`^Vm;18Z{H6&`Ckb$%IB;MBiyo}M zdBsriNsL1=9VDnDNPtB~-+~kAyfVWC&{%`Q4F%Byms%R}^A~21a~gKm`VTVT1;Y z7c?mMF{|Kqa#LslR}su;O62WW>7#u3rh?z1{jczF~AZnSc!-fCZ$jSlcOwv zQwkw)xJaOWKs3aeDj-UM00V&0$E&dRp~V;iSZat1hLWbhik8H|5l$IAv6CXC4*Ew= z*fn{_0A9rEtQTV#Va6PWv|%Q&CScJCBo|190~U!C%fTNluCwJJH^`uav+RN)#tevn z)zkLXmK#RdhlUuAqymD5`~Xsan=Fy0mv2`E2vyUn1ak8Ll7f78-y4%B!X#J zDDbjKl3`82@5L#gafHeV#4*STTr}G=tU=Tfh9X1ciqsR@G~$70Tqz|pcr>e=0vv

0r-Tmr#FJ~<(%hecmWbd3**J}U2@DK0EYk*o4;7|f{{+w^t5T;cK^SN-i$ryg5F*&X8pyB% zOEBjk0xJXoYLEp;r~!FD6hRx3_=gX?E(Kw<1RSD}ffStK3_aKYZ#M2Jr(^hJyuhOoR$HfW{h7(jX21g3%E1w1=>*5TFD{5*o0_LU@TDJWwAS1#z8@ zIAH`p_yGYJ(grfbKnMkp$2x4O%5NZ`0}M$72@VoFKoTebStx=?29bsxoX9EB(+nYC z&_~i3LmIE+=9mz0fgMO~5N-ItG3fz4b0Q=GBQQY;SbzXm7A{rAIuI2cdKP^mqy`Bs z0S_8l5hrxfpodXfJY{4Ed3^>P7ClUM4iU_~IDkVDJp|HD>W7r>B?CkR<^YlMpUw&D zK!cFN>!f1SxBws#Y48C>O;UiRE%Fcxs3%uy@W=`6rJ#z%Z~>3Fl7UAyWSNJs!Q|qS zf(!gf5Fao>STb-_M^J$UO9h7$OyEhMmI|nb$N_hxf&d_J$`C@}L0rMXf}CD11Oa$m z0!R=`esRPJkd16j@p=dX48a6wtOo)PfQ4Ni;sa2qOhsxifdy>K6KN2E2O{8u34j0u zB-p?M{HcgGr~m@E%`I+KP|QWFVFw*3fC5~Lg4hB810oouBigV63;-Ymt_8saLLh}J e;B14~&8~L0%iZpJ_q*T?uXx8x-tsac5CA*7__SmI diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/index.htm b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/index.htm deleted file mode 100644 index 0dbd063a1..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/index.htm +++ /dev/null @@ -1,112 +0,0 @@ - - - - -QP/lwIP integration - - - - - - - - - - - - - - -
Quantum Leaps - innovating embedded systems - - Quantum Leaps, LLC
- info@state-machine.com
- www.state-machine.com -
- - - -

About This Website

- -Application Note (1.4MB PDF) - -

This website was served by the lightweight TCP/IP stack called lwIP (version 1.4.1) running on top of the QP™ state machine framework, which are both briefly described below. -

-

The example provides an HTTP server with simple Server Side Include (SSI) and Common Gateway Interface (CGI) capability, so that dynamic web pages can be served and the pages can send data or commands to the target. Internal file system for web pages and a utility (qfsgen.exe) for generating the HTML-files and images is also provided in the QP-lwIP example code. -

-

The lwIP code is initially configured in this example to use DHCP to obtain the IP address, so it assumes the presence of a DHCP server, such as a typical Ethernet router. By modifying the lwipopts.h header file, the application can also be configured to obtain the IP address via AUTOIP (as described in RFC 3927), or to use a static IP address. The example also demonstrates UDP. A UDP test application (qudp.exe) for sending and receiving UDP packets (on Windows and Linux hosts) is provided in the QP-lwIP example code. -

-

Please refer to the Quantum Leaps Application Note: "QP and lwIP TCP/IP Stack" for more information. The Application Note in PDF is provided in the QP-lwIP example code. -

- - -

About the QP-lwIP Integration

- -QP-lwIP - -

The QP-lwIP integration has been carefully designed for hard real-time control-type applications, in which the TCP/IP stack is used to monitor and configure the device as well as to provide remote user interface (e.g., by means of a web browser). In particular, The lwIP stack, which is not preemptive, is strictly encapsulated inside a dedicated active object (LwIP-Manager), so no interrupt locking is necessary, which critical for low interrupt latency. Also, the Ethernet interrupt service routine (ISR) runs very fast and only signals the task level (the ISR does not perform lengthy copy operations at all). This means that hard-real-time processing can be done at the task level, especially when you use a preemptive QK kernel for executing your QP™ application. -

-

The QP-lwIP integration has been also carefully designed for portability. All hardware-specific code is clearly separated in the Ethernet/lwIP device driver with the clean interface to the rest of the application. -

- - -

About QP State Machine Frameworks

-QP datasheet (1.4MB PDF) - -

QP™ is a family of very lightweight, open source, state machine-based frameworks for embedded microprocessors, microcontrollers, and DSPs. QP enables developing well-structured embedded applications as a set of concurrently executing hierarchical state machines (UML statecharts). With QP, coding of modern state machines directly in C or C++ is a non-issue. No big design automation tools are needed. -

- -Practical UML Statecharts in C/C++, 2nd Ed. - -

Current versions of QP are: QP/C™ and QP/C++™, which require about 4KB of code and a few hundred bytes of RAM, and the ultra-lightweight QP-nano, which requires only 1-2KB of code and just several bytes of RAM. -

-

QP can work with or without a traditional OS/RTOS. In the standalone configuration, QP can completely replace a traditional RTOS. QP includes a simple non-preemptive scheduler and a fully preemptive kernel (QK). The QP/C and QP/C++ frameworks can also work with a traditional OS/RTOS to take advantage of existing device drivers, communication stacks, and other middleware. -

-

All versions of QP are described in detail in the book Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems by Dr. Miro Samek, (ISBN: 978-0750687065). QP has a strong user community and has been applied worldwide by some of the largest -companies in their respective industries, such as: consumer electronics, telecommunications equipment, industrial automation, transportation systems, medical devices, national defense, and many more. -

-

QP is licensed under the GPL version 2 open source license as well as under commercial closed-source licenses, which are expressly designed for users, who wish to retain the proprietary character of their code. More information about QP licensing can be found at http://www.state-machine.com/licensing. -

- - -

About lwIP TCP/IP Stack

- -SICS--home of lwIP - -

lwIP is a light-weight implementation of the TCP/IP protocol suite that was originally written by Adam Dunkels at the Computer and Networks Architectures (CAN) lab of the Swedish Institute of Computer Science but now is being actively developed by a team of developers distributed world-wide headed by Kieran Mansley. -

-

lwIP is available under a BSD-style open source license in C source code format and can be downloaded from the development homepage at http://savannah.nongnu.org/projects/lwip. The focus of the lwIP is to reduce the RAM usage while still having a full scale TCP/IP implementation. This makes lwIP suitable for use in embedded systems with tens of kilobytes of RAM and around 40 KB of code ROM. -

-

Since its release, lwIP has spurred a lot of interest and is today being used in many commercial products. lwIP has been ported to multiple platforms and operating systems and can be run either with or without an underlying OS. lwIP includes the following protocols and features: -

-
    -
  • IP (Internet Protocol) including packet forwarding over multiple network interfaces
  • -
  • ICMP (Internet Control Message Protocol) for network maintenance and debugging
  • -
  • IGMP (Internet Group Management Protocol) for multicast traffic management
  • -
  • UDP (User Datagram Protocol) including experimental UDP-lite extensions
  • -
  • TCP (Transmission Control Protocol) with congestion control, RTT estimation and fast recovery/fast retransmit
  • -
  • Native event-driven API for enhanced performance (ideal for QP)
  • -
  • DNS (Domain names resolver
  • -
  • SNMP (Simple Network Management Protocol)
  • -
  • DHCP (Dynamic Host Configuration Protocol)
  • -
  • AUTOIP (for IPv4, conform with RFC 3927)
  • -
  • PPP (Point-to-Point Protocol)
  • -
  • ARP (Address Resolution Protocol) for Ethernet
  • -
- - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/ssi_demo.shtm b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/ssi_demo.shtm deleted file mode 100644 index 698d2f0e8..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/ssi_demo.shtm +++ /dev/null @@ -1,98 +0,0 @@ - - - - -QP/lwIP--SSI Demo - - - - - - - - - - - - - - - -
Quantum Leaps - innovating embedded systems - - Quantum Leaps, LLC
- info@state-machine.com
- www.state-machine.com -
- - - -

About SSI Support

- -QP-lwIP - -

The HTTP server that comes with lwIP has been extended to support rudimentary Server Side Include (SSI) facility. To enable the SSI support in the lwIP-HTTP server, you need to define the macro INCLUDE_HTTPD_SSI in the lwipopts.h header file. - -Application Note (1.4MB PDF) - -You must also provide your SSI callback function and register it by calling the http_set_ssi_handler() function. The HTTP server will then scan each file with extension .shtml, .shtm or .ssi for the SSI tags of the form <!--#tag--> and will replace on-the-fly every recognized SSI tag with the string composed by your SSI callback function. See the HTML source code for this web page (ssi_demo.shtm) and the SSI callback function definition in lwipmgr.c. -

-

While designing your own SSI tags, remember that the tag names are limited to 8 characters and the length of the replacement strings cannot exceed 192 characters. You can re-define these limits by changing the macros MAX_TAG_NAME_LEN and MAX_TAG_INSERT_LEN, respectively, in the http.h header file. -

-

Please refer to the Quantum Leaps Application Note: "QP and lwIP TCP/IP Stack" for more information. The Application Note is included in the QP-lwIP example code download. -

- - -

SSI Example

-

The following table contains SSI tags embedded in the HTML of this web page. Client browsers never see these tags, as the lwIP-HTTP server replaces them on-the-fly while serving this page. These particular SSI tags cause the target to generate various lwIP link statistics. Please click the Refresh button on your browser to cause re-loading of this page and updating the statistics: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
SSI Example -
Packets sent:
Packets received:
Packets forwarded:
Packets dropped:
Checksum errors:
Packets with invalid length:
Memory errors:
Routing errors:
Protocol errors:
Option errors:
Miscallaneous errors:
-
-

NOTE: the webpage loads much slower than the others, because it contains 12 SSI tags, and each tag is sent is a separate TCP/IP packet. -

-
- - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/style.css b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/style.css deleted file mode 100644 index 126c71aa1..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/style.css +++ /dev/null @@ -1,27 +0,0 @@ -html {height:100%;} -/* fix scrollbar to always scroll */ -html {overflow-Y: scroll; } -body { - background-color:#fff; - font-family: Arial, Helvetica, sans-serif; - font-size:12px; - color: #666; - margin:15px; - padding:0; - text-align: left; -} - -p {margin-bottom: 6px;} -img {border:none;} -h1 {font-size:22px; font-weight:normal; color:#000099; padding:10px 0 0px 0;} -h2 {font-size:18px; font-weight:normal; color:#000099; padding:10px 0 0px 0;} -h3 {font-size:14px; font-weight:bold; color:#000099; padding:10px 0 0px 0;} -ul {list-style-position:outside; margin-left:20px;} -ol {list-style-position:outside; margin-left:20px;} -strong {font-weight:bold; color:#009; } - -#menu {color: #fff; } -#menu a {color: #fff; } -#footer {margin:0 auto; padding-top:1px; text-align:center; background:url(bg_footer.gif) no-repeat top center;} - #footer p {line-height:18px; font-size:11px;} - #footer p a {color: #666;} diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/thank_you.htm b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/thank_you.htm deleted file mode 100644 index 9e0fc1ce8..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/thank_you.htm +++ /dev/null @@ -1,52 +0,0 @@ - - - - -QP/lwIP--Tahnk You - - - - - - - - - - - - - - -
Quantum Leaps - innovating embedded systems - - Quantum Leaps, LLC
- info@state-machine.com
- www.state-machine.com -
- - -QP-lwIP - - -

Thank You, It Worked!

- -

Your CGI request has been processed. You should see your text on the screen of the target board. -


-
- - - - - diff --git a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/udp_demo.htm b/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/udp_demo.htm deleted file mode 100644 index 7f7958825..000000000 --- a/examples/lwip/arm-cm/lwip_ek-lm3s6965/website/udp_demo.htm +++ /dev/null @@ -1,78 +0,0 @@ - - - - -QP/lwIP--UDP Demo - - - - - - - - - - - - - - - -
Quantum Leaps - innovating embedded systems - - Quantum Leaps, LLC
- info@state-machine.com
- www.state-machine.com -
- - - -

UDP Example

- -QP-lwIP - -

The example application opens a UDP connection at the port 777. Any UDP packets sent to that connection are interpreted as text to display on the LCD. The application responds back to the sender with a UDP packet that contains the original text plus the prepened sequence number. Obviously, the simple text format is used for simplicity. In real-life applications binary format could be more efficient. -

- -Application Note (1.4MB PDF) - -

To facilitate testing of UDP connectivity, a simple console application called qudp for Windows or Linux hosts is provided in the QP-lwIP example code. The following listing shows an example output generated from the qudp application: - -

-C:\software\qpcpp\tools\qudp\win32\vc6>Debug\qudp 192.168.0.100
-qudp utility (c) Quantum Leaps, LLC, www.state-machine.com
-Opening and binding local socket at port=1777...ready
-Remote UDP connection: IP-address=192.168.0.100, port=777
-Type command(s); press Enter to send command, ESC to quit
-Hello
-Sending:  "Hello"
-Received: "Hello-1"
-How are
-Sending:  "How are"
-Received: "How are-2"
-you?
-Sending:  "you?"
-Received: "you?-3"
-Done.
-
- -

Please refer to the Quantum Leaps Application Note: "QP and lwIP TCP/IP Stack" for more information. The Application Note in PDF is provided in the QP-lwIP example code. -

-
- - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/blinky.cpp b/examples/msp430/blinky_msp-exp430f5529lp/blinky.cpp deleted file mode 100644 index d20e75840..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/blinky.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last Updated for Version: 5.8.0 -// Date of the Last Update: 2016-11-30 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -//Q_DEFINE_THIS_FILE - -//............................................................................ -class Blinky : public QActive { -private: - QTimeEvt m_timeEvt; - -public: - Blinky(); - -protected: - static QState initial(Blinky * const me, QEvt const * const e); - static QState off(Blinky * const me, QEvt const * const e); - static QState on(Blinky * const me, QEvt const * const e); -}; - -// local objects ------------------------------------------------------------- -Blinky l_blinky; - -// global objects ------------------------------------------------------------ -QActive * const AO_Blinky = &l_blinky; // opaque pointer - -//............................................................................ -Blinky::Blinky() - : QActive(Q_STATE_CAST(&Blinky::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{ - // empty -} - -// HSM definition ------------------------------------------------------------ -QState Blinky::initial(Blinky * const me, QEvt const * const e) { - Q_UNUSED_PAR(e); - - // arm the time event to expire in half a second and every half second - me->m_timeEvt.armX(BSP::TICKS_PER_SEC/2U, BSP::TICKS_PER_SEC/2U); - return Q_TRAN(&off); -} -//............................................................................ -QState Blinky::off(Blinky * const me, QEvt const * const e) { - QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOff(); - status = Q_HANDLED(); - break; - } - case TIMEOUT_SIG: { - status = Q_TRAN(&on); - break; - } - default: { - status = Q_SUPER(&QHsm::top); - break; - } - } - return status; -} -//............................................................................ -QState Blinky::on(Blinky * const me, QEvt const * const e) { - QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOn(); - status = Q_HANDLED(); - break; - } - case TIMEOUT_SIG: { - status = Q_TRAN(&off); - break; - } - default: { - status = Q_SUPER(&QHsm::top); - break; - } - } - return status; -} diff --git a/examples/msp430/blinky_msp-exp430f5529lp/blinky.hpp b/examples/msp430/blinky_msp-exp430f5529lp/blinky.hpp deleted file mode 100644 index 3a71fa24d..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/blinky.hpp +++ /dev/null @@ -1,49 +0,0 @@ -//============================================================================ -// Product: Simple Blinky example -// Last Updated for Version: 5.8.0 -// Date of the Last Update: 2016-11-30 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BLINKY_HPP -#define BLINKY_HPP - -using namespace QP; - -enum BlinkySignals { - DUMMY_SIG = Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -extern QActive * const AO_Blinky; // opaque pointer - -#endif // BLINKY_HPP diff --git a/examples/msp430/blinky_msp-exp430f5529lp/bsp.hpp b/examples/msp430/blinky_msp-exp430f5529lp/bsp.hpp deleted file mode 100644 index f51a0fd76..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/bsp.hpp +++ /dev/null @@ -1,51 +0,0 @@ -//============================================================================ -// Product: Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void terminate(std::int16_t const result); - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/msp430/blinky_msp-exp430f5529lp/main.cpp b/examples/msp430/blinky_msp-exp430f5529lp/main.cpp deleted file mode 100644 index 655d466e5..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/bsp.cpp b/examples/msp430/blinky_msp-exp430f5529lp/qk/bsp.cpp deleted file mode 100644 index ba69270a3..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/bsp.cpp +++ /dev/null @@ -1,213 +0,0 @@ -//============================================================================ -// Product: "Blinky" example on MSP-EXP430F5529LP board, preemptive QK kernel -// Last updated for version 7.3.0 -// Last updated on 2023-08-31 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Application interface -#include "bsp.hpp" // Board Support Package - -#include // MSP430 variant used -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t BSP_MCK {1000000U}; -constexpr std::uint32_t BSP_SMCLK {1000000U}; - -constexpr std::uint32_t LED1 {1U << 0U}; -constexpr std::uint32_t LED2 {1U << 7U}; - -constexpr std::uint32_t BTN_S1 {1U << 1U}; - -#ifdef Q_SPY - // UART1 pins TX:P4.4, RX:P4.5 - constexpr std::uint32_t TXD {1U << 4U}; - constexpr std::uint32_t RXD {1U << 5U}; - - // QSpy source IDs - static QP::QSpyId const l_timer0_ISR = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - P4OUT |= LED2; // turn LED2 on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - WDTCTL = 0xDEAD; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs -------------------------------------------------------------------- - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void TIMER0_A0_ISR(void); // prototype - #pragma vector=TIMER0_A0_VECTOR - __interrupt void TIMER0_A0_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(TIMER0_A0_VECTOR))) - void TIMER0_A0_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - QK_ISR_ENTRY(); // inform QK about entering the ISR - - QTimeEvt::TICK_X(0U, nullptr); // time events at rate 0 - - QK_ISR_EXIT(); // inform QK about exiting the ISR - -#ifdef NDEBUG - __low_power_mode_off_on_exit(); // turn the low-power mode OFF, NOTE1 -#endif -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer - - // leave the MCK and SMCLK at default DCO setting - - // configure pins for LEDs - P1DIR |= LED1; // set LED1 pin to output - P4DIR |= LED2; // set LED2 pin to output -} -//............................................................................ -void start() { - // publish-subscribe not used, no call to QActive::psInit() - // dynamic event allocation not used, no call to QF::poolInit() - - // instantiate and start the active objects... - static QEvt const *blinkyQSto[10]; // Event queue storage for Blinky - AO_Blinky->start(1U, // priority - blinkyQSto, Q_DIM(blinkyQSto), // event queue - nullptr, 0U); // stack (unused) -} -//............................................................................ -void ledOn() { - P1OUT |= LED1; -} -//............................................................................ -void ledOff() { - P1OUT &= ~LED1; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - TA0CCTL0 = CCIE; // CCR0 interrupt enabled - TA0CCR0 = BSP_MCK / BSP::TICKS_PER_SEC; - TA0CTL = TASSEL_2 | MC_1 | TACLR; // SMCLK, upmode, clear TAR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle LED2 on and then off, see NOTE2 - QF_INT_DISABLE(); - P4OUT |= LED2; // turn LED2 on - P4OUT &= ~LED2; // turn LED2 off - QF_INT_ENABLE(); - -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MSP430 MCU. - // - __low_power_mode_1(); // enter LPM1; also ENABLES interrupts, see NOTE1 -#endif -} - -} // namespace QP - -//============================================================================ -// NOTE1: -// With the preemptive QK kernel for MSP430, the idle callback QK::onIdle() -// will execute only ONCE, if the low-power mode is not explicitly turned OFF -// in the interrupt. This might or might not be what you want. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject deleted file mode 100644 index 7edb3a5f5..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.cproject b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.cproject deleted file mode 100644 index b132ea3b1..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.cproject +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.project b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.project deleted file mode 100644 index 6dec2fd5b..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/.project +++ /dev/null @@ -1,91 +0,0 @@ - - - blinky-qk_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - copy_PARENT/src/qf - - - QP_port - 2 - copy_PARENT/ports/msp430/qk - - - QS - 2 - copy_PARENT/src/qs - - - blinky.cpp - 1 - copy_PARENT1/blinky.cpp - - - bsp.cpp - 1 - copy_PARENT12/bsp.cpp - - - bsp.h - 1 - copy_PARENT123/bsp.h - - - main.cpp - 1 - copy_PARENT1234/main.cpp - - - qk - 2 - copy_PARENT/src/qk - - - - - copy_PARENT - $%7BPARENT-1-TI_PRODUCTS_DIR%7D/qp-dev/qpcpp - - - copy_PARENT1 - $%7Bcopy_PARENT%7D/examples/msp430/blinky_msp-exp430f5529lp - - - copy_PARENT12 - $%7Bcopy_PARENT1%7D/qk - - - copy_PARENT123 - $%7Bcopy_PARENT1%7D - - - copy_PARENT1234 - $%7Bcopy_PARENT1%7D - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld deleted file mode 100644 index 46c63e7f1..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld +++ /dev/null @@ -1,460 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2019, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/* This file supports MSP430F5529 devices. */ -/* Version: 1.208 */ -/* Default linker script, for normal executables */ - -OUTPUT_ARCH(msp430) -ENTRY(_start) - -MEMORY { - SFR : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ - BSL : ORIGIN = 0x1000, LENGTH = 0x0800 - RAM : ORIGIN = 0x2400, LENGTH = 0x2000 /* END=0x43FF, size 8192 */ - USBRAM : ORIGIN = 0x1C00, LENGTH = 0x0800 - INFOMEM : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */ - INFOA : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */ - INFOB : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */ - INFOC : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */ - INFOD : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */ - ROM (rx) : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */ - HIROM (rx) : ORIGIN = 0x00010000, LENGTH = 0x000143FF - VECT1 : ORIGIN = 0xFF80, LENGTH = 0x0002 - VECT2 : ORIGIN = 0xFF82, LENGTH = 0x0002 - VECT3 : ORIGIN = 0xFF84, LENGTH = 0x0002 - VECT4 : ORIGIN = 0xFF86, LENGTH = 0x0002 - VECT5 : ORIGIN = 0xFF88, LENGTH = 0x0002 - VECT6 : ORIGIN = 0xFF8A, LENGTH = 0x0002 - VECT7 : ORIGIN = 0xFF8C, LENGTH = 0x0002 - VECT8 : ORIGIN = 0xFF8E, LENGTH = 0x0002 - VECT9 : ORIGIN = 0xFF90, LENGTH = 0x0002 - VECT10 : ORIGIN = 0xFF92, LENGTH = 0x0002 - VECT11 : ORIGIN = 0xFF94, LENGTH = 0x0002 - VECT12 : ORIGIN = 0xFF96, LENGTH = 0x0002 - VECT13 : ORIGIN = 0xFF98, LENGTH = 0x0002 - VECT14 : ORIGIN = 0xFF9A, LENGTH = 0x0002 - VECT15 : ORIGIN = 0xFF9C, LENGTH = 0x0002 - VECT16 : ORIGIN = 0xFF9E, LENGTH = 0x0002 - VECT17 : ORIGIN = 0xFFA0, LENGTH = 0x0002 - VECT18 : ORIGIN = 0xFFA2, LENGTH = 0x0002 - VECT19 : ORIGIN = 0xFFA4, LENGTH = 0x0002 - VECT20 : ORIGIN = 0xFFA6, LENGTH = 0x0002 - VECT21 : ORIGIN = 0xFFA8, LENGTH = 0x0002 - VECT22 : ORIGIN = 0xFFAA, LENGTH = 0x0002 - VECT23 : ORIGIN = 0xFFAC, LENGTH = 0x0002 - VECT24 : ORIGIN = 0xFFAE, LENGTH = 0x0002 - VECT25 : ORIGIN = 0xFFB0, LENGTH = 0x0002 - VECT26 : ORIGIN = 0xFFB2, LENGTH = 0x0002 - VECT27 : ORIGIN = 0xFFB4, LENGTH = 0x0002 - VECT28 : ORIGIN = 0xFFB6, LENGTH = 0x0002 - VECT29 : ORIGIN = 0xFFB8, LENGTH = 0x0002 - VECT30 : ORIGIN = 0xFFBA, LENGTH = 0x0002 - VECT31 : ORIGIN = 0xFFBC, LENGTH = 0x0002 - VECT32 : ORIGIN = 0xFFBE, LENGTH = 0x0002 - VECT33 : ORIGIN = 0xFFC0, LENGTH = 0x0002 - VECT34 : ORIGIN = 0xFFC2, LENGTH = 0x0002 - VECT35 : ORIGIN = 0xFFC4, LENGTH = 0x0002 - VECT36 : ORIGIN = 0xFFC6, LENGTH = 0x0002 - VECT37 : ORIGIN = 0xFFC8, LENGTH = 0x0002 - VECT38 : ORIGIN = 0xFFCA, LENGTH = 0x0002 - VECT39 : ORIGIN = 0xFFCC, LENGTH = 0x0002 - VECT40 : ORIGIN = 0xFFCE, LENGTH = 0x0002 - VECT41 : ORIGIN = 0xFFD0, LENGTH = 0x0002 - VECT42 : ORIGIN = 0xFFD2, LENGTH = 0x0002 - VECT43 : ORIGIN = 0xFFD4, LENGTH = 0x0002 - VECT44 : ORIGIN = 0xFFD6, LENGTH = 0x0002 - VECT45 : ORIGIN = 0xFFD8, LENGTH = 0x0002 - VECT46 : ORIGIN = 0xFFDA, LENGTH = 0x0002 - VECT47 : ORIGIN = 0xFFDC, LENGTH = 0x0002 - VECT48 : ORIGIN = 0xFFDE, LENGTH = 0x0002 - VECT49 : ORIGIN = 0xFFE0, LENGTH = 0x0002 - VECT50 : ORIGIN = 0xFFE2, LENGTH = 0x0002 - VECT51 : ORIGIN = 0xFFE4, LENGTH = 0x0002 - VECT52 : ORIGIN = 0xFFE6, LENGTH = 0x0002 - VECT53 : ORIGIN = 0xFFE8, LENGTH = 0x0002 - VECT54 : ORIGIN = 0xFFEA, LENGTH = 0x0002 - VECT55 : ORIGIN = 0xFFEC, LENGTH = 0x0002 - VECT56 : ORIGIN = 0xFFEE, LENGTH = 0x0002 - VECT57 : ORIGIN = 0xFFF0, LENGTH = 0x0002 - VECT58 : ORIGIN = 0xFFF2, LENGTH = 0x0002 - VECT59 : ORIGIN = 0xFFF4, LENGTH = 0x0002 - VECT60 : ORIGIN = 0xFFF6, LENGTH = 0x0002 - VECT61 : ORIGIN = 0xFFF8, LENGTH = 0x0002 - VECT62 : ORIGIN = 0xFFFA, LENGTH = 0x0002 - VECT63 : ORIGIN = 0xFFFC, LENGTH = 0x0002 - RESETVEC : ORIGIN = 0xFFFE, LENGTH = 0x0002 -} - -SECTIONS -{ - __interrupt_vector_1 : { KEEP (*(__interrupt_vector_1 )) } > VECT1 - __interrupt_vector_2 : { KEEP (*(__interrupt_vector_2 )) } > VECT2 - __interrupt_vector_3 : { KEEP (*(__interrupt_vector_3 )) } > VECT3 - __interrupt_vector_4 : { KEEP (*(__interrupt_vector_4 )) } > VECT4 - __interrupt_vector_5 : { KEEP (*(__interrupt_vector_5 )) } > VECT5 - __interrupt_vector_6 : { KEEP (*(__interrupt_vector_6 )) } > VECT6 - __interrupt_vector_7 : { KEEP (*(__interrupt_vector_7 )) } > VECT7 - __interrupt_vector_8 : { KEEP (*(__interrupt_vector_8 )) } > VECT8 - __interrupt_vector_9 : { KEEP (*(__interrupt_vector_9 )) } > VECT9 - __interrupt_vector_10 : { KEEP (*(__interrupt_vector_10)) } > VECT10 - __interrupt_vector_11 : { KEEP (*(__interrupt_vector_11)) } > VECT11 - __interrupt_vector_12 : { KEEP (*(__interrupt_vector_12)) } > VECT12 - __interrupt_vector_13 : { KEEP (*(__interrupt_vector_13)) } > VECT13 - __interrupt_vector_14 : { KEEP (*(__interrupt_vector_14)) } > VECT14 - __interrupt_vector_15 : { KEEP (*(__interrupt_vector_15)) } > VECT15 - __interrupt_vector_16 : { KEEP (*(__interrupt_vector_16)) } > VECT16 - __interrupt_vector_17 : { KEEP (*(__interrupt_vector_17)) } > VECT17 - __interrupt_vector_18 : { KEEP (*(__interrupt_vector_18)) } > VECT18 - __interrupt_vector_19 : { KEEP (*(__interrupt_vector_19)) } > VECT19 - __interrupt_vector_20 : { KEEP (*(__interrupt_vector_20)) } > VECT20 - __interrupt_vector_21 : { KEEP (*(__interrupt_vector_21)) } > VECT21 - __interrupt_vector_22 : { KEEP (*(__interrupt_vector_22)) } > VECT22 - __interrupt_vector_23 : { KEEP (*(__interrupt_vector_23)) } > VECT23 - __interrupt_vector_24 : { KEEP (*(__interrupt_vector_24)) } > VECT24 - __interrupt_vector_25 : { KEEP (*(__interrupt_vector_25)) } > VECT25 - __interrupt_vector_26 : { KEEP (*(__interrupt_vector_26)) } > VECT26 - __interrupt_vector_27 : { KEEP (*(__interrupt_vector_27)) } > VECT27 - __interrupt_vector_28 : { KEEP (*(__interrupt_vector_28)) } > VECT28 - __interrupt_vector_29 : { KEEP (*(__interrupt_vector_29)) } > VECT29 - __interrupt_vector_30 : { KEEP (*(__interrupt_vector_30)) } > VECT30 - __interrupt_vector_31 : { KEEP (*(__interrupt_vector_31)) } > VECT31 - __interrupt_vector_32 : { KEEP (*(__interrupt_vector_32)) } > VECT32 - __interrupt_vector_33 : { KEEP (*(__interrupt_vector_33)) } > VECT33 - __interrupt_vector_34 : { KEEP (*(__interrupt_vector_34)) } > VECT34 - __interrupt_vector_35 : { KEEP (*(__interrupt_vector_35)) } > VECT35 - __interrupt_vector_36 : { KEEP (*(__interrupt_vector_36)) } > VECT36 - __interrupt_vector_37 : { KEEP (*(__interrupt_vector_37)) } > VECT37 - __interrupt_vector_38 : { KEEP (*(__interrupt_vector_38)) } > VECT38 - __interrupt_vector_39 : { KEEP (*(__interrupt_vector_39)) } > VECT39 - __interrupt_vector_40 : { KEEP (*(__interrupt_vector_40)) } > VECT40 - __interrupt_vector_41 : { KEEP (*(__interrupt_vector_41)) } > VECT41 - __interrupt_vector_42 : { KEEP (*(__interrupt_vector_42)) KEEP (*(__interrupt_vector_rtc)) } > VECT42 - __interrupt_vector_43 : { KEEP (*(__interrupt_vector_43)) KEEP (*(__interrupt_vector_port2)) } > VECT43 - __interrupt_vector_44 : { KEEP (*(__interrupt_vector_44)) KEEP (*(__interrupt_vector_timer2_a1)) } > VECT44 - __interrupt_vector_45 : { KEEP (*(__interrupt_vector_45)) KEEP (*(__interrupt_vector_timer2_a0)) } > VECT45 - __interrupt_vector_46 : { KEEP (*(__interrupt_vector_46)) KEEP (*(__interrupt_vector_usci_b1)) } > VECT46 - __interrupt_vector_47 : { KEEP (*(__interrupt_vector_47)) KEEP (*(__interrupt_vector_usci_a1)) } > VECT47 - __interrupt_vector_48 : { KEEP (*(__interrupt_vector_48)) KEEP (*(__interrupt_vector_port1)) } > VECT48 - __interrupt_vector_49 : { KEEP (*(__interrupt_vector_49)) KEEP (*(__interrupt_vector_timer1_a1)) } > VECT49 - __interrupt_vector_50 : { KEEP (*(__interrupt_vector_50)) KEEP (*(__interrupt_vector_timer1_a0)) } > VECT50 - __interrupt_vector_51 : { KEEP (*(__interrupt_vector_51)) KEEP (*(__interrupt_vector_dma)) } > VECT51 - __interrupt_vector_52 : { KEEP (*(__interrupt_vector_52)) KEEP (*(__interrupt_vector_usb_ubm)) } > VECT52 - __interrupt_vector_53 : { KEEP (*(__interrupt_vector_53)) KEEP (*(__interrupt_vector_timer0_a1)) } > VECT53 - __interrupt_vector_54 : { KEEP (*(__interrupt_vector_54)) KEEP (*(__interrupt_vector_timer0_a0)) } > VECT54 - __interrupt_vector_55 : { KEEP (*(__interrupt_vector_55)) KEEP (*(__interrupt_vector_adc12)) } > VECT55 - __interrupt_vector_56 : { KEEP (*(__interrupt_vector_56)) KEEP (*(__interrupt_vector_usci_b0)) } > VECT56 - __interrupt_vector_57 : { KEEP (*(__interrupt_vector_57)) KEEP (*(__interrupt_vector_usci_a0)) } > VECT57 - __interrupt_vector_58 : { KEEP (*(__interrupt_vector_58)) KEEP (*(__interrupt_vector_wdt)) } > VECT58 - __interrupt_vector_59 : { KEEP (*(__interrupt_vector_59)) KEEP (*(__interrupt_vector_timer0_b1)) } > VECT59 - __interrupt_vector_60 : { KEEP (*(__interrupt_vector_60)) KEEP (*(__interrupt_vector_timer0_b0)) } > VECT60 - __interrupt_vector_61 : { KEEP (*(__interrupt_vector_61)) KEEP (*(__interrupt_vector_comp_b)) } > VECT61 - __interrupt_vector_62 : { KEEP (*(__interrupt_vector_62)) KEEP (*(__interrupt_vector_unmi)) } > VECT62 - __interrupt_vector_63 : { KEEP (*(__interrupt_vector_63)) KEEP (*(__interrupt_vector_sysnmi)) } > VECT63 - __reset_vector : - { - KEEP (*(__interrupt_vector_64)) - KEEP (*(__interrupt_vector_reset)) - KEEP (*(.resetvec)) - } > RESETVEC - - .lower.rodata : - { - . = ALIGN(2); - *(.lower.rodata.* .lower.rodata) - } > ROM - - .rodata : - { - . = ALIGN(2); - *(.plt) - . = ALIGN(2); - *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) - *(.rodata1) - KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) - } > ROM - - /* Note: This is a separate .rodata section for sections which are - read only but which older linkers treat as read-write. - This prevents older linkers from marking the entire .rodata - section as read-write. */ - .rodata2 : - { - . = ALIGN(2); - PROVIDE (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE (__preinit_array_end = .); - . = ALIGN(2); - PROVIDE (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - PROVIDE (__init_array_end = .); - . = ALIGN(2); - PROVIDE (__fini_array_start = .); - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE (__fini_array_end = .); - . = ALIGN(2); - *(.eh_frame_hdr) - KEEP (*(.eh_frame)) - - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin*.o(.ctors)) - - /* We don't want to include the .ctor section from from the - crtend.o file until after the sorted ctors. The .ctor section - from the crtend file contains the end of ctors marker and it - must be last */ - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - - KEEP (*crtbegin*.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } > ROM - - .upper.rodata : - { - *(.upper.rodata.* .upper.rodata) - } > HIROM - - .data : - { - . = ALIGN(2); - PROVIDE (__datastart = .); - *(.lower.data.* .lower.data) - - . = ALIGN(2); - *(.either.data.* .either.data) - - . = ALIGN(2); - KEEP (*(.jcr)) - *(.data.rel.ro.local) *(.data.rel.ro*) - *(.dynamic) - - . = ALIGN(2); - *(.data .data.* .gnu.linkonce.d.*) - KEEP (*(.gnu.linkonce.d.*personality*)) - SORT(CONSTRUCTORS) - *(.data1) - *(.got.plt) *(.got) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(2); - *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) - - . = ALIGN(2); - _edata = .; - PROVIDE (edata = .); - PROVIDE (__dataend = .); - } > RAM AT> ROM - - /* Note that crt0 assumes this is a multiple of two; all the - start/stop symbols are also assumed word-aligned. */ - PROVIDE(__romdatastart = LOADADDR(.data)); - PROVIDE (__romdatacopysize = SIZEOF(.data)); - - .bss : - { - . = ALIGN(2); - PROVIDE (__bssstart = .); - *(.lower.bss.* .lower.bss) - . = ALIGN(2); - *(.either.bss.* .either.bss) - *(.dynbss) - *(.sbss .sbss.*) - *(.bss .bss.* .gnu.linkonce.b.*) - . = ALIGN(2); - *(COMMON) - PROVIDE (__bssend = .); - } > RAM - PROVIDE (__bsssize = SIZEOF(.bss)); - - /* This section contains data that is not initialised during load - or application reset. */ - .noinit (NOLOAD) : - { - . = ALIGN(2); - PROVIDE (__noinit_start = .); - *(.noinit) - . = ALIGN(2); - PROVIDE (__noinit_end = .); - } > RAM - - /* We create this section so that "end" will always be in the - RAM region (matching .stack below), even if the .bss - section is empty. */ - .heap (NOLOAD) : - { - . = ALIGN(2); - __heap_start__ = .; - _end = __heap_start__; - PROVIDE (end = .); - KEEP (*(.heap)) - _end = .; - PROVIDE (end = .); - /* This word is here so that the section is not empty, and thus - not discarded by the linker. The actual value does not matter - and is ignored. */ - LONG(0); - __heap_end__ = .; - __HeapLimit = __heap_end__; - } > RAM - /* WARNING: Do not place anything in RAM here. - The heap section must be the last section in RAM and the stack - section must be placed at the very end of the RAM region. */ - - .stack (ORIGIN (RAM) + LENGTH(RAM)) : - { - PROVIDE (__stack = .); - *(.stack) - } - - /* This is just for crt0.S and interrupt handlers. */ - .lowtext : - { - PROVIDE (_start = .); - . = ALIGN(2); - KEEP (*(SORT(.crt_*))) - KEEP (*(.lowtext)) - } > ROM - - .lower.text : - { - . = ALIGN(2); - *(.lower.text.* .lower.text) - } > ROM - - .text : - { - . = ALIGN(2); - *(.text .stub .text.* .gnu.linkonce.t.* .text:*) - - KEEP (*(.text.*personality*)) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.interp .hash .dynsym .dynstr .gnu.version*) - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - . = ALIGN(2); - KEEP (*(.init)) - KEEP (*(.fini)) - KEEP (*(.tm_clone_table)) - } > ROM - - .upper.text : - { - . = ALIGN(2); - *(.upper.text.* .upper.text) - } > HIROM - - .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* Make sure that upper data sections are not used. */ - .upper : - { - *(.upper.bss.* .upper.bss) - *(.upper.data.* .upper.data) - ASSERT (SIZEOF(.upper) == 0, "This MCU does not support placing read/write data into high memory"); - } > HIROM - - /* The rest are all not normally part of the runtime image. */ - - .MSP430.attributes 0 : - { - KEEP (*(.MSP430.attributes)) - KEEP (*(.gnu.attributes)) - KEEP (*(__TI_build_attributes)) - } - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1. */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions. */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2. */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2. */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions. */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - - /DISCARD/ : { *(.note.GNU-stack) } -} - - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - -INCLUDE msp430f5529_symbols.ld - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.ccsproject b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.ccsproject deleted file mode 100644 index c2c0d67b4..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.cproject b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.cproject deleted file mode 100644 index 9642ff48b..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.cproject +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.project b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.project deleted file mode 100644 index 035a35fd2..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - blinky-qk_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - Q_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qk - - - blinky.cpp - 1 - PARENT-2-PROJECT_LOC/blinky.cpp - - - blinky.hpp - 1 - PARENT-2-PROJECT_LOC/blinky.hpp - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.hpp - 1 - PARENT-2-PROJECT_LOC/bsp.hpp - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - qk - 2 - PARENT-5-PROJECT_LOC/src/qk - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd b/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd deleted file mode 100644 index 6935f6910..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd +++ /dev/null @@ -1,241 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2014, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.159 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_DATA_MODEL__ - .text : {}>> FLASH /* Code */ -#else - .text : {}>> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} > FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qp_config.hpp b/examples/msp430/blinky_msp-exp430f5529lp/qp_config.hpp deleted file mode 100644 index 931dadabb..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qp_config.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration is required in the MSP430 port. - -#define QF_MAX_ACTIVE 8U -#define QF_EVENT_SIZ_SIZE 1U -#define QF_EQUEUE_CTR_SIZE 1U -#define QF_MPOOL_SIZ_SIZE 1U -#define QF_MPOOL_CTR_SIZE 1U -#define QF_TIMEEVT_CTR_SIZE 2U - -#ifdef Q_SPY -// for the Spy build configuration, enable the context-switch callback -#define QF_ON_CONTEXT_SW -#endif - -#endif // QP_CONFIG_HPP_ diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/bsp.cpp b/examples/msp430/blinky_msp-exp430f5529lp/qv/bsp.cpp deleted file mode 100644 index 2e1a082ad..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/bsp.cpp +++ /dev/null @@ -1,211 +0,0 @@ -//============================================================================ -// Product: "Blinky" example on MSP-EXP430F5529LP board, preemptive QV kernel -// Last updated for version 7.3.0 -// Last updated on 2023-08-31 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Application interface -#include "bsp.hpp" // Board Support Package - -#include // MSP430 variant used -// add other drivers if necessary... - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t BSP_MCK {1000000U}; -constexpr std::uint32_t BSP_SMCLK {1000000U}; - -constexpr std::uint32_t LED1 {1U << 0U}; -constexpr std::uint32_t LED2 {1U << 7U}; - -constexpr std::uint32_t BTN_S1 {1U << 1U}; - -#ifdef Q_SPY - // UART1 pins TX:P4.4, RX:P4.5 - constexpr std::uint32_t TXD {1U << 4U}; - constexpr std::uint32_t RXD {1U << 5U}; - - // QSpy source IDs - static QP::QSpyId const l_timer0_ISR = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - P4OUT |= LED2; // turn LED2 on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - WDTCTL = 0xDEAD; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs -------------------------------------------------------------------- - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void TIMER0_A0_ISR(void); // prototype - #pragma vector=TIMER0_A0_VECTOR - __interrupt void TIMER0_A0_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(TIMER0_A0_VECTOR))) - void TIMER0_A0_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - QTimeEvt::TICK_X(0U, nullptr); // time events at rate 0 - -#ifdef NDEBUG - __low_power_mode_off_on_exit(); // turn the low-power mode OFF, NOTE1 -#endif -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer - - // leave the MCK and SMCLK at default DCO setting - - // configure pins for LEDs - P1DIR |= LED1; // set LED1 pin to output - P4DIR |= LED2; // set LED2 pin to output -} -//............................................................................ -void start() { - // publish-subscribe not used, no call to QActive::psInit() - // dynamic event allocation not used, no call to QF::poolInit() - - // instantiate and start the active objects... - static QEvt const *blinkyQSto[10]; // Event queue storage for Blinky - AO_Blinky->start(1U, // priority - blinkyQSto, Q_DIM(blinkyQSto), // event queue - nullptr, 0U); // stack (unused) -} -//............................................................................ -void ledOn() { - P1OUT |= LED1; -} -//............................................................................ -void ledOff() { - P1OUT &= ~LED1; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - TA0CCTL0 = CCIE; // CCR0 interrupt enabled - TA0CCR0 = BSP_MCK / BSP::TICKS_PER_SEC; - TA0CTL = TASSEL_2 | MC_1 | TACLR; // SMCLK, upmode, clear TAR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle(void) { // CAUTION: called with interrupts DISABLED, see NOTE1 - // toggle LED2 on and then off, see NOTE2 - P4OUT |= LED2; // turn LED2 on - P4OUT &= ~LED2; // turn LED2 off - - // NOTE: interrupts still DISABLED... -#ifdef NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MSP430 MCU. - __low_power_mode_1(); // enter LPM1; also ENABLES interrupts, see NOTE1 -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -} // namespace QP - -//============================================================================ -// NOTE1: -// With the cooperative QV kernel for MSP430, it is necessary to explicitly -// turn the low-power mode OFF in the interrupt, because the return -// from the interrupt will restore the CPU status register, which will -// re-enter the low-power mode. This, in turn, will prevent the QV event-loop -// from running. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject deleted file mode 100644 index 7edb3a5f5..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.cproject b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.cproject deleted file mode 100644 index ebb7006ad..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.cproject +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.project b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.project deleted file mode 100644 index b4931aa40..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/.project +++ /dev/null @@ -1,91 +0,0 @@ - - - blinky-qv_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - copy_PARENT/src/qf - - - QP_port - 2 - copy_PARENT/ports/msp430/qv - - - QS - 2 - copy_PARENT/src/qs - - - blinky.cpp - 1 - copy_PARENT1/blinky.cpp - - - bsp.cpp - 1 - copy_PARENT12/bsp.cpp - - - bsp.h - 1 - copy_PARENT123/bsp.h - - - main.cpp - 1 - copy_PARENT1234/main.cpp - - - qv - 2 - copy_PARENT/src/qv - - - - - copy_PARENT - $%7BPARENT-1-TI_PRODUCTS_DIR%7D/qp-dev/qpcpp - - - copy_PARENT1 - $%7Bcopy_PARENT%7D/examples/msp430/blinky_msp-exp430f5529lp - - - copy_PARENT12 - $%7Bcopy_PARENT1%7D/qv - - - copy_PARENT123 - $%7Bcopy_PARENT1%7D - - - copy_PARENT1234 - $%7Bcopy_PARENT1%7D - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld deleted file mode 100644 index 46c63e7f1..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld +++ /dev/null @@ -1,460 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2019, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/* This file supports MSP430F5529 devices. */ -/* Version: 1.208 */ -/* Default linker script, for normal executables */ - -OUTPUT_ARCH(msp430) -ENTRY(_start) - -MEMORY { - SFR : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ - BSL : ORIGIN = 0x1000, LENGTH = 0x0800 - RAM : ORIGIN = 0x2400, LENGTH = 0x2000 /* END=0x43FF, size 8192 */ - USBRAM : ORIGIN = 0x1C00, LENGTH = 0x0800 - INFOMEM : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */ - INFOA : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */ - INFOB : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */ - INFOC : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */ - INFOD : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */ - ROM (rx) : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */ - HIROM (rx) : ORIGIN = 0x00010000, LENGTH = 0x000143FF - VECT1 : ORIGIN = 0xFF80, LENGTH = 0x0002 - VECT2 : ORIGIN = 0xFF82, LENGTH = 0x0002 - VECT3 : ORIGIN = 0xFF84, LENGTH = 0x0002 - VECT4 : ORIGIN = 0xFF86, LENGTH = 0x0002 - VECT5 : ORIGIN = 0xFF88, LENGTH = 0x0002 - VECT6 : ORIGIN = 0xFF8A, LENGTH = 0x0002 - VECT7 : ORIGIN = 0xFF8C, LENGTH = 0x0002 - VECT8 : ORIGIN = 0xFF8E, LENGTH = 0x0002 - VECT9 : ORIGIN = 0xFF90, LENGTH = 0x0002 - VECT10 : ORIGIN = 0xFF92, LENGTH = 0x0002 - VECT11 : ORIGIN = 0xFF94, LENGTH = 0x0002 - VECT12 : ORIGIN = 0xFF96, LENGTH = 0x0002 - VECT13 : ORIGIN = 0xFF98, LENGTH = 0x0002 - VECT14 : ORIGIN = 0xFF9A, LENGTH = 0x0002 - VECT15 : ORIGIN = 0xFF9C, LENGTH = 0x0002 - VECT16 : ORIGIN = 0xFF9E, LENGTH = 0x0002 - VECT17 : ORIGIN = 0xFFA0, LENGTH = 0x0002 - VECT18 : ORIGIN = 0xFFA2, LENGTH = 0x0002 - VECT19 : ORIGIN = 0xFFA4, LENGTH = 0x0002 - VECT20 : ORIGIN = 0xFFA6, LENGTH = 0x0002 - VECT21 : ORIGIN = 0xFFA8, LENGTH = 0x0002 - VECT22 : ORIGIN = 0xFFAA, LENGTH = 0x0002 - VECT23 : ORIGIN = 0xFFAC, LENGTH = 0x0002 - VECT24 : ORIGIN = 0xFFAE, LENGTH = 0x0002 - VECT25 : ORIGIN = 0xFFB0, LENGTH = 0x0002 - VECT26 : ORIGIN = 0xFFB2, LENGTH = 0x0002 - VECT27 : ORIGIN = 0xFFB4, LENGTH = 0x0002 - VECT28 : ORIGIN = 0xFFB6, LENGTH = 0x0002 - VECT29 : ORIGIN = 0xFFB8, LENGTH = 0x0002 - VECT30 : ORIGIN = 0xFFBA, LENGTH = 0x0002 - VECT31 : ORIGIN = 0xFFBC, LENGTH = 0x0002 - VECT32 : ORIGIN = 0xFFBE, LENGTH = 0x0002 - VECT33 : ORIGIN = 0xFFC0, LENGTH = 0x0002 - VECT34 : ORIGIN = 0xFFC2, LENGTH = 0x0002 - VECT35 : ORIGIN = 0xFFC4, LENGTH = 0x0002 - VECT36 : ORIGIN = 0xFFC6, LENGTH = 0x0002 - VECT37 : ORIGIN = 0xFFC8, LENGTH = 0x0002 - VECT38 : ORIGIN = 0xFFCA, LENGTH = 0x0002 - VECT39 : ORIGIN = 0xFFCC, LENGTH = 0x0002 - VECT40 : ORIGIN = 0xFFCE, LENGTH = 0x0002 - VECT41 : ORIGIN = 0xFFD0, LENGTH = 0x0002 - VECT42 : ORIGIN = 0xFFD2, LENGTH = 0x0002 - VECT43 : ORIGIN = 0xFFD4, LENGTH = 0x0002 - VECT44 : ORIGIN = 0xFFD6, LENGTH = 0x0002 - VECT45 : ORIGIN = 0xFFD8, LENGTH = 0x0002 - VECT46 : ORIGIN = 0xFFDA, LENGTH = 0x0002 - VECT47 : ORIGIN = 0xFFDC, LENGTH = 0x0002 - VECT48 : ORIGIN = 0xFFDE, LENGTH = 0x0002 - VECT49 : ORIGIN = 0xFFE0, LENGTH = 0x0002 - VECT50 : ORIGIN = 0xFFE2, LENGTH = 0x0002 - VECT51 : ORIGIN = 0xFFE4, LENGTH = 0x0002 - VECT52 : ORIGIN = 0xFFE6, LENGTH = 0x0002 - VECT53 : ORIGIN = 0xFFE8, LENGTH = 0x0002 - VECT54 : ORIGIN = 0xFFEA, LENGTH = 0x0002 - VECT55 : ORIGIN = 0xFFEC, LENGTH = 0x0002 - VECT56 : ORIGIN = 0xFFEE, LENGTH = 0x0002 - VECT57 : ORIGIN = 0xFFF0, LENGTH = 0x0002 - VECT58 : ORIGIN = 0xFFF2, LENGTH = 0x0002 - VECT59 : ORIGIN = 0xFFF4, LENGTH = 0x0002 - VECT60 : ORIGIN = 0xFFF6, LENGTH = 0x0002 - VECT61 : ORIGIN = 0xFFF8, LENGTH = 0x0002 - VECT62 : ORIGIN = 0xFFFA, LENGTH = 0x0002 - VECT63 : ORIGIN = 0xFFFC, LENGTH = 0x0002 - RESETVEC : ORIGIN = 0xFFFE, LENGTH = 0x0002 -} - -SECTIONS -{ - __interrupt_vector_1 : { KEEP (*(__interrupt_vector_1 )) } > VECT1 - __interrupt_vector_2 : { KEEP (*(__interrupt_vector_2 )) } > VECT2 - __interrupt_vector_3 : { KEEP (*(__interrupt_vector_3 )) } > VECT3 - __interrupt_vector_4 : { KEEP (*(__interrupt_vector_4 )) } > VECT4 - __interrupt_vector_5 : { KEEP (*(__interrupt_vector_5 )) } > VECT5 - __interrupt_vector_6 : { KEEP (*(__interrupt_vector_6 )) } > VECT6 - __interrupt_vector_7 : { KEEP (*(__interrupt_vector_7 )) } > VECT7 - __interrupt_vector_8 : { KEEP (*(__interrupt_vector_8 )) } > VECT8 - __interrupt_vector_9 : { KEEP (*(__interrupt_vector_9 )) } > VECT9 - __interrupt_vector_10 : { KEEP (*(__interrupt_vector_10)) } > VECT10 - __interrupt_vector_11 : { KEEP (*(__interrupt_vector_11)) } > VECT11 - __interrupt_vector_12 : { KEEP (*(__interrupt_vector_12)) } > VECT12 - __interrupt_vector_13 : { KEEP (*(__interrupt_vector_13)) } > VECT13 - __interrupt_vector_14 : { KEEP (*(__interrupt_vector_14)) } > VECT14 - __interrupt_vector_15 : { KEEP (*(__interrupt_vector_15)) } > VECT15 - __interrupt_vector_16 : { KEEP (*(__interrupt_vector_16)) } > VECT16 - __interrupt_vector_17 : { KEEP (*(__interrupt_vector_17)) } > VECT17 - __interrupt_vector_18 : { KEEP (*(__interrupt_vector_18)) } > VECT18 - __interrupt_vector_19 : { KEEP (*(__interrupt_vector_19)) } > VECT19 - __interrupt_vector_20 : { KEEP (*(__interrupt_vector_20)) } > VECT20 - __interrupt_vector_21 : { KEEP (*(__interrupt_vector_21)) } > VECT21 - __interrupt_vector_22 : { KEEP (*(__interrupt_vector_22)) } > VECT22 - __interrupt_vector_23 : { KEEP (*(__interrupt_vector_23)) } > VECT23 - __interrupt_vector_24 : { KEEP (*(__interrupt_vector_24)) } > VECT24 - __interrupt_vector_25 : { KEEP (*(__interrupt_vector_25)) } > VECT25 - __interrupt_vector_26 : { KEEP (*(__interrupt_vector_26)) } > VECT26 - __interrupt_vector_27 : { KEEP (*(__interrupt_vector_27)) } > VECT27 - __interrupt_vector_28 : { KEEP (*(__interrupt_vector_28)) } > VECT28 - __interrupt_vector_29 : { KEEP (*(__interrupt_vector_29)) } > VECT29 - __interrupt_vector_30 : { KEEP (*(__interrupt_vector_30)) } > VECT30 - __interrupt_vector_31 : { KEEP (*(__interrupt_vector_31)) } > VECT31 - __interrupt_vector_32 : { KEEP (*(__interrupt_vector_32)) } > VECT32 - __interrupt_vector_33 : { KEEP (*(__interrupt_vector_33)) } > VECT33 - __interrupt_vector_34 : { KEEP (*(__interrupt_vector_34)) } > VECT34 - __interrupt_vector_35 : { KEEP (*(__interrupt_vector_35)) } > VECT35 - __interrupt_vector_36 : { KEEP (*(__interrupt_vector_36)) } > VECT36 - __interrupt_vector_37 : { KEEP (*(__interrupt_vector_37)) } > VECT37 - __interrupt_vector_38 : { KEEP (*(__interrupt_vector_38)) } > VECT38 - __interrupt_vector_39 : { KEEP (*(__interrupt_vector_39)) } > VECT39 - __interrupt_vector_40 : { KEEP (*(__interrupt_vector_40)) } > VECT40 - __interrupt_vector_41 : { KEEP (*(__interrupt_vector_41)) } > VECT41 - __interrupt_vector_42 : { KEEP (*(__interrupt_vector_42)) KEEP (*(__interrupt_vector_rtc)) } > VECT42 - __interrupt_vector_43 : { KEEP (*(__interrupt_vector_43)) KEEP (*(__interrupt_vector_port2)) } > VECT43 - __interrupt_vector_44 : { KEEP (*(__interrupt_vector_44)) KEEP (*(__interrupt_vector_timer2_a1)) } > VECT44 - __interrupt_vector_45 : { KEEP (*(__interrupt_vector_45)) KEEP (*(__interrupt_vector_timer2_a0)) } > VECT45 - __interrupt_vector_46 : { KEEP (*(__interrupt_vector_46)) KEEP (*(__interrupt_vector_usci_b1)) } > VECT46 - __interrupt_vector_47 : { KEEP (*(__interrupt_vector_47)) KEEP (*(__interrupt_vector_usci_a1)) } > VECT47 - __interrupt_vector_48 : { KEEP (*(__interrupt_vector_48)) KEEP (*(__interrupt_vector_port1)) } > VECT48 - __interrupt_vector_49 : { KEEP (*(__interrupt_vector_49)) KEEP (*(__interrupt_vector_timer1_a1)) } > VECT49 - __interrupt_vector_50 : { KEEP (*(__interrupt_vector_50)) KEEP (*(__interrupt_vector_timer1_a0)) } > VECT50 - __interrupt_vector_51 : { KEEP (*(__interrupt_vector_51)) KEEP (*(__interrupt_vector_dma)) } > VECT51 - __interrupt_vector_52 : { KEEP (*(__interrupt_vector_52)) KEEP (*(__interrupt_vector_usb_ubm)) } > VECT52 - __interrupt_vector_53 : { KEEP (*(__interrupt_vector_53)) KEEP (*(__interrupt_vector_timer0_a1)) } > VECT53 - __interrupt_vector_54 : { KEEP (*(__interrupt_vector_54)) KEEP (*(__interrupt_vector_timer0_a0)) } > VECT54 - __interrupt_vector_55 : { KEEP (*(__interrupt_vector_55)) KEEP (*(__interrupt_vector_adc12)) } > VECT55 - __interrupt_vector_56 : { KEEP (*(__interrupt_vector_56)) KEEP (*(__interrupt_vector_usci_b0)) } > VECT56 - __interrupt_vector_57 : { KEEP (*(__interrupt_vector_57)) KEEP (*(__interrupt_vector_usci_a0)) } > VECT57 - __interrupt_vector_58 : { KEEP (*(__interrupt_vector_58)) KEEP (*(__interrupt_vector_wdt)) } > VECT58 - __interrupt_vector_59 : { KEEP (*(__interrupt_vector_59)) KEEP (*(__interrupt_vector_timer0_b1)) } > VECT59 - __interrupt_vector_60 : { KEEP (*(__interrupt_vector_60)) KEEP (*(__interrupt_vector_timer0_b0)) } > VECT60 - __interrupt_vector_61 : { KEEP (*(__interrupt_vector_61)) KEEP (*(__interrupt_vector_comp_b)) } > VECT61 - __interrupt_vector_62 : { KEEP (*(__interrupt_vector_62)) KEEP (*(__interrupt_vector_unmi)) } > VECT62 - __interrupt_vector_63 : { KEEP (*(__interrupt_vector_63)) KEEP (*(__interrupt_vector_sysnmi)) } > VECT63 - __reset_vector : - { - KEEP (*(__interrupt_vector_64)) - KEEP (*(__interrupt_vector_reset)) - KEEP (*(.resetvec)) - } > RESETVEC - - .lower.rodata : - { - . = ALIGN(2); - *(.lower.rodata.* .lower.rodata) - } > ROM - - .rodata : - { - . = ALIGN(2); - *(.plt) - . = ALIGN(2); - *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) - *(.rodata1) - KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) - } > ROM - - /* Note: This is a separate .rodata section for sections which are - read only but which older linkers treat as read-write. - This prevents older linkers from marking the entire .rodata - section as read-write. */ - .rodata2 : - { - . = ALIGN(2); - PROVIDE (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE (__preinit_array_end = .); - . = ALIGN(2); - PROVIDE (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - PROVIDE (__init_array_end = .); - . = ALIGN(2); - PROVIDE (__fini_array_start = .); - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE (__fini_array_end = .); - . = ALIGN(2); - *(.eh_frame_hdr) - KEEP (*(.eh_frame)) - - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin*.o(.ctors)) - - /* We don't want to include the .ctor section from from the - crtend.o file until after the sorted ctors. The .ctor section - from the crtend file contains the end of ctors marker and it - must be last */ - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - - KEEP (*crtbegin*.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } > ROM - - .upper.rodata : - { - *(.upper.rodata.* .upper.rodata) - } > HIROM - - .data : - { - . = ALIGN(2); - PROVIDE (__datastart = .); - *(.lower.data.* .lower.data) - - . = ALIGN(2); - *(.either.data.* .either.data) - - . = ALIGN(2); - KEEP (*(.jcr)) - *(.data.rel.ro.local) *(.data.rel.ro*) - *(.dynamic) - - . = ALIGN(2); - *(.data .data.* .gnu.linkonce.d.*) - KEEP (*(.gnu.linkonce.d.*personality*)) - SORT(CONSTRUCTORS) - *(.data1) - *(.got.plt) *(.got) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(2); - *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) - - . = ALIGN(2); - _edata = .; - PROVIDE (edata = .); - PROVIDE (__dataend = .); - } > RAM AT> ROM - - /* Note that crt0 assumes this is a multiple of two; all the - start/stop symbols are also assumed word-aligned. */ - PROVIDE(__romdatastart = LOADADDR(.data)); - PROVIDE (__romdatacopysize = SIZEOF(.data)); - - .bss : - { - . = ALIGN(2); - PROVIDE (__bssstart = .); - *(.lower.bss.* .lower.bss) - . = ALIGN(2); - *(.either.bss.* .either.bss) - *(.dynbss) - *(.sbss .sbss.*) - *(.bss .bss.* .gnu.linkonce.b.*) - . = ALIGN(2); - *(COMMON) - PROVIDE (__bssend = .); - } > RAM - PROVIDE (__bsssize = SIZEOF(.bss)); - - /* This section contains data that is not initialised during load - or application reset. */ - .noinit (NOLOAD) : - { - . = ALIGN(2); - PROVIDE (__noinit_start = .); - *(.noinit) - . = ALIGN(2); - PROVIDE (__noinit_end = .); - } > RAM - - /* We create this section so that "end" will always be in the - RAM region (matching .stack below), even if the .bss - section is empty. */ - .heap (NOLOAD) : - { - . = ALIGN(2); - __heap_start__ = .; - _end = __heap_start__; - PROVIDE (end = .); - KEEP (*(.heap)) - _end = .; - PROVIDE (end = .); - /* This word is here so that the section is not empty, and thus - not discarded by the linker. The actual value does not matter - and is ignored. */ - LONG(0); - __heap_end__ = .; - __HeapLimit = __heap_end__; - } > RAM - /* WARNING: Do not place anything in RAM here. - The heap section must be the last section in RAM and the stack - section must be placed at the very end of the RAM region. */ - - .stack (ORIGIN (RAM) + LENGTH(RAM)) : - { - PROVIDE (__stack = .); - *(.stack) - } - - /* This is just for crt0.S and interrupt handlers. */ - .lowtext : - { - PROVIDE (_start = .); - . = ALIGN(2); - KEEP (*(SORT(.crt_*))) - KEEP (*(.lowtext)) - } > ROM - - .lower.text : - { - . = ALIGN(2); - *(.lower.text.* .lower.text) - } > ROM - - .text : - { - . = ALIGN(2); - *(.text .stub .text.* .gnu.linkonce.t.* .text:*) - - KEEP (*(.text.*personality*)) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.interp .hash .dynsym .dynstr .gnu.version*) - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - . = ALIGN(2); - KEEP (*(.init)) - KEEP (*(.fini)) - KEEP (*(.tm_clone_table)) - } > ROM - - .upper.text : - { - . = ALIGN(2); - *(.upper.text.* .upper.text) - } > HIROM - - .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* Make sure that upper data sections are not used. */ - .upper : - { - *(.upper.bss.* .upper.bss) - *(.upper.data.* .upper.data) - ASSERT (SIZEOF(.upper) == 0, "This MCU does not support placing read/write data into high memory"); - } > HIROM - - /* The rest are all not normally part of the runtime image. */ - - .MSP430.attributes 0 : - { - KEEP (*(.MSP430.attributes)) - KEEP (*(.gnu.attributes)) - KEEP (*(__TI_build_attributes)) - } - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1. */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions. */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2. */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2. */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions. */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - - /DISCARD/ : { *(.note.GNU-stack) } -} - - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - -INCLUDE msp430f5529_symbols.ld - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.ccsproject b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.ccsproject deleted file mode 100644 index c182d3e13..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.cproject b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.cproject deleted file mode 100644 index c98a3042c..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.cproject +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.project b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.project deleted file mode 100644 index 51151e83e..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/.project +++ /dev/null @@ -1,74 +0,0 @@ - - - blinky-qv_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qv - - - QV - 2 - PARENT-5-PROJECT_LOC/src/qv - - - blinky.cpp - 1 - PARENT-2-PROJECT_LOC/blinky.cpp - - - blinky.h - 1 - PARENT-2-PROJECT_LOC/blinky.h - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.h - 1 - PARENT-2-PROJECT_LOC/bsp.h - - - ccs - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qv - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - diff --git a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd b/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd deleted file mode 100644 index 6935f6910..000000000 --- a/examples/msp430/blinky_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd +++ /dev/null @@ -1,241 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2014, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.159 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_DATA_MODEL__ - .text : {}>> FLASH /* Code */ -#else - .text : {}>> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} > FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/bsp.hpp b/examples/msp430/dpp_msp-exp430f5529lp/bsp.hpp deleted file mode 100644 index 1c5e0b658..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/bsp.hpp +++ /dev/null @@ -1,56 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/msp430/dpp_msp-exp430f5529lp/dpp.hpp b/examples/msp430/dpp_msp-exp430f5529lp/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/msp430/dpp_msp-exp430f5529lp/dpp.qm b/examples/msp430/dpp_msp-exp430f5529lp/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/main.cpp b/examples/msp430/dpp_msp-exp430f5529lp/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/msp430/dpp_msp-exp430f5529lp/philo.cpp b/examples/msp430/dpp_msp-exp430f5529lp/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/bsp.cpp b/examples/msp430/dpp_msp-exp430f5529lp/qk/bsp.cpp deleted file mode 100644 index 4c75e63c8..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/bsp.cpp +++ /dev/null @@ -1,431 +0,0 @@ -//============================================================================ -// DPP example on MSP-EXP430F5529LP board, preemptive QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // Application interface -#include "bsp.hpp" // Board Support Package - -#include // MSP430 variant used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t BSP_MCK {1000000U}; -constexpr std::uint32_t BSP_SMCLK {1000000U}; - -constexpr std::uint32_t LED1 {1U << 0U}; -constexpr std::uint32_t LED2 {1U << 7U}; - -constexpr std::uint32_t BTN_S1 {1U << 1U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - // UART1 pins TX:P4.4, RX:P4.5 - constexpr std::uint32_t TXD {1U << 4U}; - constexpr std::uint32_t RXD {1U << 5U}; - - // QSpy source IDs - static QP::QSpyId const l_timer0_ISR = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - P4OUT |= LED2; // turn LED2 on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - WDTCTL = 0xDEAD; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs -------------------------------------------------------------------- - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void TIMER0_A0_ISR(void); // prototype - #pragma vector=TIMER0_A0_VECTOR - __interrupt void TIMER0_A0_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(TIMER0_A0_VECTOR))) - void TIMER0_A0_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - QK_ISR_ENTRY(); // inform QK about entering an ISR - - QP::QTimeEvt::TICK_X(0U, &l_timer0_ISR); // time events at rate 0 - -#ifdef Q_SPY - QS_tickTime_ += - (((BSP_SMCLK / 8) + BSP::TICKS_PER_SEC/2) / BSP::TICKS_PER_SEC) + 1; -#endif - - QK_ISR_EXIT(); // inform QK about exiting an ISR - -#ifdef NDEBUG - __low_power_mode_off_on_exit(); // turn the low-power mode OFF, NOTE1 -#endif -} -//............................................................................ -#ifdef Q_SPY - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void USCI_A1_ISR(void); /* prototype */ - #pragma vector=USCI_A1_VECTOR - __interrupt void USCI_A1_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(USCI_A1_VECTOR))) - void USCI_A1_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - // NOTE: no need to call QK_ISR_ENTRY/EXIT - - if (UCA1IV == 2U) { - std::uint16_t b = UCA1RXBUF; - QP::QS::rxPut(b); - } -} - -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer - - // leave the MCK and SMCLK at default DCO setting - - // configure pins for LEDs - P1DIR |= LED1; // set LED1 pin to output - P4DIR |= LED2; // set LED2 pin to output - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_timer0_ISR); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 1U, APP::N_PHILO), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 1U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { // is Philo eating? - P1OUT |= LED1; // turn LED1 on - } - else { - P1OUT &= ~LED1; // turn LED1 off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //P1OUT |= LED1; - } - else { - //P1OUT &= ~LED1; - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - //P1OUT |= LED1; -} -//............................................................................ -void ledOff() { - //P1OUT &= ~LED1; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - TA0CCTL0 = CCIE; // CCR0 interrupt enabled - TA0CCR0 = BSP_MCK / BSP::TICKS_PER_SEC; - TA0CTL = TASSEL_2 | MC_1 | TACLR; // SMCLK, upmode, clear TAR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - // toggle LED2 on and then off, see NOTE2 - QF_INT_DISABLE(); - P4OUT |= LED2; // turn LED2 on - P4OUT &= ~LED2; // turn LED2 off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((UCA1STAT & UCBUSY) == 0U) { // TX NOT busy? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { - UCA1TXBUF = b; // stick the byte to the TX BUF - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MSP430 MCU. - // - __low_power_mode_1(); // enter LPM1; also ENABLES interrupts, see NOTE1 -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[256]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[64]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // USCI setup code... - P4SEL |= (RXD | TXD); // select the UART function for the pins - UCA1CTL1 |= UCSWRST; // reset USCI state machine - UCA1CTL1 |= UCSSEL_2; // choose the SMCLK clock -#if 0 // 9600 baud rate - UCA1BR0 = 6; // 1MHz 9600 (see User's Guide) - UCA1BR1 = 0; // 1MHz 9600 */ - // modulationUCBRSx=0, UCBRFx=0, oversampling - UCA1MCTL = UCBRS_0 | UCBRF_13 | UCOS16; -#else // 115200 baud rate - UCA1BR0 = 9; // 1MHz 115200 (see User's Guide) - UCA1BR1 = 0; // 1MHz 115200 - UCA1MCTL |= UCBRS_1 | UCBRF_0; // modulation UCBRSx=1, UCBRFx=0 -#endif - UCA1CTL1 &= ~UCSWRST; // initialize USCI state machine - UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((TA0CTL & TAIFG) == 0U) { /* interrupt not pending? */ - return QS_tickTime_ + TA0R; - } - else { /* the rollover occurred, but the timerA_ISR did not run yet */ - return QS_tickTime_ - + (((BSP_SMCLK/8U) + BSP::TICKS_PER_SEC/2U) - / BSP::TICKS_PER_SEC) + 1U - + TA0R; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UCA1STAT & UCBUSY) != 0U) { // TX busy? - } - UCA1TXBUF = b; // stick the byte to the TX BUF - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - WDTCTL = 0xDEAD; -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject deleted file mode 100644 index c2c0d67b4..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.cproject b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.cproject deleted file mode 100644 index 242133268..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.cproject +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.project b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.project deleted file mode 100644 index ec24d76a1..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/.project +++ /dev/null @@ -1,79 +0,0 @@ - - - dpp-qk_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qk - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.h - 1 - PARENT-2-PROJECT_LOC/bsp.h - - - dpp.h - 1 - PARENT-2-PROJECT_LOC/dpp.h - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qk - 2 - PARENT-5-PROJECT_LOC/src/qk - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld deleted file mode 100644 index 46c63e7f1..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-gnu/msp430f5529.ld +++ /dev/null @@ -1,460 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2019, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/* This file supports MSP430F5529 devices. */ -/* Version: 1.208 */ -/* Default linker script, for normal executables */ - -OUTPUT_ARCH(msp430) -ENTRY(_start) - -MEMORY { - SFR : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ - BSL : ORIGIN = 0x1000, LENGTH = 0x0800 - RAM : ORIGIN = 0x2400, LENGTH = 0x2000 /* END=0x43FF, size 8192 */ - USBRAM : ORIGIN = 0x1C00, LENGTH = 0x0800 - INFOMEM : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */ - INFOA : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */ - INFOB : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */ - INFOC : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */ - INFOD : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */ - ROM (rx) : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */ - HIROM (rx) : ORIGIN = 0x00010000, LENGTH = 0x000143FF - VECT1 : ORIGIN = 0xFF80, LENGTH = 0x0002 - VECT2 : ORIGIN = 0xFF82, LENGTH = 0x0002 - VECT3 : ORIGIN = 0xFF84, LENGTH = 0x0002 - VECT4 : ORIGIN = 0xFF86, LENGTH = 0x0002 - VECT5 : ORIGIN = 0xFF88, LENGTH = 0x0002 - VECT6 : ORIGIN = 0xFF8A, LENGTH = 0x0002 - VECT7 : ORIGIN = 0xFF8C, LENGTH = 0x0002 - VECT8 : ORIGIN = 0xFF8E, LENGTH = 0x0002 - VECT9 : ORIGIN = 0xFF90, LENGTH = 0x0002 - VECT10 : ORIGIN = 0xFF92, LENGTH = 0x0002 - VECT11 : ORIGIN = 0xFF94, LENGTH = 0x0002 - VECT12 : ORIGIN = 0xFF96, LENGTH = 0x0002 - VECT13 : ORIGIN = 0xFF98, LENGTH = 0x0002 - VECT14 : ORIGIN = 0xFF9A, LENGTH = 0x0002 - VECT15 : ORIGIN = 0xFF9C, LENGTH = 0x0002 - VECT16 : ORIGIN = 0xFF9E, LENGTH = 0x0002 - VECT17 : ORIGIN = 0xFFA0, LENGTH = 0x0002 - VECT18 : ORIGIN = 0xFFA2, LENGTH = 0x0002 - VECT19 : ORIGIN = 0xFFA4, LENGTH = 0x0002 - VECT20 : ORIGIN = 0xFFA6, LENGTH = 0x0002 - VECT21 : ORIGIN = 0xFFA8, LENGTH = 0x0002 - VECT22 : ORIGIN = 0xFFAA, LENGTH = 0x0002 - VECT23 : ORIGIN = 0xFFAC, LENGTH = 0x0002 - VECT24 : ORIGIN = 0xFFAE, LENGTH = 0x0002 - VECT25 : ORIGIN = 0xFFB0, LENGTH = 0x0002 - VECT26 : ORIGIN = 0xFFB2, LENGTH = 0x0002 - VECT27 : ORIGIN = 0xFFB4, LENGTH = 0x0002 - VECT28 : ORIGIN = 0xFFB6, LENGTH = 0x0002 - VECT29 : ORIGIN = 0xFFB8, LENGTH = 0x0002 - VECT30 : ORIGIN = 0xFFBA, LENGTH = 0x0002 - VECT31 : ORIGIN = 0xFFBC, LENGTH = 0x0002 - VECT32 : ORIGIN = 0xFFBE, LENGTH = 0x0002 - VECT33 : ORIGIN = 0xFFC0, LENGTH = 0x0002 - VECT34 : ORIGIN = 0xFFC2, LENGTH = 0x0002 - VECT35 : ORIGIN = 0xFFC4, LENGTH = 0x0002 - VECT36 : ORIGIN = 0xFFC6, LENGTH = 0x0002 - VECT37 : ORIGIN = 0xFFC8, LENGTH = 0x0002 - VECT38 : ORIGIN = 0xFFCA, LENGTH = 0x0002 - VECT39 : ORIGIN = 0xFFCC, LENGTH = 0x0002 - VECT40 : ORIGIN = 0xFFCE, LENGTH = 0x0002 - VECT41 : ORIGIN = 0xFFD0, LENGTH = 0x0002 - VECT42 : ORIGIN = 0xFFD2, LENGTH = 0x0002 - VECT43 : ORIGIN = 0xFFD4, LENGTH = 0x0002 - VECT44 : ORIGIN = 0xFFD6, LENGTH = 0x0002 - VECT45 : ORIGIN = 0xFFD8, LENGTH = 0x0002 - VECT46 : ORIGIN = 0xFFDA, LENGTH = 0x0002 - VECT47 : ORIGIN = 0xFFDC, LENGTH = 0x0002 - VECT48 : ORIGIN = 0xFFDE, LENGTH = 0x0002 - VECT49 : ORIGIN = 0xFFE0, LENGTH = 0x0002 - VECT50 : ORIGIN = 0xFFE2, LENGTH = 0x0002 - VECT51 : ORIGIN = 0xFFE4, LENGTH = 0x0002 - VECT52 : ORIGIN = 0xFFE6, LENGTH = 0x0002 - VECT53 : ORIGIN = 0xFFE8, LENGTH = 0x0002 - VECT54 : ORIGIN = 0xFFEA, LENGTH = 0x0002 - VECT55 : ORIGIN = 0xFFEC, LENGTH = 0x0002 - VECT56 : ORIGIN = 0xFFEE, LENGTH = 0x0002 - VECT57 : ORIGIN = 0xFFF0, LENGTH = 0x0002 - VECT58 : ORIGIN = 0xFFF2, LENGTH = 0x0002 - VECT59 : ORIGIN = 0xFFF4, LENGTH = 0x0002 - VECT60 : ORIGIN = 0xFFF6, LENGTH = 0x0002 - VECT61 : ORIGIN = 0xFFF8, LENGTH = 0x0002 - VECT62 : ORIGIN = 0xFFFA, LENGTH = 0x0002 - VECT63 : ORIGIN = 0xFFFC, LENGTH = 0x0002 - RESETVEC : ORIGIN = 0xFFFE, LENGTH = 0x0002 -} - -SECTIONS -{ - __interrupt_vector_1 : { KEEP (*(__interrupt_vector_1 )) } > VECT1 - __interrupt_vector_2 : { KEEP (*(__interrupt_vector_2 )) } > VECT2 - __interrupt_vector_3 : { KEEP (*(__interrupt_vector_3 )) } > VECT3 - __interrupt_vector_4 : { KEEP (*(__interrupt_vector_4 )) } > VECT4 - __interrupt_vector_5 : { KEEP (*(__interrupt_vector_5 )) } > VECT5 - __interrupt_vector_6 : { KEEP (*(__interrupt_vector_6 )) } > VECT6 - __interrupt_vector_7 : { KEEP (*(__interrupt_vector_7 )) } > VECT7 - __interrupt_vector_8 : { KEEP (*(__interrupt_vector_8 )) } > VECT8 - __interrupt_vector_9 : { KEEP (*(__interrupt_vector_9 )) } > VECT9 - __interrupt_vector_10 : { KEEP (*(__interrupt_vector_10)) } > VECT10 - __interrupt_vector_11 : { KEEP (*(__interrupt_vector_11)) } > VECT11 - __interrupt_vector_12 : { KEEP (*(__interrupt_vector_12)) } > VECT12 - __interrupt_vector_13 : { KEEP (*(__interrupt_vector_13)) } > VECT13 - __interrupt_vector_14 : { KEEP (*(__interrupt_vector_14)) } > VECT14 - __interrupt_vector_15 : { KEEP (*(__interrupt_vector_15)) } > VECT15 - __interrupt_vector_16 : { KEEP (*(__interrupt_vector_16)) } > VECT16 - __interrupt_vector_17 : { KEEP (*(__interrupt_vector_17)) } > VECT17 - __interrupt_vector_18 : { KEEP (*(__interrupt_vector_18)) } > VECT18 - __interrupt_vector_19 : { KEEP (*(__interrupt_vector_19)) } > VECT19 - __interrupt_vector_20 : { KEEP (*(__interrupt_vector_20)) } > VECT20 - __interrupt_vector_21 : { KEEP (*(__interrupt_vector_21)) } > VECT21 - __interrupt_vector_22 : { KEEP (*(__interrupt_vector_22)) } > VECT22 - __interrupt_vector_23 : { KEEP (*(__interrupt_vector_23)) } > VECT23 - __interrupt_vector_24 : { KEEP (*(__interrupt_vector_24)) } > VECT24 - __interrupt_vector_25 : { KEEP (*(__interrupt_vector_25)) } > VECT25 - __interrupt_vector_26 : { KEEP (*(__interrupt_vector_26)) } > VECT26 - __interrupt_vector_27 : { KEEP (*(__interrupt_vector_27)) } > VECT27 - __interrupt_vector_28 : { KEEP (*(__interrupt_vector_28)) } > VECT28 - __interrupt_vector_29 : { KEEP (*(__interrupt_vector_29)) } > VECT29 - __interrupt_vector_30 : { KEEP (*(__interrupt_vector_30)) } > VECT30 - __interrupt_vector_31 : { KEEP (*(__interrupt_vector_31)) } > VECT31 - __interrupt_vector_32 : { KEEP (*(__interrupt_vector_32)) } > VECT32 - __interrupt_vector_33 : { KEEP (*(__interrupt_vector_33)) } > VECT33 - __interrupt_vector_34 : { KEEP (*(__interrupt_vector_34)) } > VECT34 - __interrupt_vector_35 : { KEEP (*(__interrupt_vector_35)) } > VECT35 - __interrupt_vector_36 : { KEEP (*(__interrupt_vector_36)) } > VECT36 - __interrupt_vector_37 : { KEEP (*(__interrupt_vector_37)) } > VECT37 - __interrupt_vector_38 : { KEEP (*(__interrupt_vector_38)) } > VECT38 - __interrupt_vector_39 : { KEEP (*(__interrupt_vector_39)) } > VECT39 - __interrupt_vector_40 : { KEEP (*(__interrupt_vector_40)) } > VECT40 - __interrupt_vector_41 : { KEEP (*(__interrupt_vector_41)) } > VECT41 - __interrupt_vector_42 : { KEEP (*(__interrupt_vector_42)) KEEP (*(__interrupt_vector_rtc)) } > VECT42 - __interrupt_vector_43 : { KEEP (*(__interrupt_vector_43)) KEEP (*(__interrupt_vector_port2)) } > VECT43 - __interrupt_vector_44 : { KEEP (*(__interrupt_vector_44)) KEEP (*(__interrupt_vector_timer2_a1)) } > VECT44 - __interrupt_vector_45 : { KEEP (*(__interrupt_vector_45)) KEEP (*(__interrupt_vector_timer2_a0)) } > VECT45 - __interrupt_vector_46 : { KEEP (*(__interrupt_vector_46)) KEEP (*(__interrupt_vector_usci_b1)) } > VECT46 - __interrupt_vector_47 : { KEEP (*(__interrupt_vector_47)) KEEP (*(__interrupt_vector_usci_a1)) } > VECT47 - __interrupt_vector_48 : { KEEP (*(__interrupt_vector_48)) KEEP (*(__interrupt_vector_port1)) } > VECT48 - __interrupt_vector_49 : { KEEP (*(__interrupt_vector_49)) KEEP (*(__interrupt_vector_timer1_a1)) } > VECT49 - __interrupt_vector_50 : { KEEP (*(__interrupt_vector_50)) KEEP (*(__interrupt_vector_timer1_a0)) } > VECT50 - __interrupt_vector_51 : { KEEP (*(__interrupt_vector_51)) KEEP (*(__interrupt_vector_dma)) } > VECT51 - __interrupt_vector_52 : { KEEP (*(__interrupt_vector_52)) KEEP (*(__interrupt_vector_usb_ubm)) } > VECT52 - __interrupt_vector_53 : { KEEP (*(__interrupt_vector_53)) KEEP (*(__interrupt_vector_timer0_a1)) } > VECT53 - __interrupt_vector_54 : { KEEP (*(__interrupt_vector_54)) KEEP (*(__interrupt_vector_timer0_a0)) } > VECT54 - __interrupt_vector_55 : { KEEP (*(__interrupt_vector_55)) KEEP (*(__interrupt_vector_adc12)) } > VECT55 - __interrupt_vector_56 : { KEEP (*(__interrupt_vector_56)) KEEP (*(__interrupt_vector_usci_b0)) } > VECT56 - __interrupt_vector_57 : { KEEP (*(__interrupt_vector_57)) KEEP (*(__interrupt_vector_usci_a0)) } > VECT57 - __interrupt_vector_58 : { KEEP (*(__interrupt_vector_58)) KEEP (*(__interrupt_vector_wdt)) } > VECT58 - __interrupt_vector_59 : { KEEP (*(__interrupt_vector_59)) KEEP (*(__interrupt_vector_timer0_b1)) } > VECT59 - __interrupt_vector_60 : { KEEP (*(__interrupt_vector_60)) KEEP (*(__interrupt_vector_timer0_b0)) } > VECT60 - __interrupt_vector_61 : { KEEP (*(__interrupt_vector_61)) KEEP (*(__interrupt_vector_comp_b)) } > VECT61 - __interrupt_vector_62 : { KEEP (*(__interrupt_vector_62)) KEEP (*(__interrupt_vector_unmi)) } > VECT62 - __interrupt_vector_63 : { KEEP (*(__interrupt_vector_63)) KEEP (*(__interrupt_vector_sysnmi)) } > VECT63 - __reset_vector : - { - KEEP (*(__interrupt_vector_64)) - KEEP (*(__interrupt_vector_reset)) - KEEP (*(.resetvec)) - } > RESETVEC - - .lower.rodata : - { - . = ALIGN(2); - *(.lower.rodata.* .lower.rodata) - } > ROM - - .rodata : - { - . = ALIGN(2); - *(.plt) - . = ALIGN(2); - *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) - *(.rodata1) - KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) - } > ROM - - /* Note: This is a separate .rodata section for sections which are - read only but which older linkers treat as read-write. - This prevents older linkers from marking the entire .rodata - section as read-write. */ - .rodata2 : - { - . = ALIGN(2); - PROVIDE (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE (__preinit_array_end = .); - . = ALIGN(2); - PROVIDE (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - PROVIDE (__init_array_end = .); - . = ALIGN(2); - PROVIDE (__fini_array_start = .); - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE (__fini_array_end = .); - . = ALIGN(2); - *(.eh_frame_hdr) - KEEP (*(.eh_frame)) - - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin*.o(.ctors)) - - /* We don't want to include the .ctor section from from the - crtend.o file until after the sorted ctors. The .ctor section - from the crtend file contains the end of ctors marker and it - must be last */ - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - - KEEP (*crtbegin*.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } > ROM - - .upper.rodata : - { - *(.upper.rodata.* .upper.rodata) - } > HIROM - - .data : - { - . = ALIGN(2); - PROVIDE (__datastart = .); - *(.lower.data.* .lower.data) - - . = ALIGN(2); - *(.either.data.* .either.data) - - . = ALIGN(2); - KEEP (*(.jcr)) - *(.data.rel.ro.local) *(.data.rel.ro*) - *(.dynamic) - - . = ALIGN(2); - *(.data .data.* .gnu.linkonce.d.*) - KEEP (*(.gnu.linkonce.d.*personality*)) - SORT(CONSTRUCTORS) - *(.data1) - *(.got.plt) *(.got) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(2); - *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) - - . = ALIGN(2); - _edata = .; - PROVIDE (edata = .); - PROVIDE (__dataend = .); - } > RAM AT> ROM - - /* Note that crt0 assumes this is a multiple of two; all the - start/stop symbols are also assumed word-aligned. */ - PROVIDE(__romdatastart = LOADADDR(.data)); - PROVIDE (__romdatacopysize = SIZEOF(.data)); - - .bss : - { - . = ALIGN(2); - PROVIDE (__bssstart = .); - *(.lower.bss.* .lower.bss) - . = ALIGN(2); - *(.either.bss.* .either.bss) - *(.dynbss) - *(.sbss .sbss.*) - *(.bss .bss.* .gnu.linkonce.b.*) - . = ALIGN(2); - *(COMMON) - PROVIDE (__bssend = .); - } > RAM - PROVIDE (__bsssize = SIZEOF(.bss)); - - /* This section contains data that is not initialised during load - or application reset. */ - .noinit (NOLOAD) : - { - . = ALIGN(2); - PROVIDE (__noinit_start = .); - *(.noinit) - . = ALIGN(2); - PROVIDE (__noinit_end = .); - } > RAM - - /* We create this section so that "end" will always be in the - RAM region (matching .stack below), even if the .bss - section is empty. */ - .heap (NOLOAD) : - { - . = ALIGN(2); - __heap_start__ = .; - _end = __heap_start__; - PROVIDE (end = .); - KEEP (*(.heap)) - _end = .; - PROVIDE (end = .); - /* This word is here so that the section is not empty, and thus - not discarded by the linker. The actual value does not matter - and is ignored. */ - LONG(0); - __heap_end__ = .; - __HeapLimit = __heap_end__; - } > RAM - /* WARNING: Do not place anything in RAM here. - The heap section must be the last section in RAM and the stack - section must be placed at the very end of the RAM region. */ - - .stack (ORIGIN (RAM) + LENGTH(RAM)) : - { - PROVIDE (__stack = .); - *(.stack) - } - - /* This is just for crt0.S and interrupt handlers. */ - .lowtext : - { - PROVIDE (_start = .); - . = ALIGN(2); - KEEP (*(SORT(.crt_*))) - KEEP (*(.lowtext)) - } > ROM - - .lower.text : - { - . = ALIGN(2); - *(.lower.text.* .lower.text) - } > ROM - - .text : - { - . = ALIGN(2); - *(.text .stub .text.* .gnu.linkonce.t.* .text:*) - - KEEP (*(.text.*personality*)) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.interp .hash .dynsym .dynstr .gnu.version*) - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - . = ALIGN(2); - KEEP (*(.init)) - KEEP (*(.fini)) - KEEP (*(.tm_clone_table)) - } > ROM - - .upper.text : - { - . = ALIGN(2); - *(.upper.text.* .upper.text) - } > HIROM - - .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* Make sure that upper data sections are not used. */ - .upper : - { - *(.upper.bss.* .upper.bss) - *(.upper.data.* .upper.data) - ASSERT (SIZEOF(.upper) == 0, "This MCU does not support placing read/write data into high memory"); - } > HIROM - - /* The rest are all not normally part of the runtime image. */ - - .MSP430.attributes 0 : - { - KEEP (*(.MSP430.attributes)) - KEEP (*(.gnu.attributes)) - KEEP (*(__TI_build_attributes)) - } - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1. */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions. */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2. */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2. */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions. */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - - /DISCARD/ : { *(.note.GNU-stack) } -} - - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - -INCLUDE msp430f5529_symbols.ld - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.ccsproject b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.ccsproject deleted file mode 100644 index c2c0d67b4..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject deleted file mode 100644 index 749851c68..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.cproject +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.project b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.project deleted file mode 100644 index ec24d76a1..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/.project +++ /dev/null @@ -1,79 +0,0 @@ - - - dpp-qk_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qk - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.h - 1 - PARENT-2-PROJECT_LOC/bsp.h - - - dpp.h - 1 - PARENT-2-PROJECT_LOC/dpp.h - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qk - 2 - PARENT-5-PROJECT_LOC/src/qk - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd b/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd deleted file mode 100644 index 6935f6910..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qk/ccs-ti/lnk_msp430f5529.cmd +++ /dev/null @@ -1,241 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2014, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.159 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_DATA_MODEL__ - .text : {}>> FLASH /* Code */ -#else - .text : {}>> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} > FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qp_config.hpp b/examples/msp430/dpp_msp-exp430f5529lp/qp_config.hpp deleted file mode 100644 index 931dadabb..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qp_config.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration is required in the MSP430 port. - -#define QF_MAX_ACTIVE 8U -#define QF_EVENT_SIZ_SIZE 1U -#define QF_EQUEUE_CTR_SIZE 1U -#define QF_MPOOL_SIZ_SIZE 1U -#define QF_MPOOL_CTR_SIZE 1U -#define QF_TIMEEVT_CTR_SIZE 2U - -#ifdef Q_SPY -// for the Spy build configuration, enable the context-switch callback -#define QF_ON_CONTEXT_SW -#endif - -#endif // QP_CONFIG_HPP_ diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/bsp.cpp b/examples/msp430/dpp_msp-exp430f5529lp/qv/bsp.cpp deleted file mode 100644 index 71b8d238a..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/bsp.cpp +++ /dev/null @@ -1,431 +0,0 @@ -//============================================================================ -// DPP example on MSP-EXP430F5529LP board, preemptive QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include // MSP430 variant used -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t BSP_MCK {1000000U}; -constexpr std::uint32_t BSP_SMCLK {1000000U}; - -constexpr std::uint32_t LED1 {1U << 0U}; -constexpr std::uint32_t LED2 {1U << 7U}; - -constexpr std::uint32_t BTN_S1 {1U << 1U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - // UART1 pins TX:P4.4, RX:P4.5 - constexpr std::uint32_t TXD {1U << 4U}; - constexpr std::uint32_t RXD {1U << 5U}; - - // QSpy source IDs - static QP::QSpyId const l_timer0_ISR = { 0U }; - - static QP::QSTimeCtr QS_tickTime_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - P4OUT |= LED2; // turn LED2 on - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - WDTCTL = 0xDEAD; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs used in the application ============================================== - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void TIMER0_A0_ISR(void); // prototype - #pragma vector=TIMER0_A0_VECTOR - __interrupt void TIMER0_A0_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(TIMER0_A0_VECTOR))) - void TIMER0_A0_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - QP::QTimeEvt::TICK_X(0U, &l_timer0_ISR); // time events at rate 0 - -#ifdef Q_SPY - QS_tickTime_ += - (((BSP_SMCLK / 8) + BSP::TICKS_PER_SEC/2) / BSP::TICKS_PER_SEC) + 1; -#endif - -#ifdef NDEBUG - __low_power_mode_off_on_exit(); // turn the low-power mode OFF, NOTE1 -#endif -} -//............................................................................ -#ifdef Q_SPY - -#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) - __interrupt void USCI_A1_ISR(void); /* prototype */ - #pragma vector=USCI_A1_VECTOR - __interrupt void USCI_A1_ISR(void) -#elif defined(__GNUC__) - __attribute__ ((interrupt(USCI_A1_VECTOR))) - void USCI_A1_ISR(void) -#else - #error MSP430 compiler not supported! -#endif -{ - if (UCA1IV == 2U) { - std::uint16_t b = UCA1RXBUF; - QP::QS::rxPut(b); - } -} - -#endif // Q_SPY - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer - - // leave the MCK and SMCLK at default DCO setting - - // configure pins for LEDs - P1DIR |= LED1; // set LED1 pin to output - P4DIR |= LED2; // set LED2 pin to output - - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_timer0_ISR); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 1U, APP::N_PHILO), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 1U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { // is Philo eating? - P1OUT |= LED1; // turn LED1 on - } - else { - P1OUT &= ~LED1; // turn LED1 off - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - // not enough LEDs to implement this feature - if (paused != 0U) { - //P1OUT |= LED1; - } - else { - //P1OUT &= ~LED1; - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - //P1OUT |= LED1; -} -//............................................................................ -void ledOff() { - //P1OUT &= ~LED1; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ -// namespace QP -namespace QP { - -// QF callbacks... -void QF::onStartup() { - TA0CCTL0 = CCIE; // CCR0 interrupt enabled - TA0CCR0 = BSP_MCK / BSP::TICKS_PER_SEC; - TA0CTL = TASSEL_2 | MC_1 | TACLR; // SMCLK, upmode, clear TAR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE1 - // toggle LED2 on and then off, see NOTE2 - QF_INT_DISABLE(); - P4OUT |= LED2; // turn LED2 on - P4OUT &= ~LED2; // turn LED2 off - QF_INT_ENABLE(); - -#ifdef Q_SPY - QF_INT_DISABLE(); - QS::rxParse(); // parse all the received bytes - QF_INT_ENABLE(); - - if ((UCA1STAT & UCBUSY) == 0U) { // TX NOT busy? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { - UCA1TXBUF = b; // stick the byte to the TX BUF - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular MSP430 MCU. - // - __low_power_mode_1(); // enter LPM1; also ENABLES interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[256]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[64]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // USCI setup code... - P4SEL |= (RXD | TXD); // select the UART function for the pins - UCA1CTL1 |= UCSWRST; // reset USCI state machine - UCA1CTL1 |= UCSSEL_2; // choose the SMCLK clock -#if 1 // 9600 baud rate - UCA1BR0 = 6; // 1MHz 9600 (see User's Guide) - UCA1BR1 = 0; // 1MHz 9600 */ - // modulationUCBRSx=0, UCBRFx=0, oversampling - UCA1MCTL = UCBRS_0 | UCBRF_13 | UCOS16; -#else // 115200 baud rate - UCA1BR0 = 9; // 1MHz 115200 (see User's Guide) - UCA1BR1 = 0; // 1MHz 115200 - UCA1MCTL |= UCBRS_1 | UCBRF_0; // modulation UCBRSx=1, UCBRFx=0 -#endif - UCA1CTL1 &= ~UCSWRST; // initialize USCI state machine - UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((TA0CTL & TAIFG) == 0U) { /* interrupt not pending? */ - return QS_tickTime_ + TA0R; - } - else { /* the rollover occurred, but the timerA_ISR did not run yet */ - return QS_tickTime_ - + (((BSP_SMCLK/8U) + BSP::TICKS_PER_SEC/2U) - / BSP::TICKS_PER_SEC) + 1U - + TA0R; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((UCA1STAT & UCBUSY) != 0U) { // TX busy? - } - UCA1TXBUF = b; // stick the byte to the TX BUF - } - else { - break; - } - } -} -//............................................................................ -void onReset() { - WDTCTL = 0xDEAD; -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// With the cooperative QV kernel for MSP430, it is necessary to explicitly -// turn the low-power mode OFF in the interrupt, because the return -// from the interrupt will restore the CPU status register, which will -// re-enter the low-power mode. This, in turn, will prevent the QV event-loop -// from running. -// -// NOTE2: -// One of the LEDs is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject deleted file mode 100644 index c2c0d67b4..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.cproject b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.cproject deleted file mode 100644 index 0d1d1ea80..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.cproject +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.project b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.project deleted file mode 100644 index 22193c02f..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - dpp-qv_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qv - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - qv - 2 - PARENT-5-PROJECT_LOC/src/qv - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld deleted file mode 100644 index 46c63e7f1..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-gnu/msp430f5529.ld +++ /dev/null @@ -1,460 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2019, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/* This file supports MSP430F5529 devices. */ -/* Version: 1.208 */ -/* Default linker script, for normal executables */ - -OUTPUT_ARCH(msp430) -ENTRY(_start) - -MEMORY { - SFR : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ - BSL : ORIGIN = 0x1000, LENGTH = 0x0800 - RAM : ORIGIN = 0x2400, LENGTH = 0x2000 /* END=0x43FF, size 8192 */ - USBRAM : ORIGIN = 0x1C00, LENGTH = 0x0800 - INFOMEM : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */ - INFOA : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */ - INFOB : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */ - INFOC : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */ - INFOD : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */ - ROM (rx) : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */ - HIROM (rx) : ORIGIN = 0x00010000, LENGTH = 0x000143FF - VECT1 : ORIGIN = 0xFF80, LENGTH = 0x0002 - VECT2 : ORIGIN = 0xFF82, LENGTH = 0x0002 - VECT3 : ORIGIN = 0xFF84, LENGTH = 0x0002 - VECT4 : ORIGIN = 0xFF86, LENGTH = 0x0002 - VECT5 : ORIGIN = 0xFF88, LENGTH = 0x0002 - VECT6 : ORIGIN = 0xFF8A, LENGTH = 0x0002 - VECT7 : ORIGIN = 0xFF8C, LENGTH = 0x0002 - VECT8 : ORIGIN = 0xFF8E, LENGTH = 0x0002 - VECT9 : ORIGIN = 0xFF90, LENGTH = 0x0002 - VECT10 : ORIGIN = 0xFF92, LENGTH = 0x0002 - VECT11 : ORIGIN = 0xFF94, LENGTH = 0x0002 - VECT12 : ORIGIN = 0xFF96, LENGTH = 0x0002 - VECT13 : ORIGIN = 0xFF98, LENGTH = 0x0002 - VECT14 : ORIGIN = 0xFF9A, LENGTH = 0x0002 - VECT15 : ORIGIN = 0xFF9C, LENGTH = 0x0002 - VECT16 : ORIGIN = 0xFF9E, LENGTH = 0x0002 - VECT17 : ORIGIN = 0xFFA0, LENGTH = 0x0002 - VECT18 : ORIGIN = 0xFFA2, LENGTH = 0x0002 - VECT19 : ORIGIN = 0xFFA4, LENGTH = 0x0002 - VECT20 : ORIGIN = 0xFFA6, LENGTH = 0x0002 - VECT21 : ORIGIN = 0xFFA8, LENGTH = 0x0002 - VECT22 : ORIGIN = 0xFFAA, LENGTH = 0x0002 - VECT23 : ORIGIN = 0xFFAC, LENGTH = 0x0002 - VECT24 : ORIGIN = 0xFFAE, LENGTH = 0x0002 - VECT25 : ORIGIN = 0xFFB0, LENGTH = 0x0002 - VECT26 : ORIGIN = 0xFFB2, LENGTH = 0x0002 - VECT27 : ORIGIN = 0xFFB4, LENGTH = 0x0002 - VECT28 : ORIGIN = 0xFFB6, LENGTH = 0x0002 - VECT29 : ORIGIN = 0xFFB8, LENGTH = 0x0002 - VECT30 : ORIGIN = 0xFFBA, LENGTH = 0x0002 - VECT31 : ORIGIN = 0xFFBC, LENGTH = 0x0002 - VECT32 : ORIGIN = 0xFFBE, LENGTH = 0x0002 - VECT33 : ORIGIN = 0xFFC0, LENGTH = 0x0002 - VECT34 : ORIGIN = 0xFFC2, LENGTH = 0x0002 - VECT35 : ORIGIN = 0xFFC4, LENGTH = 0x0002 - VECT36 : ORIGIN = 0xFFC6, LENGTH = 0x0002 - VECT37 : ORIGIN = 0xFFC8, LENGTH = 0x0002 - VECT38 : ORIGIN = 0xFFCA, LENGTH = 0x0002 - VECT39 : ORIGIN = 0xFFCC, LENGTH = 0x0002 - VECT40 : ORIGIN = 0xFFCE, LENGTH = 0x0002 - VECT41 : ORIGIN = 0xFFD0, LENGTH = 0x0002 - VECT42 : ORIGIN = 0xFFD2, LENGTH = 0x0002 - VECT43 : ORIGIN = 0xFFD4, LENGTH = 0x0002 - VECT44 : ORIGIN = 0xFFD6, LENGTH = 0x0002 - VECT45 : ORIGIN = 0xFFD8, LENGTH = 0x0002 - VECT46 : ORIGIN = 0xFFDA, LENGTH = 0x0002 - VECT47 : ORIGIN = 0xFFDC, LENGTH = 0x0002 - VECT48 : ORIGIN = 0xFFDE, LENGTH = 0x0002 - VECT49 : ORIGIN = 0xFFE0, LENGTH = 0x0002 - VECT50 : ORIGIN = 0xFFE2, LENGTH = 0x0002 - VECT51 : ORIGIN = 0xFFE4, LENGTH = 0x0002 - VECT52 : ORIGIN = 0xFFE6, LENGTH = 0x0002 - VECT53 : ORIGIN = 0xFFE8, LENGTH = 0x0002 - VECT54 : ORIGIN = 0xFFEA, LENGTH = 0x0002 - VECT55 : ORIGIN = 0xFFEC, LENGTH = 0x0002 - VECT56 : ORIGIN = 0xFFEE, LENGTH = 0x0002 - VECT57 : ORIGIN = 0xFFF0, LENGTH = 0x0002 - VECT58 : ORIGIN = 0xFFF2, LENGTH = 0x0002 - VECT59 : ORIGIN = 0xFFF4, LENGTH = 0x0002 - VECT60 : ORIGIN = 0xFFF6, LENGTH = 0x0002 - VECT61 : ORIGIN = 0xFFF8, LENGTH = 0x0002 - VECT62 : ORIGIN = 0xFFFA, LENGTH = 0x0002 - VECT63 : ORIGIN = 0xFFFC, LENGTH = 0x0002 - RESETVEC : ORIGIN = 0xFFFE, LENGTH = 0x0002 -} - -SECTIONS -{ - __interrupt_vector_1 : { KEEP (*(__interrupt_vector_1 )) } > VECT1 - __interrupt_vector_2 : { KEEP (*(__interrupt_vector_2 )) } > VECT2 - __interrupt_vector_3 : { KEEP (*(__interrupt_vector_3 )) } > VECT3 - __interrupt_vector_4 : { KEEP (*(__interrupt_vector_4 )) } > VECT4 - __interrupt_vector_5 : { KEEP (*(__interrupt_vector_5 )) } > VECT5 - __interrupt_vector_6 : { KEEP (*(__interrupt_vector_6 )) } > VECT6 - __interrupt_vector_7 : { KEEP (*(__interrupt_vector_7 )) } > VECT7 - __interrupt_vector_8 : { KEEP (*(__interrupt_vector_8 )) } > VECT8 - __interrupt_vector_9 : { KEEP (*(__interrupt_vector_9 )) } > VECT9 - __interrupt_vector_10 : { KEEP (*(__interrupt_vector_10)) } > VECT10 - __interrupt_vector_11 : { KEEP (*(__interrupt_vector_11)) } > VECT11 - __interrupt_vector_12 : { KEEP (*(__interrupt_vector_12)) } > VECT12 - __interrupt_vector_13 : { KEEP (*(__interrupt_vector_13)) } > VECT13 - __interrupt_vector_14 : { KEEP (*(__interrupt_vector_14)) } > VECT14 - __interrupt_vector_15 : { KEEP (*(__interrupt_vector_15)) } > VECT15 - __interrupt_vector_16 : { KEEP (*(__interrupt_vector_16)) } > VECT16 - __interrupt_vector_17 : { KEEP (*(__interrupt_vector_17)) } > VECT17 - __interrupt_vector_18 : { KEEP (*(__interrupt_vector_18)) } > VECT18 - __interrupt_vector_19 : { KEEP (*(__interrupt_vector_19)) } > VECT19 - __interrupt_vector_20 : { KEEP (*(__interrupt_vector_20)) } > VECT20 - __interrupt_vector_21 : { KEEP (*(__interrupt_vector_21)) } > VECT21 - __interrupt_vector_22 : { KEEP (*(__interrupt_vector_22)) } > VECT22 - __interrupt_vector_23 : { KEEP (*(__interrupt_vector_23)) } > VECT23 - __interrupt_vector_24 : { KEEP (*(__interrupt_vector_24)) } > VECT24 - __interrupt_vector_25 : { KEEP (*(__interrupt_vector_25)) } > VECT25 - __interrupt_vector_26 : { KEEP (*(__interrupt_vector_26)) } > VECT26 - __interrupt_vector_27 : { KEEP (*(__interrupt_vector_27)) } > VECT27 - __interrupt_vector_28 : { KEEP (*(__interrupt_vector_28)) } > VECT28 - __interrupt_vector_29 : { KEEP (*(__interrupt_vector_29)) } > VECT29 - __interrupt_vector_30 : { KEEP (*(__interrupt_vector_30)) } > VECT30 - __interrupt_vector_31 : { KEEP (*(__interrupt_vector_31)) } > VECT31 - __interrupt_vector_32 : { KEEP (*(__interrupt_vector_32)) } > VECT32 - __interrupt_vector_33 : { KEEP (*(__interrupt_vector_33)) } > VECT33 - __interrupt_vector_34 : { KEEP (*(__interrupt_vector_34)) } > VECT34 - __interrupt_vector_35 : { KEEP (*(__interrupt_vector_35)) } > VECT35 - __interrupt_vector_36 : { KEEP (*(__interrupt_vector_36)) } > VECT36 - __interrupt_vector_37 : { KEEP (*(__interrupt_vector_37)) } > VECT37 - __interrupt_vector_38 : { KEEP (*(__interrupt_vector_38)) } > VECT38 - __interrupt_vector_39 : { KEEP (*(__interrupt_vector_39)) } > VECT39 - __interrupt_vector_40 : { KEEP (*(__interrupt_vector_40)) } > VECT40 - __interrupt_vector_41 : { KEEP (*(__interrupt_vector_41)) } > VECT41 - __interrupt_vector_42 : { KEEP (*(__interrupt_vector_42)) KEEP (*(__interrupt_vector_rtc)) } > VECT42 - __interrupt_vector_43 : { KEEP (*(__interrupt_vector_43)) KEEP (*(__interrupt_vector_port2)) } > VECT43 - __interrupt_vector_44 : { KEEP (*(__interrupt_vector_44)) KEEP (*(__interrupt_vector_timer2_a1)) } > VECT44 - __interrupt_vector_45 : { KEEP (*(__interrupt_vector_45)) KEEP (*(__interrupt_vector_timer2_a0)) } > VECT45 - __interrupt_vector_46 : { KEEP (*(__interrupt_vector_46)) KEEP (*(__interrupt_vector_usci_b1)) } > VECT46 - __interrupt_vector_47 : { KEEP (*(__interrupt_vector_47)) KEEP (*(__interrupt_vector_usci_a1)) } > VECT47 - __interrupt_vector_48 : { KEEP (*(__interrupt_vector_48)) KEEP (*(__interrupt_vector_port1)) } > VECT48 - __interrupt_vector_49 : { KEEP (*(__interrupt_vector_49)) KEEP (*(__interrupt_vector_timer1_a1)) } > VECT49 - __interrupt_vector_50 : { KEEP (*(__interrupt_vector_50)) KEEP (*(__interrupt_vector_timer1_a0)) } > VECT50 - __interrupt_vector_51 : { KEEP (*(__interrupt_vector_51)) KEEP (*(__interrupt_vector_dma)) } > VECT51 - __interrupt_vector_52 : { KEEP (*(__interrupt_vector_52)) KEEP (*(__interrupt_vector_usb_ubm)) } > VECT52 - __interrupt_vector_53 : { KEEP (*(__interrupt_vector_53)) KEEP (*(__interrupt_vector_timer0_a1)) } > VECT53 - __interrupt_vector_54 : { KEEP (*(__interrupt_vector_54)) KEEP (*(__interrupt_vector_timer0_a0)) } > VECT54 - __interrupt_vector_55 : { KEEP (*(__interrupt_vector_55)) KEEP (*(__interrupt_vector_adc12)) } > VECT55 - __interrupt_vector_56 : { KEEP (*(__interrupt_vector_56)) KEEP (*(__interrupt_vector_usci_b0)) } > VECT56 - __interrupt_vector_57 : { KEEP (*(__interrupt_vector_57)) KEEP (*(__interrupt_vector_usci_a0)) } > VECT57 - __interrupt_vector_58 : { KEEP (*(__interrupt_vector_58)) KEEP (*(__interrupt_vector_wdt)) } > VECT58 - __interrupt_vector_59 : { KEEP (*(__interrupt_vector_59)) KEEP (*(__interrupt_vector_timer0_b1)) } > VECT59 - __interrupt_vector_60 : { KEEP (*(__interrupt_vector_60)) KEEP (*(__interrupt_vector_timer0_b0)) } > VECT60 - __interrupt_vector_61 : { KEEP (*(__interrupt_vector_61)) KEEP (*(__interrupt_vector_comp_b)) } > VECT61 - __interrupt_vector_62 : { KEEP (*(__interrupt_vector_62)) KEEP (*(__interrupt_vector_unmi)) } > VECT62 - __interrupt_vector_63 : { KEEP (*(__interrupt_vector_63)) KEEP (*(__interrupt_vector_sysnmi)) } > VECT63 - __reset_vector : - { - KEEP (*(__interrupt_vector_64)) - KEEP (*(__interrupt_vector_reset)) - KEEP (*(.resetvec)) - } > RESETVEC - - .lower.rodata : - { - . = ALIGN(2); - *(.lower.rodata.* .lower.rodata) - } > ROM - - .rodata : - { - . = ALIGN(2); - *(.plt) - . = ALIGN(2); - *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*) - *(.rodata1) - KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) - } > ROM - - /* Note: This is a separate .rodata section for sections which are - read only but which older linkers treat as read-write. - This prevents older linkers from marking the entire .rodata - section as read-write. */ - .rodata2 : - { - . = ALIGN(2); - PROVIDE (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE (__preinit_array_end = .); - . = ALIGN(2); - PROVIDE (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - PROVIDE (__init_array_end = .); - . = ALIGN(2); - PROVIDE (__fini_array_start = .); - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE (__fini_array_end = .); - . = ALIGN(2); - *(.eh_frame_hdr) - KEEP (*(.eh_frame)) - - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin*.o(.ctors)) - - /* We don't want to include the .ctor section from from the - crtend.o file until after the sorted ctors. The .ctor section - from the crtend file contains the end of ctors marker and it - must be last */ - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - - KEEP (*crtbegin*.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } > ROM - - .upper.rodata : - { - *(.upper.rodata.* .upper.rodata) - } > HIROM - - .data : - { - . = ALIGN(2); - PROVIDE (__datastart = .); - *(.lower.data.* .lower.data) - - . = ALIGN(2); - *(.either.data.* .either.data) - - . = ALIGN(2); - KEEP (*(.jcr)) - *(.data.rel.ro.local) *(.data.rel.ro*) - *(.dynamic) - - . = ALIGN(2); - *(.data .data.* .gnu.linkonce.d.*) - KEEP (*(.gnu.linkonce.d.*personality*)) - SORT(CONSTRUCTORS) - *(.data1) - *(.got.plt) *(.got) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(2); - *(.sdata .sdata.* .gnu.linkonce.s.* D_2 D_1) - - . = ALIGN(2); - _edata = .; - PROVIDE (edata = .); - PROVIDE (__dataend = .); - } > RAM AT> ROM - - /* Note that crt0 assumes this is a multiple of two; all the - start/stop symbols are also assumed word-aligned. */ - PROVIDE(__romdatastart = LOADADDR(.data)); - PROVIDE (__romdatacopysize = SIZEOF(.data)); - - .bss : - { - . = ALIGN(2); - PROVIDE (__bssstart = .); - *(.lower.bss.* .lower.bss) - . = ALIGN(2); - *(.either.bss.* .either.bss) - *(.dynbss) - *(.sbss .sbss.*) - *(.bss .bss.* .gnu.linkonce.b.*) - . = ALIGN(2); - *(COMMON) - PROVIDE (__bssend = .); - } > RAM - PROVIDE (__bsssize = SIZEOF(.bss)); - - /* This section contains data that is not initialised during load - or application reset. */ - .noinit (NOLOAD) : - { - . = ALIGN(2); - PROVIDE (__noinit_start = .); - *(.noinit) - . = ALIGN(2); - PROVIDE (__noinit_end = .); - } > RAM - - /* We create this section so that "end" will always be in the - RAM region (matching .stack below), even if the .bss - section is empty. */ - .heap (NOLOAD) : - { - . = ALIGN(2); - __heap_start__ = .; - _end = __heap_start__; - PROVIDE (end = .); - KEEP (*(.heap)) - _end = .; - PROVIDE (end = .); - /* This word is here so that the section is not empty, and thus - not discarded by the linker. The actual value does not matter - and is ignored. */ - LONG(0); - __heap_end__ = .; - __HeapLimit = __heap_end__; - } > RAM - /* WARNING: Do not place anything in RAM here. - The heap section must be the last section in RAM and the stack - section must be placed at the very end of the RAM region. */ - - .stack (ORIGIN (RAM) + LENGTH(RAM)) : - { - PROVIDE (__stack = .); - *(.stack) - } - - /* This is just for crt0.S and interrupt handlers. */ - .lowtext : - { - PROVIDE (_start = .); - . = ALIGN(2); - KEEP (*(SORT(.crt_*))) - KEEP (*(.lowtext)) - } > ROM - - .lower.text : - { - . = ALIGN(2); - *(.lower.text.* .lower.text) - } > ROM - - .text : - { - . = ALIGN(2); - *(.text .stub .text.* .gnu.linkonce.t.* .text:*) - - KEEP (*(.text.*personality*)) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.interp .hash .dynsym .dynstr .gnu.version*) - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - . = ALIGN(2); - KEEP (*(.init)) - KEEP (*(.fini)) - KEEP (*(.tm_clone_table)) - } > ROM - - .upper.text : - { - . = ALIGN(2); - *(.upper.text.* .upper.text) - } > HIROM - - .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* Make sure that upper data sections are not used. */ - .upper : - { - *(.upper.bss.* .upper.bss) - *(.upper.data.* .upper.data) - ASSERT (SIZEOF(.upper) == 0, "This MCU does not support placing read/write data into high memory"); - } > HIROM - - /* The rest are all not normally part of the runtime image. */ - - .MSP430.attributes 0 : - { - KEEP (*(.MSP430.attributes)) - KEEP (*(.gnu.attributes)) - KEEP (*(__TI_build_attributes)) - } - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1. */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions. */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2. */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2. */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions. */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - - /DISCARD/ : { *(.note.GNU-stack) } -} - - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - -INCLUDE msp430f5529_symbols.ld - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.ccsproject b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.ccsproject deleted file mode 100644 index c2c0d67b4..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.ccsproject +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject deleted file mode 100644 index f0781efdb..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.cproject +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.project b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.project deleted file mode 100644 index 3cdb09a49..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/.project +++ /dev/null @@ -1,79 +0,0 @@ - - - dpp-qv_msp-exp430f5529lp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - com.ti.ccstudio.core.ccsNature - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - QP - 2 - PARENT-5-PROJECT_LOC/src/qf - - - QP_port - 2 - PARENT-5-PROJECT_LOC/ports/msp430/qv - - - QS - 2 - PARENT-5-PROJECT_LOC/src/qs - - - QV - 2 - PARENT-5-PROJECT_LOC/src/qv - - - bsp.cpp - 1 - PARENT-1-PROJECT_LOC/bsp.cpp - - - bsp.h - 1 - PARENT-2-PROJECT_LOC/bsp.h - - - dpp.h - 1 - PARENT-2-PROJECT_LOC/dpp.h - - - main.cpp - 1 - PARENT-2-PROJECT_LOC/main.cpp - - - philo.cpp - 1 - PARENT-2-PROJECT_LOC/philo.cpp - - - table.cpp - 1 - PARENT-2-PROJECT_LOC/table.cpp - - - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd b/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd deleted file mode 100644 index 6935f6910..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/qv/ccs-ti/lnk_msp430f5529.cmd +++ /dev/null @@ -1,241 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2014, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.159 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_DATA_MODEL__ - .text : {}>> FLASH /* Code */ -#else - .text : {}>> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} > FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/msp430/dpp_msp-exp430f5529lp/table.cpp b/examples/msp430/dpp_msp-exp430f5529lp/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/msp430/dpp_msp-exp430f5529lp/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/performance/dpp_efm32-slstk3401a/README.txt b/examples/performance/dpp_efm32-slstk3401a/README.txt deleted file mode 100644 index 2c94516ea..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/README.txt +++ /dev/null @@ -1,40 +0,0 @@ -About this Example -================== -This directory contains a QP code used for performance measurements, -as described in the "Application Note: QP/C++ Performance Tests and -Results" (http://www.state-machine.com/doc/AN_QP-Cpp_Performance.pdf) - -The performance measurements are performed on the EFM32-SLSTK3401A -board (Pearl Gecko Starter Kit) with the IAR EWARM toolset. - - -The Test Code -============= -The test code used for performance testing is the slightly modified -Dining Philosophers Problem (DPP) application. To avoid any manual -mistakes, the application code is generated by the QM modeling tool. -Two QM models are provided: - -dpp_qhsm.qm - uses the QHsm-based state machine implementation - strategy -dpp_qmsm.qm - uses the QMsm-based state machine implementation - strategy - -To apply the specific implementation strategy, you need to generate -code from one model or another *before* you build the target code. - - -The Development Toolset -======================= -The performance tests are done with the IAR EWARM version 7.60 -toolset. The measurements are generally done by taking differences -in the CYCLECOUNTER register available in the Pearl Gecko CPU. - - -Support Code for EFM32-SLSTK3401A Board -======================================= -The directory 3rd_party\efm32pg1b contains the CMSIS-compliant -device code for the EFM32PG1B200F256GM48 MCU. Please see the README.txt -file in this folder for more details. - - diff --git a/examples/performance/dpp_efm32-slstk3401a/bsp.hpp b/examples/performance/dpp_efm32-slstk3401a/bsp.hpp deleted file mode 100644 index eb3a82aac..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/bsp.hpp +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 5.6.0 -// Date of the Last Update: 2015-12-28 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -namespace DPP { - -class BSP { -public: - enum { TICKS_PER_SEC = 100 }; - - static void init(void); - static void displayPaused(uint8_t const paused); - static void displayPhilStat(uint8_t const n, char const *stat); - static void terminate(int16_t const result); - - static void randomSeed(uint32_t const seed); // random seed - static uint32_t random(void); // pseudo-random generator - - // for testing... - static void wait4SW1(void); - static void ledOn(void); - static void ledOff(void); -}; - -} // namespace DPP - -#endif // BSP_HPP diff --git a/examples/performance/dpp_efm32-slstk3401a/dpp.hpp b/examples/performance/dpp_efm32-slstk3401a/dpp.hpp deleted file mode 100644 index 372caa87f..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/dpp.hpp +++ /dev/null @@ -1,102 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_qmsm.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP -#define DPP_HPP - -namespace DPP { - -enum DPPSignals { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a philosopher eat - DONE_SIG, // published by Philosopher when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - HUNGRY_SIG, // posted directly to Table from hungry Philo - MAX_SIG // the last signal -}; - -} // namespace DPP - -//$declare${Events::TableEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${Events::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - uint8_t philoNum; -}; // class TableEvt - -} // namespace DPP -//$enddecl${Events::TableEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// number of philosophers -#define N_PHILO ((uint8_t)5) - -//$declare${AOs::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::AO_Philo[N_PHILO]} .................................................. -extern QP::QActive * const AO_Philo[N_PHILO]; - -} // namespace DPP -//$enddecl${AOs::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${AOs::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::AO_Table} ........................................................... -extern QP::QActive * const AO_Table; - -} // namespace DPP -//$enddecl${AOs::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ -//$declare${AOs::XT_Test1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::XT_Test1} ........................................................... -extern QP::QXThread * const XT_Test1; - -} // namespace DPP -//$enddecl${AOs::XT_Test1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$declare${AOs::XT_Test2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::XT_Test2} ........................................................... -extern QP::QXThread * const XT_Test2; - -} // namespace DPP -//$enddecl${AOs::XT_Test2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#endif // QXK_HPP_ - -#endif // DPP_HPP diff --git a/examples/performance/dpp_efm32-slstk3401a/dpp_qhsm.qm b/examples/performance/dpp_efm32-slstk3401a/dpp_qhsm.qm deleted file mode 100644 index 8d80e4a59..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/dpp_qhsm.qm +++ /dev/null @@ -1,501 +0,0 @@ - - - Dining Philosopher Problem example with MSM state machines - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) - - - - - - static bool registered = false; // starts off with 0, per C-standard -(void)e; // suppress the compiler warning about unused parameter -if (!registered) { - registered = true; - - QS_OBJ_DICTIONARY(&l_philo[0]); - QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[1]); - QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[2]); - QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[3]); - QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[4]); - QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); - - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); -} -QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philos -QS_SIG_DICTIONARY(TIMEOUT_SIG, this); // signal for each Philos - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - /* EAT or DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - - - - - - - - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoNum = PHILO_ID(this); -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(this) - - - - - - - - - - - /* DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoNum = PHILO_ID(this); -QP::QActive::PUBLISH(pe, this); -(void)m_timeEvt.disarm(); - - - - - - - - - /* EAT or DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&Table::initial)) - -for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - (void)e; // suppress the compiler warning about unused parameter - -QS_OBJ_DICTIONARY(&l_table); - -QS_SIG_DICTIONARY(DONE_SIG, nullptr); // global signals -QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal just for Table - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - for (uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoNum = n; - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -uint8_t m = LEFT(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoNum = n; -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = RIGHT(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = LEFT(n); // check the left neighbor -n = LEFT(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -uint8_t m = LEFT(n); -/* both forks of Phil[n] must be used */ -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP -#define DPP_HPP - -namespace DPP { - -enum DPPSignals { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a philosopher eat - DONE_SIG, // published by Philosopher when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - HUNGRY_SIG, // posted directly to Table from hungry Philo - MAX_SIG // the last signal -}; - -} // namespace DPP - -$declare(Events::TableEvt) - -// number of philosophers -#define N_PHILO ((uint8_t)5) - -$declare(AOs::AO_Philo[N_PHILO]) - -$declare(AOs::AO_Table) - -#ifdef QXK_HPP_ -$declare(AOs::XT_Test1) -$declare(AOs::XT_Test2) -#endif // QXK_HPP_ - -#endif // DPP_HPP - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -$declare(AOs::Philo) - -namespace DPP { - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -// helper function to provide a randomized think time for Philos -inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -// helper function to provide the ID of Philo "this" -inline uint8_t PHILO_ID(Philo const * const me) { - return static_cast<uint8_t>(me - l_philo); -} - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; - -// Global objects ------------------------------------------------------------ -QP::QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AO - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -} // namespace DPP - -// Philo definition ---------------------------------------------------------- -$define(AOs::Philo) - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -$declare(AOs::Table) - -namespace DPP { - -// helper function to provide the RIGHT neighbour of a Philo[n] -inline uint8_t RIGHT(uint8_t const n) { - return static_cast<uint8_t>((n + (N_PHILO - 1U)) % N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -inline uint8_t LEFT(uint8_t const n) { - return static_cast<uint8_t>((n + 1U) % N_PHILO); -} - -static uint8_t const FREE = static_cast<uint8_t>(0); -static uint8_t const USED = static_cast<uint8_t>(1); - -static char const * const THINKING = &"thinking"[0]; -static char const * const HUNGRY = &"hungry "[0]; -static char const * const EATING = &"eating "[0]; - -// Local objects ------------------------------------------------------------- -static Table l_table; // the single instance of the Table active object - -// Global-scope objects ------------------------------------------------------ -QP::QActive * const AO_Table = &l_table; // "opaque" AO pointer - -} // namespace DPP - -//............................................................................ -$define(AOs::Table) - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/dpp_qmsm.qm b/examples/performance/dpp_efm32-slstk3401a/dpp_qmsm.qm deleted file mode 100644 index bc5cb3418..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/dpp_qmsm.qm +++ /dev/null @@ -1,506 +0,0 @@ - - - Dining Philosopher Problem example with MSM state machines - - - - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) - - - - - - static bool registered = false; // starts off with 0, per C-standard -(void)e; // suppress the compiler warning about unused parameter -if (!registered) { - registered = true; - - QS_OBJ_DICTIONARY(&l_philo[0]); - QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[1]); - QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[2]); - QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[3]); - QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[4]); - QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); - - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); -} -QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philos -QS_SIG_DICTIONARY(TIMEOUT_SIG, this); // signal for each Philos - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - /* EAT or DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - - - - - - - - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoNum = PHILO_ID(this); -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(this) - - - - - - - - - - - /* DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoNum = PHILO_ID(this); -QP::QActive::PUBLISH(pe, this); -(void)m_timeEvt.disarm(); - - - - - - - - - /* EAT or DONE must be for other Philos than this one */ -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - - - - - - - - - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Table::initial)) - -for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - (void)e; // suppress the compiler warning about unused parameter - -QS_OBJ_DICTIONARY(&l_table); -QS_FUN_DICTIONARY(&QP::QHsm::top); -QS_FUN_DICTIONARY(&Table::initial); -QS_FUN_DICTIONARY(&Table::active); -QS_FUN_DICTIONARY(&Table::serving); -QS_FUN_DICTIONARY(&Table::paused); - -QS_SIG_DICTIONARY(DONE_SIG, nullptr); // global signals -QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal just for Table - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - for (uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoNum = n; - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -uint8_t m = LEFT(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoNum = n; -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = RIGHT(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = LEFT(n); // check the left neighbor -n = LEFT(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -uint8_t m = LEFT(n); -/* both forks of Phil[n] must be used */ -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP -#define DPP_HPP - -namespace DPP { - -enum DPPSignals { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a philosopher eat - DONE_SIG, // published by Philosopher when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - HUNGRY_SIG, // posted directly to Table from hungry Philo - MAX_SIG // the last signal -}; - -} // namespace DPP - -$declare(Events::TableEvt) - -// number of philosophers -#define N_PHILO ((uint8_t)5) - -$declare(AOs::AO_Philo[N_PHILO]) - -$declare(AOs::AO_Table) - -#ifdef QXK_HPP_ -$declare(AOs::XT_Test1) -$declare(AOs::XT_Test2) -#endif // QXK_HPP_ - -#endif // DPP_HPP - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -$declare(AOs::Philo) - -namespace DPP { - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -// helper function to provide a randomized think time for Philos -inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -// helper function to provide the ID of Philo "this" -inline uint8_t PHILO_ID(Philo const * const me) { - return static_cast<uint8_t>(me - l_philo); -} - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; - -// Global objects ------------------------------------------------------------ -QP::QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AO - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -} // namespace DPP - -// Philo definition ---------------------------------------------------------- -$define(AOs::Philo) - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -$declare(AOs::Table) - -namespace DPP { - -// helper function to provide the RIGHT neighbour of a Philo[n] -inline uint8_t RIGHT(uint8_t const n) { - return static_cast<uint8_t>((n + (N_PHILO - 1U)) % N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -inline uint8_t LEFT(uint8_t const n) { - return static_cast<uint8_t>((n + 1U) % N_PHILO); -} - -static uint8_t const FREE = static_cast<uint8_t>(0); -static uint8_t const USED = static_cast<uint8_t>(1); - -static char const * const THINKING = &"thinking"[0]; -static char const * const HUNGRY = &"hungry "[0]; -static char const * const EATING = &"eating "[0]; - -// Local objects ------------------------------------------------------------- -static Table l_table; // the single instance of the Table active object - -// Global-scope objects ------------------------------------------------------ -QP::QActive * const AO_Table = &l_table; // "opaque" AO pointer - -} // namespace DPP - -//............................................................................ -$define(AOs::Table) - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/philo.cpp b/examples/performance/dpp_efm32-slstk3401a/philo.cpp deleted file mode 100644 index 1a39f221c..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/philo.cpp +++ /dev/null @@ -1,342 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_qmsm.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QMActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - Philo(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( thinking); - QM_ACTION_DECL(thinking_e); - QM_ACTION_DECL(thinking_x); - QM_STATE_DECL( hungry); - QM_ACTION_DECL(hungry_e); - QM_STATE_DECL( eating); - QM_ACTION_DECL(eating_e); - QM_ACTION_DECL(eating_x); -}; // class Philo - -} // namespace DPP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace DPP { - -// Local objects ------------------------------------------------------------- -static Philo l_philo[N_PHILO]; // storage for all Philos - -// helper function to provide a randomized think time for Philos -inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -// helper function to provide the ID of Philo "this" -inline uint8_t PHILO_ID(Philo const * const me) { - return static_cast(me - l_philo); -} - -enum InternalSignals { // internal signals - TIMEOUT_SIG = MAX_SIG -}; - -// Global objects ------------------------------------------------------------ -QP::QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AO - &l_philo[0], - &l_philo[1], - &l_philo[2], - &l_philo[3], - &l_philo[4] -}; - -} // namespace DPP - -// Philo definition ---------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.0.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::Philo} .............................................................. - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QMActive(Q_STATE_CAST(&Philo::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Philo::SM} .......................................................... -QM_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - static bool registered = false; // starts off with 0, per C-standard - (void)e; // suppress the compiler warning about unused parameter - if (!registered) { - registered = true; - - QS_OBJ_DICTIONARY(&l_philo[0]); - QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[1]); - QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[2]); - QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[3]); - QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); - QS_OBJ_DICTIONARY(&l_philo[4]); - QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); - - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - } - QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philos - QS_SIG_DICTIONARY(TIMEOUT_SIG, this); // signal for each Philos - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &thinking_s, // target state - { - &thinking_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Philo::SM::thinking} ................................................ -QP::QMState const Philo::thinking_s = { - QM_STATE_NULL, // superstate (top) - &Philo::thinking, - &Philo::thinking_e, - &Philo::thinking_x, - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Philo::SM::thinking} -QM_ACTION_DEF(Philo, thinking_e) { - m_timeEvt.armX(think_time(), 0U); - return qm_entry(&thinking_s); -} -//${AOs::Philo::SM::thinking} -QM_ACTION_DEF(Philo, thinking_x) { - (void)m_timeEvt.disarm(); - return qm_exit(&thinking_s); -} -//${AOs::Philo::SM::thinking} -QM_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &hungry_s, // target state - { - &thinking_x, // exit - &hungry_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - /* EAT or DONE must be for other Philos than this one */ - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -QP::QMState const Philo::hungry_s = { - QM_STATE_NULL, // superstate (top) - &Philo::hungry, - &Philo::hungry_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Philo::SM::hungry} -QM_ACTION_DEF(Philo, hungry_e) { - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoNum = PHILO_ID(this); - AO_Table->POST(pe, this); - return qm_entry(&hungry_s); -} -//${AOs::Philo::SM::hungry} -QM_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[Q_EVT_CAST(TableEvt)->philoNum=~} - if (Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(this)) { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &eating_s, // target state - { - &eating_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - /* DONE must be for other Philos than this one */ - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -QP::QMState const Philo::eating_s = { - QM_STATE_NULL, // superstate (top) - &Philo::eating, - &Philo::eating_e, - &Philo::eating_x, - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Philo::SM::eating} -QM_ACTION_DEF(Philo, eating_e) { - m_timeEvt.armX(eat_time(), 0U); - return qm_entry(&eating_s); -} -//${AOs::Philo::SM::eating} -QM_ACTION_DEF(Philo, eating_x) { - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoNum = PHILO_ID(this); - QP::QActive::PUBLISH(pe, this); - (void)m_timeEvt.disarm(); - return qm_exit(&eating_s); -} -//${AOs::Philo::SM::eating} -QM_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &thinking_s, // target state - { - &eating_x, // exit - &thinking_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - /* EAT or DONE must be for other Philos than this one */ - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this)); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace DPP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/bsp.cpp b/examples/performance/dpp_efm32-slstk3401a/qk/bsp.cpp deleted file mode 100644 index d0f8daad3..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/bsp.cpp +++ /dev/null @@ -1,480 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, preemptive QK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -Q_DEFINE_THIS_FILE - -// namespace DPP ************************************************************* -namespace DPP { - -// Local-scope objects ------------------------------------------------------- -#define LED_PORT gpioPortF -#define LED0_PIN 4 -#define LED1_PIN 5 - -#define PB_PORT gpioPortF -#define PB0_PIN 6 -#define PB1_PIN 7 - -static uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - COMMAND_STAT - }; - -#endif - -// ISRs used in this project ================================================= -extern "C" { - -//............................................................................ -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop until PB1 is pressed... - while ((GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) != 0) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - - -//............................................................................ -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - // state of the button debouncing, see below - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; - uint32_t current; - uint32_t tmp; - - QK_ISR_ENTRY(); // inform QK about entering an ISR - -#ifdef Q_SPY - { - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover - } -#endif - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((buttons.depressed & (1U << PB0_PIN)) != 0U) { // PB0 depressed? - static QP::QEvt const pauseEvt(DPP::PAUSE_SIG); - QP::QF::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(DPP::SERVE_SIG); - QP::QF::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} -//............................................................................ -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - QK_ISR_ENTRY(); // inform QK about entering an ISR - - // for testing... - AO_Table->POST(Q_NEW(QP::QEvt, MAX_PUB_SIG), &l_GPIO_EVEN_IRQHandler); - - QK_ISR_EXIT(); // inform QK about exiting an ISR -} - -//............................................................................ -void USART0_RX_IRQHandler(void); // prototype -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. Such ISRs don't need to call QK_ISR_ENTRY/ -// QK_ISR_EXIT and they cannot post or publish events. -// -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((DPP::l_USART0->STATUS & USART_STATUS_RXDATAV) != 0) { - uint32_t b = DPP::l_USART0->RXDATA; - QP::QS::rxPut(b); - } - QK_ARM_ERRATUM_838869(); -} -#else -void USART0_RX_IRQHandler(void) {} -#endif // Q_SPY - -} // extern "C" - -// BSP functions ============================================================= -void BSP::init(void) { - // NOTE: SystemInit() already called from the startup code - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QK - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - //... - BSP::randomSeed(1234U); - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(COMMAND_STAT); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void BSP::displayPhilStat(uint8_t n, char const *stat) { - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void BSP::displayPaused(uint8_t paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } -} -//............................................................................ -uint32_t BSP::random(void) { // a very cheap pseudo-random-number generator - // lock the scheduler around l_rnd up to the (N_PHILO + 1U) ceiling - QP::QSchedStatus lockStat = QP::QK::schedLock(N_PHILO + 1U); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); // unlock sched after accessing l_rnd - - return (rnd >> 8); -} -//............................................................................ -void BSP::randomSeed(uint32_t seed) { - l_rnd = seed; -} - -//............................................................................ -void BSP::terminate(int16_t result) { - (void)result; -} - -} // namespace DPP - - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / DPP::BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - // - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QK::onIdle(void) { - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - QF_INT_ENABLE(); - -#ifdef Q_SPY - QS::rxParse(); // parse all the received bytes - - if ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - uint16_t b; - - QF_INT_DISABLE(); - b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - DPP::l_USART0->TXDATA = (b & 0xFFU); // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M3 MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -// QS callbacks ============================================================== -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - static uint8_t qsRxBuf[100]; // buffer for QS receive channel - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - initBuf (qsTxBuf, sizeof(qsTxBuf)); - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(DPP::l_USART0, &init); - - // enable pins at correct UART/USART location. - DPP::l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - DPP::l_USART0->ROUTELOC0 = (DPP::l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(DPP::l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(DPP::l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - - // Finally enable the UART - USART_Enable(DPP::l_USART0, usartEnable); - - DPP::QS_tickPeriod_ = SystemCoreClock / DPP::BSP::TICKS_PER_SEC; - DPP::QS_tickTime_ = DPP::QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return DPP::QS_tickTime_ - static_cast(SysTick->VAL); - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return DPP::QS_tickTime_ + DPP::QS_tickPeriod_ - - static_cast(SysTick->VAL); - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - DPP::l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void QS::onReset(void) { - NVIC_SystemReset(); -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - QS_BEGIN_ID(DPP::COMMAND_STAT, 0U) // app-specific record - QS_U8(2, cmdId); - QS_U32(8, param1); - QS_END() -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF/QK services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/iar/README.txt b/examples/performance/dpp_efm32-slstk3401a/qk/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd b/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd deleted file mode 100644 index a4f17a611..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp b/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp deleted file mode 100644 index 69fc932ff..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.ewp +++ /dev/null @@ -1,3355 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qk\qk.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qk\iar\qk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww b/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww deleted file mode 100644 index c261124af..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qk.ewp - - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf b/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/iar/dpp-qk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/performance/dpp_efm32-slstk3401a/qk/main.cpp b/examples/performance/dpp_efm32-slstk3401a/qk/main.cpp deleted file mode 100644 index 8366e1f18..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qk/main.cpp +++ /dev/null @@ -1,68 +0,0 @@ -//============================================================================ -// DPP example -// Last updated for version 5.6.2 -// Last updated on 2016-03-31 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - static QP::QEvt const *tableQueueSto[N_PHILO]; - static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO]; - static QP::QSubscrList subscrSto[DPP::MAX_PUB_SIG]; - - static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO]; - - - QP::QF::init(); // initialize the framework and the underlying RT kernel - - DPP::BSP::init(); // initialize the BSP - - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - for (uint8_t n = 0U; n < N_PHILO; ++n) { - DPP::AO_Philo[n]->start((uint_fast8_t)(n + 1U), - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - nullptr, 0U); - } - DPP::AO_Table->start((uint_fast8_t)(N_PHILO + 1U), - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/bsp.cpp b/examples/performance/dpp_efm32-slstk3401a/qv/bsp.cpp deleted file mode 100644 index 115e46315..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/bsp.cpp +++ /dev/null @@ -1,477 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, cooperative QV kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -Q_DEFINE_THIS_FILE - -// namespace DPP ************************************************************* -namespace DPP { - -// Local-scope objects ------------------------------------------------------- -#define LED_PORT gpioPortF -#define LED0_PIN 4 -#define LED1_PIN 5 - -#define PB_PORT gpioPortF -#define PB0_PIN 6 -#define PB1_PIN 7 - -static uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - COMMAND_STAT - }; - -#endif - -// ISRs used in this project ================================================= -extern "C" { - -//............................................................................ -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop until PB1 is pressed... - while ((GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) != 0) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - - -//............................................................................ -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - // state of the button debouncing, see below - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; - uint32_t current; - uint32_t tmp; - -#ifdef Q_SPY - { - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover - } -#endif - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((buttons.depressed & (1U << PB0_PIN)) != 0U) { // PB0 depressed? - static QP::QEvt const pauseEvt(DPP::PAUSE_SIG); - QP::QF::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(DPP::SERVE_SIG); - QP::QF::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - QV_ARM_ERRATUM_838869(); -} -//............................................................................ -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - // for testing... - AO_Table->POST(Q_NEW(QP::QEvt, MAX_PUB_SIG), &l_GPIO_EVEN_IRQHandler); - QV_ARM_ERRATUM_838869(); -} - -//............................................................................ -void USART0_RX_IRQHandler(void); // prototype -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QK and is not disabled. -// -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((DPP::l_USART0->STATUS & USART_STATUS_RXDATAV) != 0) { - uint32_t b = DPP::l_USART0->RXDATA; - QP::QS::rxPut(b); - } - QV_ARM_ERRATUM_838869(); -} -#else -void USART0_RX_IRQHandler(void) {} -#endif // Q_SPY - -} // extern "C" - -// BSP functions ============================================================= -void BSP::init(void) { - // NOTE: SystemInit() already called from the startup code - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QV - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - //... - BSP::randomSeed(1234U); - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(COMMAND_STAT); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void BSP::displayPhilStat(uint8_t n, char const *stat) { - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void BSP::displayPaused(uint8_t paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } -} -//............................................................................ -uint32_t BSP::random(void) { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void BSP::randomSeed(uint32_t seed) { - l_rnd = seed; -} - -//............................................................................ -void BSP::terminate(int16_t result) { - (void)result; -} - -} // namespace DPP - - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / DPP::BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - // - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QV::onIdle(void) { // called with interrupts disabled, see NOTE01 - // toggle the User LED on and then off, see NOTE02 - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - -#ifdef Q_SPY - QF_INT_ENABLE(); - QS::rxParse(); // parse all the received bytes - - if ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - uint16_t b; - - QF_INT_DISABLE(); - b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - DPP::l_USART0->TXDATA = (b & 0xFFU); // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - // - QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts -#else - QF_INT_ENABLE(); // just enable interrupts -#endif -} - -// QS callbacks ============================================================== -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - static uint8_t qsRxBuf[100]; // buffer for QS receive channel - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - initBuf (qsTxBuf, sizeof(qsTxBuf)); - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(DPP::l_USART0, &init); - - // enable pins at correct UART/USART location. - DPP::l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - DPP::l_USART0->ROUTELOC0 = (DPP::l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(DPP::l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(DPP::l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - - // Finally enable the UART - USART_Enable(DPP::l_USART0, usartEnable); - - DPP::QS_tickPeriod_ = SystemCoreClock / DPP::BSP::TICKS_PER_SEC; - DPP::QS_tickTime_ = DPP::QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return DPP::QS_tickTime_ - static_cast(SysTick->VAL); - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return DPP::QS_tickTime_ + DPP::QS_tickPeriod_ - - static_cast(SysTick->VAL); - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - DPP::l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void QS::onReset(void) { - NVIC_SystemReset(); -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - QS_BEGIN_ID(DPP::COMMAND_STAT, 0U) // app-specific record - QS_U8(2, cmdId); - QS_U32(8, param1); - QS_END() -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities equal or higher than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF/QK services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The QV:onIdle() callback is called with interrupts disabled, because the -// determination of the idle condition might change by any interrupt posting -// an event. QV::onIdle() must internally enable interrupts, ideally -// atomically with putting the CPU to the power-saving mode. -// -// NOTE02: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/iar/README.txt b/examples/performance/dpp_efm32-slstk3401a/qv/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd b/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd deleted file mode 100644 index a4f17a611..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp b/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp deleted file mode 100644 index 10c1d6167..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.ewp +++ /dev/null @@ -1,3361 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qv\qv.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qs_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qv\iar\qv_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww b/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww deleted file mode 100644 index b96f3f620..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qv.ewp - - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf b/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/iar/dpp-qv.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/performance/dpp_efm32-slstk3401a/qv/main.cpp b/examples/performance/dpp_efm32-slstk3401a/qv/main.cpp deleted file mode 100644 index 9fe33acd0..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qv/main.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// DPP example -// Last updated for version 5.6.5 -// Last updated on 2016-07-07 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - static QP::QEvt const *tableQueueSto[N_PHILO]; - static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO]; - static QP::QSubscrList subscrSto[DPP::MAX_PUB_SIG]; - - static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO]; - - - QP::QF::init(); // initialize the framework and the underlying RT kernel - - DPP::BSP::init(); // initialize the BSP - - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - for (uint8_t n = 0U; n < N_PHILO; ++n) { - DPP::AO_Philo[n]->start((uint_fast8_t)(n + 1U), - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - nullptr, 0U); - } - // leave the priority level (N_PHILO + 1) free for the mutex in BSP - DPP::AO_Table->start((uint_fast8_t)(N_PHILO + 2U), - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/bsp.cpp b/examples/performance/dpp_efm32-slstk3401a/qxk/bsp.cpp deleted file mode 100644 index 320ec1df8..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/bsp.cpp +++ /dev/null @@ -1,501 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, preemptive QXK kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.hpp" -#include "bsp.hpp" - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -Q_DEFINE_THIS_FILE - -// namespace DPP ************************************************************* -namespace DPP { - -// Local-scope objects ------------------------------------------------------- -#define LED_PORT gpioPortF -#define LED0_PIN 4 -#define LED1_PIN 5 - -#define PB_PORT gpioPortF -#define PB0_PIN 6 -#define PB1_PIN 7 - -static uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - #define UART_BAUD_RATE 115200U - #define UART_FR_TXFE (1U << 7) - #define UART_FR_RXFE (1U << 4) - #define UART_TXFIFO_DEPTH 16U - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - COMMAND_STAT - }; - -#endif - -// ISRs used in this project ================================================= -extern "C" { - -//............................................................................ -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // - // NOTE: add here your application-specific error handling - // - (void)module; - (void)id; - QS_ASSERTION(module, id, 10000U); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop until PB1 is pressed... - while ((GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) != 0) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - - -//............................................................................ -void SysTick_Handler(void); // prototype -void SysTick_Handler(void) { - // state of the button debouncing, see below - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; - uint32_t current; - uint32_t tmp; - - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - -#ifdef Q_SPY - { - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover - } -#endif - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((buttons.depressed & (1U << PB0_PIN)) != 0U) { // PB0 depressed? - static QP::QEvt const pauseEvt(DPP::PAUSE_SIG); - QP::QF::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(DPP::SERVE_SIG); - QP::QF::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - if ((tmp & (1U << PB1_PIN)) != 0U) { // debounced PB1 state changed? - if ((buttons.depressed & (1U << PB1_PIN)) != 0U) { // PB1 depressed? - XT_Sema.signal(); // signal the semaphore (test) - } - } - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} -//............................................................................ -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { - QXK_ISR_ENTRY(); // inform QXK about entering an ISR - - // for testing... - DPP::AO_Table->POST(Q_NEW(QP::QEvt, DPP::MAX_PUB_SIG), - &l_GPIO_EVEN_IRQHandler); - - QXK_ISR_EXIT(); // inform QXK about exiting an ISR -} - -//............................................................................ -void USART0_RX_IRQHandler(void); // prototype -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "QF-unaware" meaning that it does not interact with -// the QF/QXK and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. -// -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((DPP::l_USART0->STATUS & USART_STATUS_RXDATAV) != 0) { - uint32_t b = DPP::l_USART0->RXDATA; - QP::QS::rxPut(b); - } - QXK_ARM_ERRATUM_838869(); -} -#else -void USART0_RX_IRQHandler(void) {} -#endif // Q_SPY - -} // extern "C" - -// BSP functions ============================================================= -void BSP::init(void) { - // NOTE: SystemInit() already called from the startup code - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by QXK - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - //... - BSP::randomSeed(1234U); - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(COMMAND_STAT); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void BSP::displayPhilStat(uint8_t n, char const *stat) { - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void BSP::displayPaused(uint8_t paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - XT_Sema.signal(); // signal the semaphore (test) - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } -} -//............................................................................ -uint32_t BSP::random(void) { // a very cheap pseudo-random-number generator - - // lock the QXK scheduler up to priority N_PHILO+1 - QP::QSchedStatus schedStat = QP::QXK::schedLock(N_PHILO + 1U); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - QP::QXK::schedUnlock(schedStat); // unlock the QXK scheduler - - return (rnd >> 8); -} -//............................................................................ -void BSP::randomSeed(uint32_t seed) { - l_rnd = seed; -} -//............................................................................ -void BSP::ledOn(void) { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -} -//............................................................................ -void BSP::ledOff(void) { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//............................................................................ -void BSP::terminate(int16_t result) { - (void)result; -} - -} // namespace DPP - - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup(void) { - // set up the SysTick timer to fire at BSP::TICKS_PER_SEC rate - SysTick_Config(SystemCoreClock / DPP::BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - // - // !!!!!!!!!!!!!!!!!!!!!!!!!!!! CAUTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Assign a priority to EVERY ISR explicitly by calling NVIC_SetPriority(). - // DO NOT LEAVE THE ISR PRIORITIES AT THE DEFAULT VALUE! - // - NVIC_SetPriority(USART0_RX_IRQn, 0U); // kerel unaware interrupt - NVIC_SetPriority(GPIO_EVEN_IRQn, QF_AWARE_ISR_CMSIS_PRI); - NVIC_SetPriority(SysTick_IRQn, QF_AWARE_ISR_CMSIS_PRI + 1U); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QXK::onIdle(void) { - // toggle the User LED on and then off, see NOTE01 - QF_INT_DISABLE(); - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); - QF_INT_ENABLE(); - -#ifdef Q_SPY - QS::rxParse(); // parse all the received bytes - - if ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - uint16_t b; - - QF_INT_DISABLE(); - b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // not End-Of-Data? - DPP::l_USART0->TXDATA = (b & 0xFFU); // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M3 MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} - -// QS callbacks ============================================================== -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - static uint8_t qsRxBuf[100]; // buffer for QS receive channel - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - initBuf (qsTxBuf, sizeof(qsTxBuf)); - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(DPP::l_USART0, &init); - - // enable pins at correct UART/USART location. - DPP::l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - DPP::l_USART0->ROUTELOC0 = (DPP::l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(DPP::l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(DPP::l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - - // Finally enable the UART - USART_Enable(DPP::l_USART0, usartEnable); - - DPP::QS_tickPeriod_ = SystemCoreClock / DPP::BSP::TICKS_PER_SEC; - DPP::QS_tickTime_ = DPP::QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return DPP::QS_tickTime_ - static_cast(SysTick->VAL); - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return DPP::QS_tickTime_ + DPP::QS_tickPeriod_ - - static_cast(SysTick->VAL); - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - DPP::l_USART0->TXDATA = b; - } - else { - break; - } - } -} -//............................................................................ -void QS::onReset(void) { - NVIC_SystemReset(); -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - QS_BEGIN_ID(DPP::COMMAND_STAT, 0U) // app-specific record - QS_U8(2, cmdId); - QS_U32(8, param1); - QS_END() -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The QF_AWARE_ISR_CMSIS_PRI constant from the QF port specifies the highest -// ISR priority that is disabled by the QF framework. The value is suitable -// for the NVIC_SetPriority() CMSIS function. -// -// Only ISRs prioritized at or below the QF_AWARE_ISR_CMSIS_PRI level (i.e., -// with the numerical values of priorities greater or equal than -// QF_AWARE_ISR_CMSIS_PRI) are allowed to call the QK_ISR_ENTRY/QK_ISR_ENTRY -// macros or any other QF/QK services. These ISRs are "QF-aware". -// -// Conversely, any ISRs prioritized above the QF_AWARE_ISR_CMSIS_PRI priority -// level (i.e., with the numerical values of priorities less than -// QF_AWARE_ISR_CMSIS_PRI) are never disabled and are not aware of the kernel. -// Such "QF-unaware" ISRs cannot call any QF/QK services. In particular they -// can NOT call the macros QK_ISR_ENTRY/QK_ISR_ENTRY. The only mechanism -// by which a "QF-unaware" ISR can communicate with the QF framework is by -// triggering a "QF-aware" ISR, which can post/publish events. -// -// NOTE2: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts disabled, so no -// interrupt execution time contributes to the brightness of the User LED. -// diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/README.txt b/examples/performance/dpp_efm32-slstk3401a/qxk/iar/README.txt deleted file mode 100644 index fb12fa8f7..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -About this Example -================== -This example demonstrates how to use the IAR EWARM IDE to build -a QP application. - - -IAR Project File ----------------- -The IAR EWARM project file provided with this example uses relative paths -to the QP/C framework location (includes, port, and libraries. These -relative paths must be modified when the project is moved to different -relative location. - - -Stack Size and Heap Size ------------------------- -In this project, the size of the C stack and heap are determined in -the linker script blinky-qk.icf (see the next section). - - -Linker Script -------------- -The IAR linker script provides a template of the recommended linker script -for QP applications. This file needs to be customized to set the -application-specific sizes of the Stack and Heap. This file can be edited -from the IAR EWARM IDE via the Project Options/Linker settings. - - -Startup Code -============ -The startup code for the EFM32PG1B200F256GM48 MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - -The file startup_efm32pg1b.s provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd b/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd deleted file mode 100644 index c03bfc6b8..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp b/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp deleted file mode 100644 index d5ed6be9b..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.ewp +++ /dev/null @@ -1,3370 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\test.cpp - - - $PROJ_DIR$\..\test.hpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_emu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_actq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_mutex.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_sema.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qxk\qxk_xthr.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\arm-cm\qxk\iar\qxk_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww b/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww deleted file mode 100644 index 38808ca3f..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-qxk.ewp - - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf b/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/iar/dpp-qxk.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/main.cpp b/examples/performance/dpp_efm32-slstk3401a/qxk/main.cpp deleted file mode 100644 index a5f35b25d..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/main.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//============================================================================ -// DPP example for QXK -// Last updated for version 6.7.0 -// Last updated on 2019-12-26 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - static QP::QEvt const *tableQueueSto[N_PHILO]; - static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO]; - static QP::QEvt const *testQueueSto[5]; - - static QP::QSubscrList subscrSto[DPP::MAX_PUB_SIG]; - static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO]; // small pool - - // stack for the QXK extended thread - static uint64_t testStackSto[64]; - - QP::QF::init(); // initialize the framework - DPP::BSP::init(); // initialize the BSP - - // initialize publish-subscribe... - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - for (uint8_t n = 0U; n < N_PHILO; ++n) { - DPP::AO_Philo[n]->start( - static_cast(n + 1), // QP priority - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, // no stack storage - static_cast(0)); // stack size [bytes] - } - - DPP::AO_Table->start( - static_cast(N_PHILO + 2U), // QP priority - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, // no stack storage - static_cast(0)); // stack size [bytes] - - // start the extended thread for testing - DPP::XT_Test->start( - static_cast(N_PHILO + 3U), // QP priority - testQueueSto, // event queue storage - Q_DIM(testQueueSto), // queue length [events] - testStackSto, // stack storage - sizeof(testStackSto)); // stack size [bytes] - - - return QP::QF::run(); // run the QF application -} diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/test.cpp b/examples/performance/dpp_efm32-slstk3401a/qxk/test.cpp deleted file mode 100644 index a4e5802ce..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/test.cpp +++ /dev/null @@ -1,60 +0,0 @@ -//============================================================================ -// DPP example for QXK -// Last updated for version 6.8.0 -// Last updated on 2020-01-15 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.hpp" -#include "bsp.hpp" - -namespace DPP { - -//............................................................................ -static void thread_function(QP::QXThread * const me) { - (void)me; // unused parameter - XT_Sema.init(1U); // 1 count - for (;;) { - (void)XT_Sema.wait(QP::QXTHREAD_NO_TIMEOUT); // wait forever - BSP::ledOn(); - QP::QXThread::delay(1U); // block for 1 clock tick - BSP::ledOff(); - } -} - -// local extended thread object .............................................. -static QP::QXThread l_test(&thread_function, 0U); - -// global pointer to the test thread ......................................... -QP::QXThread * const XT_Test = &l_test; -QP::QXSemaphore XT_Sema; - -} // namespace DPP diff --git a/examples/performance/dpp_efm32-slstk3401a/qxk/test.hpp b/examples/performance/dpp_efm32-slstk3401a/qxk/test.hpp deleted file mode 100644 index 160c18dd9..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/qxk/test.hpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// DPP example for QXK -// Last updated for version 6.7.0 -// Last updated on 2019-12-26 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef TEST_HPP -#define TEST_HPP - -namespace DPP { - -extern QP::QXThread * const XT_Test; -extern QP::QXSemaphore XT_Sema; - -} // namespace DPP - -#endif // TEST_HPP diff --git a/examples/performance/dpp_efm32-slstk3401a/table.cpp b/examples/performance/dpp_efm32-slstk3401a/table.cpp deleted file mode 100644 index 9772d08cd..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/table.cpp +++ /dev/null @@ -1,389 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp_qmsm.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.2.5 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::Table} .............................................................. -class Table : public QP::QMActive { -private: - uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - Table(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( active); - QM_STATE_DECL( serving); - QM_ACTION_DECL(serving_e); - QM_STATE_DECL( paused); - QM_ACTION_DECL(paused_e); - QM_ACTION_DECL(paused_x); -}; // class Table - -} // namespace DPP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace DPP { - -// helper function to provide the RIGHT neighbour of a Philo[n] -inline uint8_t RIGHT(uint8_t const n) { - return static_cast((n + (N_PHILO - 1U)) % N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -inline uint8_t LEFT(uint8_t const n) { - return static_cast((n + 1U) % N_PHILO); -} - -static uint8_t const FREE = static_cast(0); -static uint8_t const USED = static_cast(1); - -static char const * const THINKING = &"thinking"[0]; -static char const * const HUNGRY = &"hungry "[0]; -static char const * const EATING = &"eating "[0]; - -// Local objects ------------------------------------------------------------- -static Table l_table; // the single instance of the Table active object - -// Global-scope objects ------------------------------------------------------ -QP::QActive * const AO_Table = &l_table; // "opaque" AO pointer - -} // namespace DPP - -//............................................................................ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.0.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace DPP { - -//${AOs::Table} .............................................................. - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QMActive(Q_STATE_CAST(&Table::initial)) -{ - for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -QM_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - (void)e; // suppress the compiler warning about unused parameter - - QS_OBJ_DICTIONARY(&l_table); - QS_FUN_DICTIONARY(&QP::QHsm::top); - QS_FUN_DICTIONARY(&Table::initial); - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - QS_SIG_DICTIONARY(DONE_SIG, nullptr); // global signals - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal just for Table - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &serving_s, // target state - { - &serving_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Table::SM::active} .................................................. -QP::QMState const Table::active_s = { - QM_STATE_NULL, // superstate (top) - &Table::active, - Q_ACTION_NULL, // no entry action - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Table::SM::active} -QM_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -QP::QMState const Table::serving_s = { - &Table::active_s, // superstate - &Table::serving, - &Table::serving_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Table::SM::active::serving} -QM_ACTION_DEF(Table, serving_e) { - for (uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoNum = n; - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - return qm_entry(&serving_s); -} -//${AOs::Table::SM::active::serving} -QM_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - uint8_t m = LEFT(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = n; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - uint8_t m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoNum = m; - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &paused_s, // target state - { - &paused_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -QP::QMState const Table::paused_s = { - &Table::active_s, // superstate - &Table::paused, - &Table::paused_e, - &Table::paused_x, - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Table::SM::active::paused} -QM_ACTION_DEF(Table, paused_e) { - BSP::displayPaused(1U); - return qm_entry(&paused_s); -} -//${AOs::Table::SM::active::paused} -QM_ACTION_DEF(Table, paused_x) { - BSP::displayPaused(0U); - return qm_exit(&paused_s); -} -//${AOs::Table::SM::active::paused} -QM_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &serving_s, // target state - { - &paused_x, // exit - &serving_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - uint8_t n = Q_EVT_CAST(TableEvt)->philoNum; - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - uint8_t m = LEFT(n); - /* both forks of Phil[n] must be used */ - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace DPP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/app_cfg.h b/examples/performance/dpp_efm32-slstk3401a/uc-os2/app_cfg.h deleted file mode 100644 index a092ffd06..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/app_cfg.h +++ /dev/null @@ -1,113 +0,0 @@ -/*============================================================================ -* -* Quantum Leaps, LLC. www.state-machine.com -* Customized for ARM Cortex-M4F -* 2020-06-08 -*===========================================================================*/ -/* -********************************************************************************************************* -* EXAMPLE CODE -* -* This file is provided as an example on how to use Micrium products. -* -* Please feel free to use any application code labeled as 'EXAMPLE CODE' in -* your application products. Example code may be used as is, in whole or in -* part, or may be used as a reference only. This file can be modified as -* required to meet the end-product requirements. -* -********************************************************************************************************* -*/ - -/* -********************************************************************************************************* -* -* APPLICATION CONFIGURATION -* -* EXAMPLE CODE -* -* Filename : app_cfg.h -********************************************************************************************************* -*/ - -#ifndef _APP_CFG_H_ -#define _APP_CFG_H_ - - -/* -********************************************************************************************************* -* INCLUDE FILES -********************************************************************************************************* -*/ - -#include -#include - - -/* -********************************************************************************************************* -* MODULE ENABLE / DISABLE -********************************************************************************************************* -*/ - - -/* -********************************************************************************************************* -* TASK PRIORITIES -********************************************************************************************************* -*/ - -#define APP_CFG_STARTUP_TASK_PRIO 3u - -#define OS_TASK_TMR_PRIO (OS_LOWEST_PRIO - 2u) - - -/* -********************************************************************************************************* -* TASK STACK SIZES -* Size of the task stacks (# of OS_STK entries) -********************************************************************************************************* -*/ - -#define APP_CFG_STARTUP_TASK_STK_SIZE 128u - - -/* -********************************************************************************************************* -* TRACE / DEBUG CONFIGURATION -********************************************************************************************************* -*/ - -#ifndef TRACE_LEVEL_OFF -#define TRACE_LEVEL_OFF 0u -#endif - -#ifndef TRACE_LEVEL_INFO -#define TRACE_LEVEL_INFO 1u -#endif - -#ifndef TRACE_LEVEL_DBG -#define TRACE_LEVEL_DBG 2u -#endif - -#define APP_TRACE_LEVEL TRACE_LEVEL_OFF -#define APP_TRACE printf - -#define APP_TRACE_INFO(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_INFO) ? (void)(APP_TRACE x) : (void)0) -#define APP_TRACE_DBG(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_DBG) ? (void)(APP_TRACE x) : (void)0) - - -/* -********************************************************************************************************* -* CPU PORT CONFIGURATION -********************************************************************************************************* -*/ -#define CPU_CFG_KA_IPL_BOUNDARY 4u -#define CPU_CFG_NVIC_PRIO_BITS 3u - -/* -********************************************************************************************************* -* MODULE END -********************************************************************************************************* -*/ - -#endif /* End of module include. */ diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/bsp.cpp b/examples/performance/dpp_efm32-slstk3401a/uc-os2/bsp.cpp deleted file mode 100644 index 8f28dfb62..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/bsp.cpp +++ /dev/null @@ -1,494 +0,0 @@ -//============================================================================ -// Product: DPP example, EFM32-SLSTK3401A board, uC/OS-II kernel -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2021 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.h" -#include "bsp.hpp" - -#include "em_device.h" // the device specific header (SiLabs) -#include "em_cmu.h" // Clock Management Unit (SiLabs) -#include "em_gpio.h" // GPIO (SiLabs) -#include "em_usart.h" // USART (SiLabs) -// add other drivers if necessary... - -Q_DEFINE_THIS_FILE - -// namespace DPP ************************************************************* -namespace DPP { - -// Local-scope objects ------------------------------------------------------- -#define LED_PORT gpioPortF -#define LED0_PIN 4 -#define LED1_PIN 5 - -#define PB_PORT gpioPortF -#define PB0_PIN 6 -#define PB1_PIN 7 - -static uint32_t l_rnd; // random seed -OS_EVENT *l_rndMutex; // to protect the random number generator - -#ifdef Q_SPY - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - // QS source IDs - static QP::QSpyId const l_SysTick_Handler = { 0U }; - static QP::QSpyId const l_GPIO_EVEN_IRQHandler = { 0U }; - - static USART_TypeDef * const l_USART0 = ((USART_TypeDef *)(0x40010000UL)); - - #define UART_BAUD_RATE 115200U - #define UART_FR_TXFE (1U << 7) - #define UART_FR_RXFE (1U << 4) - #define UART_TXFIFO_DEPTH 16U - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - COMMAND_STAT - }; - -#endif - -// ISRs used in this project ================================================= -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - // - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, static_cast(10000U)); - -#ifndef NDEBUG - // light up both LEDs - GPIO->P[LED_PORT].DOUT |= ((1U << LED0_PIN) | (1U << LED1_PIN)); - // for debugging, hang on in an endless loop until PB1 is pressed... - while ((GPIO->P[PB_PORT].DIN & (1U << PB1_PIN)) != 0) { - } -#endif - - NVIC_SystemReset(); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - - -// example ISR handler for uCOS-II -//............................................................................ -void GPIO_EVEN_IRQHandler(void); // prototype -void GPIO_EVEN_IRQHandler(void) { -#if OS_CRITICAL_METHOD == 3u // Allocate storage for CPU status register - OS_CPU_SR cpu_sr; -#endif - - OS_ENTER_CRITICAL(); - OSIntEnter(); // Tell uC/OS-II that we are starting an ISR - OS_EXIT_CRITICAL(); - - // for testing... - DPP::AO_Table->POST(Q_NEW(QP::QEvt, DPP::MAX_PUB_SIG), - &l_GPIO_EVEN_IRQHandler); - - OSIntExit(); // Tell uC/OS-II that we are leaving the ISR -} -//............................................................................ -void USART0_RX_IRQHandler(void); // prototype -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernal-unaware" meaning that it does not interact -// with the QF/kernel and is not disabled. Such ISRs don't need to call -// QXK_ISR_ENTRY/QXK_ISR_EXIT and they cannot post or publish events. -// -void USART0_RX_IRQHandler(void) { - // while RX FIFO NOT empty - while ((DPP::l_USART0->STATUS & USART_STATUS_RXDATAV) != 0) { - uint32_t b = DPP::l_USART0->RXDATA; - QP::QS::rxPut(b); - } -} -#else -void USART0_RX_IRQHandler(void) {} -#endif // Q_SPY - - -// uCOS-II application hooks --=============================================== -void App_TaskCreateHook (OS_TCB *ptcb) { (void)ptcb; } -void App_TaskDelHook (OS_TCB *ptcb) { (void)ptcb; } -//............................................................................ -void App_TaskIdleHook(void) { -/* - // toggle LED1 on and then off, see NOTE01 - QF_CRIT_STAT - QF_CRIT_ENTER(); - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); // turn the LED on - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); // turn the LED off - QF_CRIT_EXIT(); -*/ - -#ifdef Q_SPY - QP::QS::rxParse(); // parse all the received bytes - - if ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) != 0) { // is TXE empty? - uint16_t b; - - OS_ENTER_CRITICAL(); - b = QP::QS::getByte(); - OS_EXIT_CRITICAL(); - - if (b != QS_EOD) { // not End-Of-Data? - DPP::l_USART0->TXDATA = (b & 0xFFU); // put into the DR register - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M3 MCU. - // - __WFI(); // Wait-For-Interrupt -#endif -} -//............................................................................ -void App_TaskReturnHook (OS_TCB *ptcb) { (void)ptcb; } -void App_TaskStatHook (void) {} -void App_TaskSwHook (void) {} -void App_TCBInitHook (OS_TCB *ptcb) { (void)ptcb; } -//............................................................................ -void App_TimeTickHook(void) { - uint32_t tmp; - -#ifdef Q_SPY - { - tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover - } -#endif - - QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - // - // state of the button debouncing, see below - static struct ButtonsDebouncing { - uint32_t depressed; - uint32_t previous; - } buttons = { 0U, 0U }; - uint32_t current; - current = ~GPIO->P[PB_PORT].DIN; // read PB0 and BP1 - tmp = buttons.depressed; // save the debounced depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - if ((tmp & (1U << PB0_PIN)) != 0U) { // debounced PB0 state changed? - if ((buttons.depressed & (1U << PB0_PIN)) != 0U) { // PB0 depressed? - static QP::QEvt const pauseEvt(DPP::PAUSE_SIG); - QP::QF::PUBLISH(&pauseEvt, &l_SysTick_Handler); - } - else { // the button is released - static QP::QEvt const serveEvt(DPP::SERVE_SIG); - QP::QF::PUBLISH(&serveEvt, &l_SysTick_Handler); - } - } - if ((tmp & (1U << PB1_PIN)) != 0U) { // debounced PB1 state changed? - if ((buttons.depressed & (1U << PB1_PIN)) != 0U) { // PB1 depressed? - OSSemPost(Sema); // signal the semaphore (test) - } - } -} - -} // extern "C" - -// BSP functions ============================================================= -void BSP::init(void) { - // NOTE: SystemInit() already called from the startup code - // but SystemCoreClock needs to be updated - // - SystemCoreClockUpdate(); - - // enable clock for to the peripherals used by this application... - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // configure the LEDs - GPIO_PinModeSet(LED_PORT, LED0_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(LED_PORT, LED1_PIN, gpioModePushPull, 0); - GPIO_PinOutClear(LED_PORT, LED0_PIN); - GPIO_PinOutClear(LED_PORT, LED1_PIN); - - // configure the Buttons - GPIO_PinModeSet(PB_PORT, PB0_PIN, gpioModeInputPull, 1); - GPIO_PinModeSet(PB_PORT, PB1_PIN, gpioModeInputPull, 1); - - //... - BSP::randomSeed(1234U); - - if (!QS_INIT(nullptr)) { // initialize the QS software tracing - Q_ERROR(); - } - QS_OBJ_DICTIONARY(&l_SysTick_Handler); - QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(COMMAND_STAT); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_SM_RECORDS); // state machine records - QS_GLB_FILTER(QP::QS_AO_RECORDS); // active object records - QS_GLB_FILTER(QP::QS_UA_RECORDS); // all user records -} -//............................................................................ -void BSP::displayPhilStat(uint8_t n, char const *stat) { - if (stat[0] == 'e') { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } - - QS_BEGIN_ID(PHILO_STAT, AO_Philo[n]->getPrio()) // app-specific record begin - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void BSP::displayPaused(uint8_t paused) { - if (paused != 0U) { - GPIO->P[LED_PORT].DOUT |= (1U << LED0_PIN); - OSSemPost(Sema); // signal the semaphore (test) - } - else { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED0_PIN); - } -} -//............................................................................ -uint32_t BSP::random(void) { // a very cheap pseudo-random-number generator - INT8U err; - - OSMutexPend(l_rndMutex, 0, &err); // lock the random-seed mutex - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - OSMutexPost(l_rndMutex); // unlock the random-seed mutex - - return (rnd >> 8); -} -//............................................................................ -void BSP::randomSeed(uint32_t seed) { - INT8U err; - - l_rnd = seed; - - // create uC/OS-II mutex at the given uC/OS-II priority - l_rndMutex = OSMutexCreate(QF_MAX_ACTIVE - (N_PHILO + 3U), &err); - Q_ENSURE(err == OS_ERR_NONE); -} -//............................................................................ -void BSP::ledOn(void) { - GPIO->P[LED_PORT].DOUT |= (1U << LED1_PIN); -} -//............................................................................ -void BSP::ledOff(void) { - GPIO->P[LED_PORT].DOUT &= ~(1U << LED1_PIN); -} -//............................................................................ -void BSP::terminate(int16_t result) { - (void)result; -} - -} // namespace DPP - - -// namespace QP ************************************************************** -namespace QP { - -// QF callbacks ============================================================== -void QF::onStartup(void) { - // initialize the system clock tick... - OS_CPU_SysTickInit(SystemCoreClock / OS_TICKS_PER_SEC); - - // set priorities of the ISRs used in the system - NVIC_SetPriority(USART0_RX_IRQn, 0); - NVIC_SetPriority(SysTick_IRQn, 1); - NVIC_SetPriority(GPIO_EVEN_IRQn, 2); - // ... - - // enable IRQs... - NVIC_EnableIRQ(GPIO_EVEN_IRQn); -#ifdef Q_SPY - NVIC_EnableIRQ(USART0_RX_IRQn); // UART0 interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup(void) { -} - -//............................................................................ -// QS callbacks ============================================================== -#ifdef Q_SPY -//............................................................................ -bool QS::onStartup(void const *arg) { - static uint8_t qsTxBuf[2*1024]; // buffer for QS transmit channel - static uint8_t qsRxBuf[100]; // buffer for QS receive channel - static USART_InitAsync_TypeDef init = { - usartEnable, // Enable RX/TX when init completed - 0, // Use current clock for configuring baudrate - 115200, // 115200 bits/s - usartOVS16, // 16x oversampling - usartDatabits8, // 8 databits - usartNoParity, // No parity - usartStopbits1, // 1 stopbit - 0, // Do not disable majority vote - 0, // Not USART PRS input mode - usartPrsRxCh0, // PRS channel 0 - 0, // Auto CS functionality enable/disable switch - 0, // Auto CS Hold cycles - 0 // Auto CS Setup cycles - }; - - initBuf (qsTxBuf, sizeof(qsTxBuf)); - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // Enable peripheral clocks - CMU_ClockEnable(cmuClock_HFPER, true); - CMU_ClockEnable(cmuClock_GPIO, true); - - // To avoid false start, configure output as high - GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1); // TX pin - GPIO_PinModeSet(gpioPortA, 1, gpioModeInput, 0); // RX pin - - // Enable DK RS232/UART switch - GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 1); - CMU_ClockEnable(cmuClock_USART0, true); - - // configure the UART for the desired baud rate, 8-N-1 operation - init.enable = usartDisable; - USART_InitAsync(DPP::l_USART0, &init); - - // enable pins at correct UART/USART location. - DPP::l_USART0->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; - DPP::l_USART0->ROUTELOC0 = (DPP::l_USART0->ROUTELOC0 & - ~(_USART_ROUTELOC0_TXLOC_MASK - | _USART_ROUTELOC0_RXLOC_MASK)); - - // Clear previous RX interrupts - USART_IntClear(DPP::l_USART0, USART_IF_RXDATAV); - NVIC_ClearPendingIRQ(USART0_RX_IRQn); - - // Enable RX interrupts - USART_IntEnable(DPP::l_USART0, USART_IF_RXDATAV); - // NOTE: do not enable the UART0 interrupt in the NVIC yet. - // Wait till QF::onStartup() - - - // Finally enable the UART - USART_Enable(DPP::l_USART0, usartEnable); - - DPP::QS_tickPeriod_ = SystemCoreClock / DPP::BSP::TICKS_PER_SEC; - DPP::QS_tickTime_ = DPP::QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return DPP::QS_tickTime_ - static_cast(SysTick->VAL); - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return DPP::QS_tickTime_ + DPP::QS_tickPeriod_ - - static_cast(SysTick->VAL); - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while ((DPP::l_USART0->STATUS & USART_STATUS_TXBL) == 0U) { - } - DPP::l_USART0->TXDATA = (b & 0xFFU); // put into the DR register - } - else { - break; - } - } -} -//............................................................................ -void QS::onReset(void) { - NVIC_SystemReset(); -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - QS_BEGIN_ID(DPP::COMMAND_STAT, 0U) // app-specific record - QS_U8(2, cmdId); - QS_U32(8, param1); - QS_END() -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE01: -// The User LED is used to visualize the idle loop activity. The brightness -// of the LED is proportional to the frequency of invcations of the idle loop. -// Please note that the LED is toggled with interrupts locked, so no interrupt -// execution time contributes to the brightness of the User LED. -// diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewd b/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewd deleted file mode 100644 index 89fcac41e..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewp b/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewp deleted file mode 100644 index f8954de3f..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.ewp +++ /dev/null @@ -1,3431 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\app_cfg.h - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\..\bsp.hpp - - - $PROJ_DIR$\..\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\os_cfg.h - - - $PROJ_DIR$\..\..\philo.cpp - - - $PROJ_DIR$\..\..\table.cpp - - - $PROJ_DIR$\..\test.cpp - - - $PROJ_DIR$\..\test.hpp - - - - efm32pg1b - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_cmu.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\em_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\iar\startup_efm32pg1b.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\efm32pg1b\system_efm32pg1b.c - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\app_cfg.h - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\os_cfg.h - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\qf_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - uC-OS2 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\ucos_ii.h - - - - uC-OS2_port - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_cpu.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_cpu_a.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_dbg.c - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.eww b/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.eww deleted file mode 100644 index c01c4664c..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp-ucos2.ewp - - - - - diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.icf b/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.icf deleted file mode 100644 index da0bc0539..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/iar/dpp-ucos2.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 512; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/main.cpp b/examples/performance/dpp_efm32-slstk3401a/uc-os2/main.cpp deleted file mode 100644 index cc947ef84..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/main.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//============================================================================ -// DPP example, uC/OS-II kernel -// Last updated for version 6.1.0 -// Last updated on 2018-02-11 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005-2018 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.h" -#include "bsp.hpp" -#include "assert.h" - -Q_DEFINE_THIS_FILE - -//............................................................................ -int main() { - // stacks for all uC/OS-II threads (grouped together for ease of testing) - static OS_STK philoStackSto[N_PHILO][128]; - static OS_STK tableStackSto[256]; - static OS_STK testStackSto[128]; - - static QP::QEvt const *tableQueueSto[N_PHILO]; - static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO]; - - static QP::QSubscrList subscrSto[DPP::MAX_PUB_SIG]; - static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO]; // small pool - - QP::QF::init(); // initialize the framework and the underlying RT kernel - DPP::BSP::init(); // initialize the BSP - - // initialize publish-subscribe... - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - for (uint8_t n = 0U; n < N_PHILO; ++n) { - // NOTE: provide uC/OS-II task attributes for the AO's task - DPP::AO_Philo[n]->setAttr(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK, 0); - DPP::AO_Philo[n]->start( - n + 3U, // QP priority - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStackSto[n], // stack storage - sizeof(philoStackSto[n])); // stack size [bytes] - } - - // NOTE: leave QF priority (N_PHILO + 3U) for the mutex to - // protect the random number generator shared among Philo AOs - - // NOTE: provide uC/OS-II task attributes for the AO's task - DPP::AO_Table->setAttr(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK, 0); - DPP::AO_Table->start( - N_PHILO + 4U, // QP priority - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStackSto, // stack storage - sizeof(tableStackSto)); // stack size [bytes] - - // start a "naked" uC/OS-II task for testing... - INT8U const err = OSTaskCreateExt( - &test_thread, // the test thread function - nullptr, // the 'pdata' parameter - &testStackSto[(sizeof(testStackSto)/sizeof(OS_STK)) - 1], - static_cast(QF_MAX_ACTIVE - (N_PHILO + 5U)), // uC/OS-II prio - static_cast(N_PHILO + 5U), // the unique task id - static_cast(&testStackSto[0]), // pbos - static_cast(sizeof(testStackSto)/sizeof(OS_STK)), - nullptr, // pext - static_cast(OS_TASK_OPT_STK_CLR)); // task attributes - Q_ASSERT(err == OS_ERR_NONE); - - return QP::QF::run(); // run the QF application -} diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/os_cfg.h b/examples/performance/dpp_efm32-slstk3401a/uc-os2/os_cfg.h deleted file mode 100644 index 8ede97aee..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/os_cfg.h +++ /dev/null @@ -1,157 +0,0 @@ -/*============================================================================ -* -* The uCOS-II OS configuration for the QP port must enable message queues -* (OS_Q_EN == 1) and memory partitions (OS_MEM_EN == 1). Other settings -* are irrelevant and are disabled, so that the APIs won't be exposed for -* building the QP library. -* -* However, applications can (and should) provide the actual uCOS-II OS -* configuration, which will enable any additional features needed -* by the application. -* -* Quantum Leaps, LLC. www.state-machine.com -* 2016-06-29 -*===========================================================================*/ -/* -********************************************************************************************************* -* uC/OS-II -* The Real-Time Kernel -* uC/OS-II Configuration File for V2.9x -* -* (c) Copyright 2005-2013, Micrium, Weston, FL -* All Rights Reserved -* -* -* File : OS_CFG.H -* By : Jean J. Labrosse -* Version : V2.92.08 -* -* LICENSING TERMS: -* --------------- -* uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research. -* If you plan on using uC/OS-II in a commercial product you need to contact Micrium to properly license -* its use in your product. We provide ALL the source code for your convenience and to help you experience -* uC/OS-II. The fact that the source is provided does NOT mean that you can use it without paying a -* licensing fee. -********************************************************************************************************* -*/ - -#ifndef OS_CFG_H -#define OS_CFG_H - - - /* ---------------------- MISCELLANEOUS ----------------------- */ -#define OS_APP_HOOKS_EN 1u /* Application-defined hooks are called from the uC/OS-II hooks */ -#define OS_ARG_CHK_EN 0u /* Enable (1) or Disable (0) argument checking */ -#define OS_CPU_HOOKS_EN 1u /* uC/OS-II hooks are found in the processor port files */ - -#define OS_DEBUG_EN 0u /* Enable(1) debug variables */ - -#define OS_EVENT_MULTI_EN 0u /* Include code for OSEventPendMulti() */ -#define OS_EVENT_NAME_EN 0u /* Enable names for Sem, Mutex, Mbox and Q */ - -#define OS_LOWEST_PRIO 31u /* Defines the lowest priority that can be assigned ... */ - /* ... MUST NEVER be higher than 254! */ - -#define OS_MAX_EVENTS 8u /* Max. number of event control blocks in your application */ -#define OS_MAX_FLAGS 0u /* Max. number of Event Flag Groups in your application */ -#define OS_MAX_MEM_PART 3u /* Max. number of memory partitions */ -#define OS_MAX_QS 7u /* Max. number of queue control blocks in your application */ -#define OS_MAX_TASKS 13u /* Max. number of tasks in your application, MUST be >= 2 */ - -#define OS_SCHED_LOCK_EN 1u /* Include code for OSSchedLock() and OSSchedUnlock() */ - -#define OS_TICK_STEP_EN 0u /* Enable tick stepping feature for uC/OS-View */ -#define OS_TICKS_PER_SEC 100u /* Set the number of ticks in one second */ - - - /* --------------------- TASK STACK SIZE ---------------------- */ -#define OS_TASK_TMR_STK_SIZE 128u /* Timer task stack size (# of OS_STK wide entries) */ -#define OS_TASK_STAT_STK_SIZE 128u /* Statistics task stack size (# of OS_STK wide entries) */ -#define OS_TASK_IDLE_STK_SIZE 128u /* Idle task stack size (# of OS_STK wide entries) */ - - - /* --------------------- TASK MANAGEMENT ---------------------- */ -#define OS_TASK_CHANGE_PRIO_EN 0u /* Include code for OSTaskChangePrio() */ -#define OS_TASK_CREATE_EN 0u /* Include code for OSTaskCreate() */ -#define OS_TASK_CREATE_EXT_EN 1u /* Include code for OSTaskCreateExt() */ -#define OS_TASK_DEL_EN 1u /* Include code for OSTaskDel() */ -#define OS_TASK_NAME_EN 0u /* Enable task names */ -#define OS_TASK_PROFILE_EN 0u /* Include variables in OS_TCB for profiling */ -#define OS_TASK_QUERY_EN 0u /* Include code for OSTaskQuery() */ -#define OS_TASK_REG_TBL_SIZE 1u /* Size of task variables array (#of INT32U entries) */ -#define OS_TASK_STAT_EN 0u /* Enable (1) or Disable(0) the statistics task */ -#define OS_TASK_STAT_STK_CHK_EN 0u /* Check task stacks from statistic task */ -#define OS_TASK_SUSPEND_EN 0u /* Include code for OSTaskSuspend() and OSTaskResume() */ -#define OS_TASK_SW_HOOK_EN 1u /* Include code for OSTaskSwHook() */ - - - /* ----------------------- EVENT FLAGS ------------------------ */ -#define OS_FLAG_EN 0u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */ -#define OS_FLAG_ACCEPT_EN 1u /* Include code for OSFlagAccept() */ -#define OS_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */ -#define OS_FLAG_NAME_EN 1u /* Enable names for event flag group */ -#define OS_FLAG_QUERY_EN 1u /* Include code for OSFlagQuery() */ -#define OS_FLAG_WAIT_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */ -#define OS_FLAGS_NBITS 16u /* Size in #bits of OS_FLAGS data type (8, 16 or 32) */ - - - /* -------------------- MESSAGE MAILBOXES --------------------- */ -#define OS_MBOX_EN 0u /* Enable (1) or Disable (0) code generation for MAILBOXES */ -#define OS_MBOX_ACCEPT_EN 1u /* Include code for OSMboxAccept() */ -#define OS_MBOX_DEL_EN 1u /* Include code for OSMboxDel() */ -#define OS_MBOX_PEND_ABORT_EN 1u /* Include code for OSMboxPendAbort() */ -#define OS_MBOX_POST_EN 1u /* Include code for OSMboxPost() */ -#define OS_MBOX_POST_OPT_EN 1u /* Include code for OSMboxPostOpt() */ -#define OS_MBOX_QUERY_EN 1u /* Include code for OSMboxQuery() */ - - - /* --------------------- MEMORY MANAGEMENT -------------------- */ -#define OS_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */ -#define OS_MEM_NAME_EN 0u /* Enable memory partition names */ -#define OS_MEM_QUERY_EN 0u /* Include code for OSMemQuery() */ - - - /* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */ -#define OS_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */ -#define OS_MUTEX_ACCEPT_EN 0u /* Include code for OSMutexAccept() */ -#define OS_MUTEX_DEL_EN 0u /* Include code for OSMutexDel() */ -#define OS_MUTEX_QUERY_EN 0u /* Include code for OSMutexQuery() */ - - -//SAR Modification, was on. /* ---------------------- MESSAGE QUEUES ---------------------- */ -#define OS_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */ -#define OS_Q_ACCEPT_EN 0u /* Include code for OSQAccept() */ -#define OS_Q_DEL_EN 1u /* Include code for OSQDel() */ -#define OS_Q_FLUSH_EN 0u /* Include code for OSQFlush() */ -#define OS_Q_PEND_ABORT_EN 0u /* Include code for OSQPendAbort() */ -#define OS_Q_POST_EN 1u /* Include code for OSQPost() */ -#define OS_Q_POST_FRONT_EN 1u /* Include code for OSQPostFront() */ -#define OS_Q_POST_OPT_EN 0u /* Include code for OSQPostOpt() */ -#define OS_Q_QUERY_EN 0u /* Include code for OSQQuery() */ - - - /* ------------------------ SEMAPHORES ------------------------ */ -#define OS_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */ -#define OS_SEM_ACCEPT_EN 0u /* Include code for OSSemAccept() */ -#define OS_SEM_DEL_EN 0u /* Include code for OSSemDel() */ -#define OS_SEM_PEND_ABORT_EN 0u /* Include code for OSSemPendAbort() */ -#define OS_SEM_QUERY_EN 0u /* Include code for OSSemQuery() */ -#define OS_SEM_SET_EN 0u /* Include code for OSSemSet() */ - - - /* --------------------- TIME MANAGEMENT ---------------------- */ -#define OS_TIME_DLY_HMSM_EN 0u /* Include code for OSTimeDlyHMSM() */ -#define OS_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */ -#define OS_TIME_GET_SET_EN 1u /* Include code for OSTimeGet() and OSTimeSet() */ -#define OS_TIME_TICK_HOOK_EN 1u /* Include code for OSTimeTickHook() */ - - -//SAR Modification, was on. /* --------------------- TIMER MANAGEMENT --------------------- */ -#define OS_TMR_EN 0u /* Enable (1) or Disable (0) code generation for TIMERS */ -#define OS_TMR_CFG_MAX 16u /* Maximum number of timers */ -#define OS_TMR_CFG_NAME_EN 1u /* Determine timer names */ -#define OS_TMR_CFG_WHEEL_SIZE 8u /* Size of timer wheel (#Spokes) */ -#define OS_TMR_CFG_TICKS_PER_SEC 10u /* Rate at which timer management task runs (Hz) */ - -#endif diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.cpp b/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.cpp deleted file mode 100644 index 80f929b1e..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.cpp +++ /dev/null @@ -1,60 +0,0 @@ -//============================================================================ -// Product: DPP example, uC/OS-II kernel -// Last Updated for Version: 5.6.5 -// Date of the Last Update: 2016-07-02 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "test.h" -#include "bsp.hpp" -#include "assert.h" - -Q_DEFINE_THIS_FILE - -extern "C" { - -OS_EVENT *Sema; // uC/OS-II semaphore for testing - -//............................................................................ -void test_thread(void *pdata) { // uC/OS-II task signature - (void)pdata; - Sema = OSSemCreate(1); - Q_ASSERT(Sema != static_cast(0)); // semaphore must be created - for (;;) { - INT8U err; - OSSemPend(Sema, 0, &err); // wait forever - DPP::BSP::ledOn(); - OSTimeDly(1); // 1 clock cycle - DPP::BSP::ledOff(); - } -} - -} // extern "C" diff --git a/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.h b/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.h deleted file mode 100644 index 3ee2c3b0e..000000000 --- a/examples/performance/dpp_efm32-slstk3401a/uc-os2/test.h +++ /dev/null @@ -1,43 +0,0 @@ -//============================================================================ -// DPP example for QXK -// Last updated for version 5.6.5 -// Last updated on 2016-07-02 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// mailto:info@state-machine.com -//============================================================================ -#ifndef test_h -#define test_h - -extern "C" { - void test_thread(void *pdata); // uC/OS-II task signature - - extern OS_EVENT *Sema; // uC/OS-II semaphore for testing -} - -#endif // test_h diff --git a/examples/pic32/dpp_microstick2-pic32/bsp.hpp b/examples/pic32/dpp_microstick2-pic32/bsp.hpp deleted file mode 100644 index 1c5e0b658..000000000 --- a/examples/pic32/dpp_microstick2-pic32/bsp.hpp +++ /dev/null @@ -1,56 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/pic32/dpp_microstick2-pic32/dpp.hpp b/examples/pic32/dpp_microstick2-pic32/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/pic32/dpp_microstick2-pic32/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/pic32/dpp_microstick2-pic32/dpp.qm b/examples/pic32/dpp_microstick2-pic32/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/pic32/dpp_microstick2-pic32/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/pic32/dpp_microstick2-pic32/main.cpp b/examples/pic32/dpp_microstick2-pic32/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/pic32/dpp_microstick2-pic32/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/pic32/dpp_microstick2-pic32/philo.cpp b/examples/pic32/dpp_microstick2-pic32/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/Makefile b/examples/pic32/dpp_microstick2-pic32/qk/xc32/Makefile deleted file mode 100644 index f026b295c..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/Makefile +++ /dev/null @@ -1,108 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help message -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# Available make variables: -# -# CND_BASEDIR base directory for relative paths -# CND_DISTDIR default top distribution directory (build artifacts) -# CND_BUILDDIR default top build directory (object files, ...) -# CONF name of current configuration -# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) -# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) -# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) -# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) -# CND_PACKAGE_NAME_${CONF} name of package (current configuration) -# CND_PACKAGE_PATH_${CONF} path to package (current configuration) -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib - - -# build -build: .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: .build-impl -# Add your post 'build' code here... - - -# clean -clean: .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: .clean-impl -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: .clobber-impl -# Add your post 'clobber' code here... - - -# all -all: .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: .all-impl -# Add your post 'all' code here... - - -# help -help: .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: .help-impl -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk - -# include project make variables -include nbproject/Makefile-variables.mk diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/bsp.cpp b/examples/pic32/dpp_microstick2-pic32/qk/xc32/bsp.cpp deleted file mode 100644 index 990e26d3e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/bsp.cpp +++ /dev/null @@ -1,399 +0,0 @@ -//============================================================================ -// BSP for DPP example, Microstick II board, preemptive QK kernel, XC32 -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#pragma config FNOSC = FRCPLL // 8 MHz -#pragma config FPLLIDIV = DIV_2 // 4 MHz -#pragma config FPLLMUL = MUL_20 // 80 MHz -#pragma config FPLLODIV = DIV_2 // 40 MHz == FRC -#pragma config FWDTEN = OFF // watchdog off -#pragma config FPBDIV = DIV_1 // same peripheral clock - -// #pragma config statements should precede project file includes -#include // header for PIC32 device in use -#include - -// system clock using FRC and PLL: 40 MHz -#define SYS_FREQ 40000000U -// peripheral clock frequency -#define PER_HZ (SYS_FREQ / 1U) - -// controlling the LED of Microstick II -#define LED_ON() (LATASET = (1U << 0U)) -#define LED_OFF() (LATACLR = (1U << 0U)) -#define LED_TOGGLE() (LATAINV = (1U << 0U)) - -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - static QP::QSpyId const l_tickISR {0U}; - static QP::QSpyId const l_testISR {0U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif // Q_SPY - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - // perform a system unlock sequence ,starting critical sequence - SYSKEY = 0x00000000U; //write invalid key to force lock - SYSKEY = 0xAA996655U; //write key1 to SYSKEY - SYSKEY = 0x556699AAU; //write key2 to SYSKEY - // set SWRST bit to arm reset - RSWRSTSET = 1U; - // read RSWRST register to trigger reset - std::uint32_t volatile dummy = RSWRST; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs -------------------------------------------------------------------- - -void __ISR(_TIMER_2_VECTOR, IPL4SOFT) tickISR(void) { - QK_ISR_ENTRY(); // inform QK about the ISR entry - - IFS0CLR = _IFS0_T2IF_MASK; // clear the interrupt source - - QP::QTimeEvt::TICK_X(0U, &l_tickISR); // handle time events at tick rate 0 - - QK_ISR_EXIT(); // inform QK about the ISR exit -} -//............................................................................ -// for testing interrupt nesting and active object preemption -void __ISR(_EXTERNAL_0_VECTOR, IPL6SOFT) testISR(void) { - QK_ISR_ENTRY(); // inform QK about the ISR entry - - IFS0CLR = _IFS0_INT0IF_MASK; // clear the interrupt source - - static QP::QEvt const eat_evt(APP::EAT_SIG); - APP::AO_Table->POST(&eat_evt, &l_testISR); - - QK_ISR_EXIT(); // inform QK about the ISR exit -} - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - TRISA = 0x00U; // set LED pins as outputs - PORTA = 0x00U; // set LED drive state low - - randomSeed(1234U); - - // initialize the QS software tracing - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_tickISR); - QS_OBJ_DICTIONARY(&l_testISR); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - - // NOTE: set the preemption-threshold of all Philos to - // the same level, so that they cannot preempt each other. - Q_PRIO(n + 3U, APP::N_PHILO + 2U), // QF-prio/pre-thre. - - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); -} -//............................................................................ -void displayPhilStat(std::uint8_t const n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { // is Philo eating? - LED_ON(); - } - else { - LED_OFF(); - } - - // app-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - Q_UNUSED_PAR(paused); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a cheap pseudo-random-number generator - - QP::QSchedStatus lockStat = QP::QK::schedLock(APP::N_PHILO); - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - QP::QK::schedUnlock(lockStat); - - return (rnd >> 8U); -} - -} // namespace BSP - - -//=========================================================================== -namespace QP { - -void QF::onStartup() { - INTCONSET = _INTCON_MVEC_MASK; // configure multi-vectored interrupts - - T2CON = 0x0060U; // stop timer, set up for 1:64 prescaler - TMR2 = 0U; // count from zero up to the period - PR2 = SYS_FREQ / (BSP::TICKS_PER_SEC * 64U); // set the Timer2 period - IFS0CLR = _IFS0_T2IF_MASK; // clear Timer2 Interrupt Flag - IEC0SET = _IEC0_T2IE_MASK; // enable Timer2 interrupt - T2CONSET = _T2CON_ON_MASK; // Start Timer2 - - INTCONbits.INT0EP = 1U; // INT0 interrupt on positive edge - IEC0SET = _IEC0_INT0IE_MASK; // enable INT0 interrupt - IFS0CLR = _IFS0_INT0IF_MASK; // clear the interrupt for INT0 - - // explicitly assign priorities to all interrupts... - // NOTE: must match the IPLxSOFT settings in the __ISR() macros - IPC2bits.T2IP = 4U; // Timer2 interrupt priority, must match tickISR - IPC0bits.INT0IP = 6U; // set INT0 priority; must match IPL in testISR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QK::onIdle() { - - // NOTE: not enough LEDs on the Microstick II board to implement - // the idle loop activity indicator ... - //QF_INT_DISABLE(); - //LED_ON (); - //LED_OFF(); - //QF_INT_ENABLE(); - -#ifdef Q_SPY - while (U2STAbits.UTXBF == 0U) { // TX Buffer not full? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // End-Of-Data reached? - U2TXREG = b; // stick the byte to TXREG for transmission - } - else { - break; // break out of the loop - } - } -#elif defined NDEBUG - _wait(); // execute the WAIT instruction to stop the CPU -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY - -#define QS_BUF_SIZE 4096U -#define QS_BAUD_RATE 115200U - -//............................................................................ -bool QS::onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static uint8_t qsBuf[QS_BUF_SIZE]; // buffer for QS-TX - initBuf(qsBuf, sizeof(qsBuf)); // initialize the QS-TX channel - - //TBD: implement QS-RX channel - - // initialize the UART2 for transmitting the QS trace data - U2RXRbits.U2RXR = 3; // Set U2RX to RPB11, pin 22, J6-5 - RPB10Rbits.RPB10R = 2; // Set U2TX to RPB10, pin 21, J6-4 - - U2STA = 0x0000U; // use default settings of 8N1 - U2MODE = 0x0008U; // enable high baud rate - U2BRG = (uint16_t)((PER_HZ / (4.0 * QS_BAUD_RATE)) - 1.0 + 0.5); - U2MODEbits.UARTEN = 1; - U2STAbits.UTXEN = 1; - - return true; // return success -} -//............................................................................ -void QS::onCleanup() { -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while (U2STAbits.UTXBF) { // TX Buffer full? - } - U2TXREG = b; // stick the byte to TXREG for transmission - } - else { - break; - } - } -} -//............................................................................ -QSTimeCtr QS::onGetTime() { - return __builtin_mfc0(_CP0_COUNT, _CP0_COUNT_SELECT); -} -//............................................................................ -void QS::onReset() { - // perform a system unlock sequence ,starting critical sequence - SYSKEY = 0x00000000; //write invalid key to force lock - SYSKEY = 0xAA996655; //write key1 to SYSKEY - SYSKEY = 0x556699AA; //write key2 to SYSKEY - // set SWRST bit to arm reset - RSWRSTSET = 1; - // read RSWRST register to trigger reset - std::uint32_t volatile dummy = RSWRST; - // prevent any unwanted code execution until reset occurs -} -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE2: -// The Temporal Proximity Timer is used to prevent a race condition of -// servicing an interrupt after re-enabling interrupts and before executing -// the WAIT instruction. The Proximity Timer is enabled for all interrupt -// priority levels (see QF_onStartup()). The Proximity Timer is set to 4 -// CPU clocks right before re-enabling interrupts (with the DI instruction) -// The 4 clock ticks should be enough to execute the (DI,WAIT) instruction -// pair _atomically_. -// - diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-dbg.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-dbg.mk deleted file mode 100644 index fb5c456a4..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-dbg.mk +++ /dev/null @@ -1,374 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-dbg.mk)" "nbproject/Makefile-local-dbg.mk" -include nbproject/Makefile-local-dbg.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=dbg -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665876/qk.o.d ${OBJECTDIR}/_ext/1627782163/qk_port.o.d ${OBJECTDIR}/_ext/820665884/qstamp.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-dbg.mk ${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp .generated_files/flags/dbg/81210811278d288637bc9fc915a83dd4d5f779c4 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp .generated_files/flags/dbg/5f426310d281fbefdda395d5099e819ca7183909 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp .generated_files/flags/dbg/bbfd0f0648549f4abbc1bb84dab5a43435540f73 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp .generated_files/flags/dbg/40450d3da67b850856d14286e4fd71cbad967c87 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp .generated_files/flags/dbg/bc1ac7a01fc5fa34e3a5fbb447a67958e0dd5719 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp .generated_files/flags/dbg/870f5cf3f2bfd76875421bbb0a59e4e1c252b6c .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp .generated_files/flags/dbg/5f5b2da0b1cd86620c31223f572d3cf0d601a2ad .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp .generated_files/flags/dbg/8f75ddf1de40572f54650fd4f162e606025ebf81 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp .generated_files/flags/dbg/47511662997f825effe33708c11b763991a0cfb5 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp .generated_files/flags/dbg/4d2deea56278708dd46eb72074dfb6e41cee8d12 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp .generated_files/flags/dbg/2aa2b41ee77213fed0600e57fa3e40972faed385 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp .generated_files/flags/dbg/a956ff76d47d176d71a9de13a427381506ff1372 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp .generated_files/flags/dbg/a91a9f6e9577cbf8e7180e68fee7c2ff62527cbd .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp .generated_files/flags/dbg/cc29aa80606948651a44452435a00ff6a9626064 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp .generated_files/flags/dbg/23e0ff1a2f33719fcb373df220e5be9274cc10c2 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp .generated_files/flags/dbg/b98ac871914b5a03c30de2c118a7ef71a18bca85 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp .generated_files/flags/dbg/20f9934b26f2bd53abca2e44b6b4d51923d788d4 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp .generated_files/flags/dbg/983c92ca54d665e7657f9212de16bfd8093a60f8 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp .generated_files/flags/dbg/80121346fc68e1df7dcff23c708b94f4c53f804c .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp .generated_files/flags/dbg/88479abe977da16bd8d1a6f239050e6314815b6e .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp .generated_files/flags/dbg/ff57abd02c7a97e91305a31c3b5afd4509698ed9 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp .generated_files/flags/dbg/64a08f5fa5651eb9a7d40516e59838382f172e15 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp .generated_files/flags/dbg/d2cd955259f248289d5a6ce8dcb38209273be464 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp .generated_files/flags/dbg/cfb22ee7487f7fdb33119a3ab40752eb1376d24a .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp .generated_files/flags/dbg/2cc691290e7660e17a9f48e8e8e84010891eca3c .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp .generated_files/flags/dbg/5013a5719086d195cdf529f0a9d2f28207cdf2d .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp .generated_files/flags/dbg/da9bce521c886b7af7204bffd73da7e717f5e1f8 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp .generated_files/flags/dbg/9172668d22e2042a8eddab57365456c345cfd59 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp .generated_files/flags/dbg/1bc9365a4cb08daa6b1e592e51231a3c6e114eed .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp .generated_files/flags/dbg/86e185b6421b5ec9d6c38ebd684d1864ba7accb .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp .generated_files/flags/dbg/9d235860a7ee9417036771f537582e6c87a48b4f .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp .generated_files/flags/dbg/bca1b415b663960dfd949546a42777800389d1e0 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp .generated_files/flags/dbg/d943aa383327b3c07c1ceb268f610f95f3c21e3c .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp .generated_files/flags/dbg/3583d257c4733a85d2b3f639859a7772d4a4209 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp .generated_files/flags/dbg/4890aa644d3248d6cbbc10654f95cb0221fb67b7 .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp .generated_files/flags/dbg/7f7ced91ad0d10eba8e709980bd55c8190a0442a .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp .generated_files/flags/dbg/141202700740c3a56356fdca81122959d451cb7c .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp .generated_files/flags/dbg/8126cd8e88b19ab4bf9b0b624feda0a89b9fd21d .generated_files/flags/dbg/da39a3ee5e6b4b0d3255bfef95601890afd80709 - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MP -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} ${DISTDIR} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,${DISTDIR}/memoryfile.xml - -else -${DISTDIR}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} ${DISTDIR} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o ${DISTDIR}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,${DISTDIR}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex ${DISTDIR}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r ${OBJECTDIR} - ${RM} -r ${DISTDIR} - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(wildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-genesis.properties b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-genesis.properties deleted file mode 100644 index 5261807f4..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-genesis.properties +++ /dev/null @@ -1,23 +0,0 @@ -# -#Mon Jan 29 10:15:19 EST 2024 -rel.Pack.dfplocation= -spy.Pack.dfplocation= -proj.dir=C\:\\qp-dev\\qpcpp\\examples\\pic32\\dpp_microstick2-pic32\\qk\\xc32 -com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=e62346c0c0ecee2637e613b49cb7b7fa -dbg.com-microchip-mplab-mdbcore-pkobskde-PKOBSKDEDbgToolManager.md5=125651739343b0afc5619d1ae82f4d6d -dbg.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=e989febc09d7cc672934350596f7f1d2 -rel.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=e989febc09d7cc672934350596f7f1d2 -spy.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=e989febc09d7cc672934350596f7f1d2 -spy.languagetoolchain.version=4.35 -dbg.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\v4.35\\bin -configurations-xml=eb554a68203369898af49e63f9e1a6e7 -dbg.languagetoolchain.version=4.35 -rel.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\v4.35\\bin -host.platform=windows -spy.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\v4.35\\bin -dbg.Pack.dfplocation= -host.id=3biw-g8ey-9n -conf.ids=dbg,rel,spy -rel.com-microchip-mplab-mdbcore-pkobskde-PKOBSKDEDbgToolManager.md5=125651739343b0afc5619d1ae82f4d6d -spy.com-microchip-mplab-mdbcore-pkobskde-PKOBSKDEDbgToolManager.md5=125651739343b0afc5619d1ae82f4d6d -rel.languagetoolchain.version=4.35 diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-impl.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-impl.mk deleted file mode 100644 index 45560f95e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-impl.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a pre- and a post- target defined where you can add customization code. -# -# This makefile implements macros and targets common to all configurations. -# -# NOCDDL - - -# Building and Cleaning subprojects are done by default, but can be controlled with the SUB -# macro. If SUB=no, subprojects will not be built or cleaned. The following macro -# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf -# and .clean-reqprojects-conf unless SUB has the value 'no' -SUB_no=NO -SUBPROJECTS=${SUB_${SUB}} -BUILD_SUBPROJECTS_=.build-subprojects -BUILD_SUBPROJECTS_NO= -BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} -CLEAN_SUBPROJECTS_=.clean-subprojects -CLEAN_SUBPROJECTS_NO= -CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} - - -# Project Name -PROJECTNAME=xc32 - -# Active Configuration -DEFAULTCONF=dbg -CONF=${DEFAULTCONF} - -# All Configurations -ALLCONFS=dbg rel spy - - -# build -.build-impl: .build-pre - ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf - - -# clean -.clean-impl: .clean-pre - ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf - -# clobber -.clobber-impl: .clobber-pre .depcheck-impl - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=dbg clean - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=rel clean - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=spy clean - - - -# all -.all-impl: .all-pre .depcheck-impl - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=dbg build - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=rel build - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=spy build - - - -# dependency checking support -.depcheck-impl: -# @echo "# This code depends on make tool being used" >.dep.inc -# @if [ -n "${MAKE_VERSION}" ]; then \ -# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ -# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ -# echo "include \$${DEPFILES}" >>.dep.inc; \ -# echo "endif" >>.dep.inc; \ -# else \ -# echo ".KEEP_STATE:" >>.dep.inc; \ -# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ -# fi diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-dbg.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-dbg.mk deleted file mode 100644 index c00f784ea..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-dbg.mk +++ /dev/null @@ -1,36 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/v6.15/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/v6.15/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\v6.15\sys\java\zulu8.64.0.19-ca-fx-jre8.0.345-win_x64/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\v4.35\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\v4.35\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\v4.35\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\v4.35\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\v4.35\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/v6.15/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\v4.35\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\v4.35\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\v4.35\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\v4.35\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\v4.35\bin" diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-rel.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-rel.mk deleted file mode 100644 index b0a9d5c1d..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-rel.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\sys\java\jre1.8.0_181/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-spy.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-spy.mk deleted file mode 100644 index b0a9d5c1d..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-local-spy.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\sys\java\jre1.8.0_181/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-rel.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-rel.mk deleted file mode 100644 index 34e587ced..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-rel.mk +++ /dev/null @@ -1,367 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-rel.mk)" "nbproject/Makefile-local-rel.mk" -include nbproject/Makefile-local-rel.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=rel -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -ifdef SUB_IMAGE_ADDRESS - -else -SUB_IMAGE_ADDRESS_COMMAND= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665876/qk.o.d ${OBJECTDIR}/_ext/1627782163/qk_port.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-rel.mk dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665876/qk.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - @${FIXDEPS} "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665876/qk.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - @${FIXDEPS} "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - -else -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r build/rel - ${RM} -r dist/rel - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-spy.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-spy.mk deleted file mode 100644 index c144e5c2f..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-spy.mk +++ /dev/null @@ -1,427 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-spy.mk)" "nbproject/Makefile-local-spy.mk" -include nbproject/Makefile-local-spy.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=spy -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -ifdef SUB_IMAGE_ADDRESS - -else -SUB_IMAGE_ADDRESS_COMMAND= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../../../../src/qs/qs.cpp ../../../../../src/qs/qs_64bit.cpp ../../../../../src/qs/qs_fp.cpp ../../../../../src/qs/qs_rx.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/820665884/qs.o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ${OBJECTDIR}/_ext/820665884/qs_fp.o ${OBJECTDIR}/_ext/820665884/qs_rx.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665876/qk.o.d ${OBJECTDIR}/_ext/1627782163/qk_port.o.d ${OBJECTDIR}/_ext/820665884/qs.o.d ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d ${OBJECTDIR}/_ext/820665884/qs_fp.o.d ${OBJECTDIR}/_ext/820665884/qs_rx.o.d ${OBJECTDIR}/_ext/820665884/qstamp.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665876/qk.o ${OBJECTDIR}/_ext/1627782163/qk_port.o ${OBJECTDIR}/_ext/820665884/qs.o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ${OBJECTDIR}/_ext/820665884/qs_fp.o ${OBJECTDIR}/_ext/820665884/qs_rx.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qk/qk.cpp ../../../../../ports/pic32/qk/xc32/qk_port.cpp ../../../../../src/qs/qs.cpp ../../../../../src/qs/qs_64bit.cpp ../../../../../src/qs/qs_fp.cpp ../../../../../src/qs/qs_rx.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-spy.mk dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665876/qk.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - @${FIXDEPS} "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs.o: ../../../../../src/qs/qs.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs.o.d" -o ${OBJECTDIR}/_ext/820665884/qs.o ../../../../../src/qs/qs.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_64bit.o: ../../../../../src/qs/qs_64bit.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ../../../../../src/qs/qs_64bit.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_fp.o: ../../../../../src/qs/qs_fp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_fp.o ../../../../../src/qs/qs_fp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_rx.o: ../../../../../src/qs/qs_rx.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_rx.o ../../../../../src/qs/qs_rx.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665876/qk.o: ../../../../../src/qk/qk.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665876" - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o.d - @${RM} ${OBJECTDIR}/_ext/820665876/qk.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665876/qk.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665876/qk.o.d" -o ${OBJECTDIR}/_ext/820665876/qk.o ../../../../../src/qk/qk.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/1627782163/qk_port.o: ../../../../../ports/pic32/qk/xc32/qk_port.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/1627782163" - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o.d - @${RM} ${OBJECTDIR}/_ext/1627782163/qk_port.o - @${FIXDEPS} "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/1627782163/qk_port.o.d" -o ${OBJECTDIR}/_ext/1627782163/qk_port.o ../../../../../ports/pic32/qk/xc32/qk_port.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs.o: ../../../../../src/qs/qs.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs.o.d" -o ${OBJECTDIR}/_ext/820665884/qs.o ../../../../../src/qs/qs.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_64bit.o: ../../../../../src/qs/qs_64bit.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ../../../../../src/qs/qs_64bit.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_fp.o: ../../../../../src/qs/qs_fp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_fp.o ../../../../../src/qs/qs_fp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_rx.o: ../../../../../src/qs/qs_rx.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_rx.o ../../../../../src/qs/qs_rx.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qk/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - -else -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r build/spy - ${RM} -r dist/spy - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-variables.mk b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-variables.mk deleted file mode 100644 index 8bcb04a50..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Makefile-variables.mk +++ /dev/null @@ -1,18 +0,0 @@ -# -# Generated - do not edit! -# -# NOCDDL -# -CND_BASEDIR=`pwd` -# dbg configuration -CND_ARTIFACT_DIR_dbg=dist/dbg/production -CND_ARTIFACT_NAME_dbg=xc32.production.hex -CND_ARTIFACT_PATH_dbg=dist/dbg/production/xc32.production.hex -# rel configuration -CND_ARTIFACT_DIR_rel=dist/rel/production -CND_ARTIFACT_NAME_rel=xc32.production.hex -CND_ARTIFACT_PATH_rel=dist/rel/production/xc32.production.hex -# spy configuration -CND_ARTIFACT_DIR_spy=dist/spy/production -CND_ARTIFACT_NAME_spy=xc32.production.hex -CND_ARTIFACT_PATH_spy=dist/spy/production/xc32.production.hex diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-dbg.bash b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-dbg.bash deleted file mode 100644 index 29e2d1aa0..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-dbg.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=dbg -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-rel.bash b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-rel.bash deleted file mode 100644 index 8e0fe7095..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-rel.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=rel -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-spy.bash b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-spy.bash deleted file mode 100644 index e6524a8df..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/Package-spy.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=spy -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/configurations.xml b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/configurations.xml deleted file mode 100644 index caaa7602f..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/configurations.xml +++ /dev/null @@ -1,868 +0,0 @@ - - - - - - - - - ../../../../../src/qf/qep_hsm.cpp - ../../../../../src/qf/qep_msm.cpp - ../../../../../src/qf/qf_act.cpp - ../../../../../src/qf/qf_actq.cpp - ../../../../../src/qf/qf_defer.cpp - ../../../../../src/qf/qf_dyn.cpp - ../../../../../src/qf/qf_mem.cpp - ../../../../../src/qf/qf_ps.cpp - ../../../../../src/qf/qf_qact.cpp - ../../../../../src/qf/qf_qeq.cpp - ../../../../../src/qf/qf_qmact.cpp - ../../../../../src/qf/qf_time.cpp - ../../../../../src/qk/qk.cpp - ../../../../../ports/pic32/qk/xc32/qk_port.cpp - - - ../../../../../src/qs/qs.cpp - ../../../../../src/qs/qs_64bit.cpp - ../../../../../src/qs/qs_fp.cpp - ../../../../../src/qs/qs_rx.cpp - ../../../../../src/qs/qstamp.cpp - - - ../../main.cpp - ../../philo.cpp - ../../table.cpp - bsp.cpp - ../../bsp.hpp - ../../dpp.hpp - - - Makefile - - - - ../.. - ../../../../../src/qf - ../../../../../src/qv - ../../../../../include - ../../../../../src/qs - ../../../../../src/qk - ../../../../../ports/pic32/qk/xc32 - - Makefile - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 4.35 - 3 - - - - - - - - - - - - - - - false - false - - - - - - - false - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 4.35 - 3 - - - - - - - - - - - - - - - false - false - - - - - - - false - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 4.35 - 3 - - - - - - - - - - - - - - - false - false - - - - - - - false - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/configurations.xml b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/configurations.xml deleted file mode 100644 index 2c4a664dd..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/configurations.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - Makefile - 0 - - - :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>8107:=<rev>0002:=<man>Microchip Technology Incorporated:=<prod>Microstick II SK:=<sn>BUR123045184:=<drv>x:=<xpt>h:=end - C:\tools\Microchip\xc32\v4.35\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>8107:=<rev>0002:=<man>Microchip Technology Incorporated:=<prod>Microstick II SK:=<sn>BUR123045184:=<drv>x:=<xpt>h:=end - C:\tools\Microchip\xc32\v4.35\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>8107:=<rev>0002:=<man>Microchip Technology Incorporated:=<prod>Microstick II SK:=<sn>BUR123045184:=<drv>x:=<xpt>h:=end - C:\tools\Microchip\xc32\v4.35\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.properties b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.xml b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.xml deleted file mode 100644 index e1fa61f86..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/private/private.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - file:/C:/qp-dev/qpcpp/examples/pic32/dpp_microstick2-pic32/qk/xc32/bsp.cpp - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.properties b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.xml b/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.xml deleted file mode 100644 index 8601d7aee..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qk/xc32/nbproject/project.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - com.microchip.mplab.nbide.embedded.makeproject - - - dpp-microstick2-pic32-qk - e9bbb168-4146-4fa4-b2f4-357b75b20ee3 - 0 - - cpp - hpp - ISO-8859-1 - - - - ../.. - ../../../../../src/qf - ../../../../../src/qv - ../../../../../include - ../../../../../src/qs - ../../../../../src/qk - ../../../../../ports/pic32/qk/xc32 - - - - dbg - 2 - - - rel - 2 - - - spy - 2 - - - - false - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/Makefile b/examples/pic32/dpp_microstick2-pic32/qv/xc32/Makefile deleted file mode 100644 index f026b295c..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/Makefile +++ /dev/null @@ -1,108 +0,0 @@ -# -# There exist several targets which are by default empty and which can be -# used for execution of your targets. These targets are usually executed -# before and after some main targets. They are: -# -# .build-pre: called before 'build' target -# .build-post: called after 'build' target -# .clean-pre: called before 'clean' target -# .clean-post: called after 'clean' target -# .clobber-pre: called before 'clobber' target -# .clobber-post: called after 'clobber' target -# .all-pre: called before 'all' target -# .all-post: called after 'all' target -# .help-pre: called before 'help' target -# .help-post: called after 'help' target -# -# Targets beginning with '.' are not intended to be called on their own. -# -# Main targets can be executed directly, and they are: -# -# build build a specific configuration -# clean remove built files from a configuration -# clobber remove all built files -# all build all configurations -# help print help message -# -# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and -# .help-impl are implemented in nbproject/makefile-impl.mk. -# -# Available make variables: -# -# CND_BASEDIR base directory for relative paths -# CND_DISTDIR default top distribution directory (build artifacts) -# CND_BUILDDIR default top build directory (object files, ...) -# CONF name of current configuration -# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) -# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) -# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) -# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) -# CND_PACKAGE_NAME_${CONF} name of package (current configuration) -# CND_PACKAGE_PATH_${CONF} path to package (current configuration) -# -# NOCDDL - - -# Environment -MKDIR=mkdir -CP=cp -CCADMIN=CCadmin -RANLIB=ranlib - - -# build -build: .build-post - -.build-pre: -# Add your pre 'build' code here... - -.build-post: .build-impl -# Add your post 'build' code here... - - -# clean -clean: .clean-post - -.clean-pre: -# Add your pre 'clean' code here... - -.clean-post: .clean-impl -# Add your post 'clean' code here... - - -# clobber -clobber: .clobber-post - -.clobber-pre: -# Add your pre 'clobber' code here... - -.clobber-post: .clobber-impl -# Add your post 'clobber' code here... - - -# all -all: .all-post - -.all-pre: -# Add your pre 'all' code here... - -.all-post: .all-impl -# Add your post 'all' code here... - - -# help -help: .help-post - -.help-pre: -# Add your pre 'help' code here... - -.help-post: .help-impl -# Add your post 'help' code here... - - - -# include project implementation makefile -include nbproject/Makefile-impl.mk - -# include project make variables -include nbproject/Makefile-variables.mk diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/bsp.cpp b/examples/pic32/dpp_microstick2-pic32/qv/xc32/bsp.cpp deleted file mode 100644 index 3f248c193..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/bsp.cpp +++ /dev/null @@ -1,395 +0,0 @@ -//============================================================================ -// BSP for DPP example, Microstick II board, preemptive QV kernel, XC32 -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#pragma config FNOSC = FRCPLL // 8 MHz -#pragma config FPLLIDIV = DIV_2 // 4 MHz -#pragma config FPLLMUL = MUL_20 // 80 MHz -#pragma config FPLLODIV = DIV_2 // 40 MHz == FRC -#pragma config FWDTEN = OFF // watchdog off -#pragma config FPBDIV = DIV_1 // same peripheral clock - -// #pragma config statements should precede project file includes -#include // header for PIC32 device in use -#include - -// system clock using FRC and PLL: 40 MHz -#define SYS_FREQ 40000000U -// peripheral clock frequency -#define PER_HZ (SYS_FREQ / 1U) - -// controlling the LED of Microstick II -#define LED_ON() (LATASET = (1U << 0U)) -#define LED_OFF() (LATACLR = (1U << 0U)) -#define LED_TOGGLE() (LATAINV = (1U << 0U)) - -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - static QP::QSpyId const l_tickISR {0U}; - static QP::QSpyId const l_testISR {0U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - CONTEXT_SW, - }; - -#endif // Q_SPY - -} // unnamed namespace - -//============================================================================ -// Error handler and ISRs... -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - // perform a system unlock sequence ,starting critical sequence - SYSKEY = 0x00000000U; //write invalid key to force lock - SYSKEY = 0xAA996655U; //write key1 to SYSKEY - SYSKEY = 0x556699AAU; //write key2 to SYSKEY - // set SWRST bit to arm reset - RSWRSTSET = 1U; - // read RSWRST register to trigger reset - std::uint32_t volatile dummy = RSWRST; - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -// ISRs -------------------------------------------------------------------- - -void __ISR(_TIMER_2_VECTOR, IPL4SOFT) tickISR(void) { - IFS0CLR = _IFS0_T2IF_MASK; // clear the interrupt source - - QP::QTimeEvt::TICK_X(0U, &l_tickISR); // handle time events at tick rate 0 -} -//............................................................................ -// for testing interrupt nesting and active object preemption -void __ISR(_EXTERNAL_0_VECTOR, IPL6SOFT) testISR(void) { - IFS0CLR = _IFS0_INT0IF_MASK; // clear the interrupt source - - static QP::QEvt const eat_evt(APP::EAT_SIG); - APP::AO_Table->POST(&eat_evt, &l_testISR); -} - -//............................................................................ -#ifdef QF_ON_CONTEXT_SW -// NOTE: the context-switch callback is called with interrupts DISABLED -void QF_onContextSw(QP::QActive *prev, QP::QActive *next) { - QS_BEGIN_INCRIT(CONTEXT_SW, 0U) // in critical section! - QS_OBJ(prev); - QS_OBJ(next); - QS_END_INCRIT() -} -#endif // QF_ON_CONTEXT_SW - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - TRISA = 0x00U; // set LED pins as outputs - PORTA = 0x00U; // set LED drive state low - - randomSeed(1234U); - - // initialize the QS software tracing - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_tickISR); - QS_OBJ_DICTIONARY(&l_testISR); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(CONTEXT_SW); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QF-prio. - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); -} -//............................................................................ -void displayPhilStat(std::uint8_t const n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { // is Philo eating? - LED_ON(); - } - else { - LED_OFF(); - } - - // app-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - Q_UNUSED_PAR(paused); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a cheap pseudo-random-number generator - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8U); -} - -} // namespace BSP - - -//=========================================================================== -namespace QP { - -void QF::onStartup() { - INTCONSET = _INTCON_MVEC_MASK; // configure multi-vectored interrupts - - T2CON = 0x0060U; // stop timer, set up for 1:64 prescaler - TMR2 = 0U; // count from zero up to the period - PR2 = SYS_FREQ / (BSP::TICKS_PER_SEC * 64U); // set the Timer2 period - IFS0CLR = _IFS0_T2IF_MASK; // clear Timer2 Interrupt Flag - IEC0SET = _IEC0_T2IE_MASK; // enable Timer2 interrupt - T2CONSET = _T2CON_ON_MASK; // Start Timer2 - - INTCONbits.INT0EP = 1U; // INT0 interrupt on positive edge - IEC0SET = _IEC0_INT0IE_MASK; // enable INT0 interrupt - IFS0CLR = _IFS0_INT0IF_MASK; // clear the interrupt for INT0 - - // explicitly assign priorities to all interrupts... - // NOTE: must match the IPLxSOFT settings in the __ISR() macros - IPC2bits.T2IP = 4U; // Timer2 interrupt priority, must match tickISR - IPC0bits.INT0IP = 6U; // set INT0 priority; must match IPL in testISR -} -//............................................................................ -void QF::onCleanup() { -} -//............................................................................ -void QV::onIdle() { // CAUTION: called with interrupts DISABLED, see NOTE1 - - // NOTE: not enough LEDs on the Microstick II board to implement - // the idle loop activity indicator ... - //LED_ON (); // blink the IDLE LED, see NOTE1 - //LED_OFF(); - -#ifdef Q_SPY - while (U2STAbits.UTXBF == 0U) { // TX Buffer not full? - QF_INT_DISABLE(); - std::uint16_t b = QS::getByte(); - QF_INT_ENABLE(); - - if (b != QS_EOD) { // End-Of-Data reached? - U2TXREG = b; // stick the byte to TXREG for transmission - } - else { - break; // break out of the loop - } - } -#elif defined NDEBUG - INTCONbits.TPC = 7U; // enable the Proximity Timer for all IPLs, NOTE1 - IPTMR = 4U; // set the proximity timer to 4 CPU clocks - QF_INT_ENABLE(); // enable CPU interrupts - _wait(); // execute the WAIT instruction to stop the CPU - INTCONbits.TPC = 0U; // disable the Proximity Timer for all IPLs -#else - QF_INT_ENABLE(); // enable interrupts, see NOTE1 -#endif -} - -//============================================================================ -// QS callbacks... -#ifdef Q_SPY - -#define QS_BUF_SIZE 4096U -#define QS_BAUD_RATE 115200U - -//............................................................................ -bool QS::onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static uint8_t qsBuf[QS_BUF_SIZE]; // buffer for QS-TX - initBuf(qsBuf, sizeof(qsBuf)); // initialize the QS-TX channel - - //TBD: implement QS-RX channel - - // initialize the UART2 for transmitting the QS trace data - U2RXRbits.U2RXR = 3; // Set U2RX to RPB11, pin 22, J6-5 - RPB10Rbits.RPB10R = 2; // Set U2TX to RPB10, pin 21, J6-4 - - U2STA = 0x0000U; // use default settings of 8N1 - U2MODE = 0x0008U; // enable high baud rate - U2BRG = (uint16_t)((PER_HZ / (4.0 * QS_BAUD_RATE)) - 1.0 + 0.5); - U2MODEbits.UARTEN = 1; - U2STAbits.UTXEN = 1; - - return true; // return success -} -//............................................................................ -void QS::onCleanup() { -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { - while (U2STAbits.UTXBF) { // TX Buffer full? - } - U2TXREG = b; // stick the byte to TXREG for transmission - } - else { - break; - } - } -} -//............................................................................ -QSTimeCtr QS::onGetTime() { - return __builtin_mfc0(_CP0_COUNT, _CP0_COUNT_SELECT); -} -//............................................................................ -void QS::onReset() { - // perform a system unlock sequence ,starting critical sequence - SYSKEY = 0x00000000; //write invalid key to force lock - SYSKEY = 0xAA996655; //write key1 to SYSKEY - SYSKEY = 0x556699AA; //write key2 to SYSKEY - // set SWRST bit to arm reset - RSWRSTSET = 1; - // read RSWRST register to trigger reset - std::uint32_t volatile dummy = RSWRST; - // prevent any unwanted code execution until reset occurs -} -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// The callback function QV_onIdle() is called with interrupts disabled, -// because the idle condition can be invalidated by any enabled interrupt -// that would post events. The QV_onIdle() function *must* re-enable interrupts -// internally -// -// NOTE2: -// The Temporal Proximity Timer is used to prevent a race condition of -// servicing an interrupt after re-enabling interrupts and before executing -// the WAIT instruction. The Proximity Timer is enabled for all interrupt -// priority levels (see QF_onStartup()). The Proximity Timer is set to 4 -// CPU clocks right before re-enabling interrupts (with the DI instruction) -// The 4 clock ticks should be enough to execute the (DI,WAIT) instruction -// pair _atomically_. -// - diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-dbg.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-dbg.mk deleted file mode 100644 index 8502967a4..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-dbg.mk +++ /dev/null @@ -1,367 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-dbg.mk)" "nbproject/Makefile-local-dbg.mk" -include nbproject/Makefile-local-dbg.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=dbg -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -ifdef SUB_IMAGE_ADDRESS - -else -SUB_IMAGE_ADDRESS_COMMAND= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665887/qv.o.d ${OBJECTDIR}/_ext/820665884/qstamp.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-dbg.mk dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - -else -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_dbg=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r build/dbg - ${RM} -r dist/dbg - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-genesis.properties b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-genesis.properties deleted file mode 100644 index 43d7702b5..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-genesis.properties +++ /dev/null @@ -1,15 +0,0 @@ -# -#Thu Sep 14 16:53:41 EDT 2023 -rel.languagetoolchain.version=2.20 -spy.languagetoolchain.version=2.20 -conf.ids=dbg,rel,spy -spy.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\bin -configurations-xml=743fcaaf22f2faf66df942c143c41ea3 -dbg.languagetoolchain.version=2.20 -com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=37eccb08230908d044ad3fe14e24ea9a -dbg.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=af6fe09cc582a0daace7b80bb4f7bbe2 -spy.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=af6fe09cc582a0daace7b80bb4f7bbe2 -rel.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\bin -dbg.languagetoolchain.dir=C\:\\tools\\Microchip\\xc32\\bin -rel.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=af6fe09cc582a0daace7b80bb4f7bbe2 -host.platform=windows diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-impl.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-impl.mk deleted file mode 100644 index 45560f95e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-impl.mk +++ /dev/null @@ -1,73 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a pre- and a post- target defined where you can add customization code. -# -# This makefile implements macros and targets common to all configurations. -# -# NOCDDL - - -# Building and Cleaning subprojects are done by default, but can be controlled with the SUB -# macro. If SUB=no, subprojects will not be built or cleaned. The following macro -# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf -# and .clean-reqprojects-conf unless SUB has the value 'no' -SUB_no=NO -SUBPROJECTS=${SUB_${SUB}} -BUILD_SUBPROJECTS_=.build-subprojects -BUILD_SUBPROJECTS_NO= -BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} -CLEAN_SUBPROJECTS_=.clean-subprojects -CLEAN_SUBPROJECTS_NO= -CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} - - -# Project Name -PROJECTNAME=xc32 - -# Active Configuration -DEFAULTCONF=dbg -CONF=${DEFAULTCONF} - -# All Configurations -ALLCONFS=dbg rel spy - - -# build -.build-impl: .build-pre - ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf - - -# clean -.clean-impl: .clean-pre - ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf - -# clobber -.clobber-impl: .clobber-pre .depcheck-impl - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=dbg clean - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=rel clean - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=spy clean - - - -# all -.all-impl: .all-pre .depcheck-impl - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=dbg build - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=rel build - ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=spy build - - - -# dependency checking support -.depcheck-impl: -# @echo "# This code depends on make tool being used" >.dep.inc -# @if [ -n "${MAKE_VERSION}" ]; then \ -# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ -# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ -# echo "include \$${DEPFILES}" >>.dep.inc; \ -# echo "endif" >>.dep.inc; \ -# else \ -# echo ".KEEP_STATE:" >>.dep.inc; \ -# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ -# fi diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-dbg.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-dbg.mk deleted file mode 100644 index b0a9d5c1d..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-dbg.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\sys\java\jre1.8.0_181/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-rel.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-rel.mk deleted file mode 100644 index b0a9d5c1d..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-rel.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\sys\java\jre1.8.0_181/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-spy.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-spy.mk deleted file mode 100644 index b0a9d5c1d..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-local-spy.mk +++ /dev/null @@ -1,37 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# -# This file contains information about the location of compilers and other tools. -# If you commit this file into your revision control server, you will be able to -# to checkout the project and build it from the command line with make. However, -# if more than one person works on the same project, then this file might show -# conflicts since different users are bound to have compilers in different places. -# In that case you might choose to not commit this file and let MPLAB X recreate this file -# for each user. The disadvantage of not committing this file is that you must run MPLAB X at -# least once so the file gets created and the project can be built. Finally, you can also -# avoid using this file at all if you are only building from the command line with make. -# You can invoke make with the values of the macros: -# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... -# -SHELL=cmd.exe -PATH_TO_IDE_BIN=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/ -# Adding MPLAB X bin directory to path. -PATH:=C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) -# Path to java used to run MPLAB X when this makefile was created -MP_JAVA_PATH="C:\tools\Microchip\MPLABX\sys\java\jre1.8.0_181/bin/" -OS_CURRENT="$(shell uname -s)" -MP_CC="C:\tools\Microchip\xc32\bin\xc32-gcc.exe" -MP_CPPC="C:\tools\Microchip\xc32\bin\xc32-g++.exe" -# MP_BC is not defined -MP_AS="C:\tools\Microchip\xc32\bin\xc32-as.exe" -MP_LD="C:\tools\Microchip\xc32\bin\xc32-ld.exe" -MP_AR="C:\tools\Microchip\xc32\bin\xc32-ar.exe" -DEP_GEN=${MP_JAVA_PATH}java -jar "C:/tools/Microchip/MPLABX/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" -MP_CC_DIR="C:\tools\Microchip\xc32\bin" -MP_CPPC_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined -MP_AS_DIR="C:\tools\Microchip\xc32\bin" -MP_LD_DIR="C:\tools\Microchip\xc32\bin" -MP_AR_DIR="C:\tools\Microchip\xc32\bin" -# MP_BC_DIR is not defined diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-rel.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-rel.mk deleted file mode 100644 index 03f3d53e5..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-rel.mk +++ /dev/null @@ -1,367 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-rel.mk)" "nbproject/Makefile-local-rel.mk" -include nbproject/Makefile-local-rel.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=rel -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -ifdef SUB_IMAGE_ADDRESS - -else -SUB_IMAGE_ADDRESS_COMMAND= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665887/qv.o.d ${OBJECTDIR}/_ext/820665884/qstamp.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-rel.mk dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DNDEBUG -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - -else -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_rel=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r build/rel - ${RM} -r dist/rel - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-spy.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-spy.mk deleted file mode 100644 index eaf92bac8..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-spy.mk +++ /dev/null @@ -1,415 +0,0 @@ -# -# Generated Makefile - do not edit! -# -# Edit the Makefile in the project folder instead (../Makefile). Each target -# has a -pre and a -post target defined where you can add customized code. -# -# This makefile implements configuration specific macros and targets. - - -# Include project Makefile -ifeq "${IGNORE_LOCAL}" "TRUE" -# do not include local makefile. User is passing all local related variables already -else -include Makefile -# Include makefile containing local settings -ifeq "$(wildcard nbproject/Makefile-local-spy.mk)" "nbproject/Makefile-local-spy.mk" -include nbproject/Makefile-local-spy.mk -endif -endif - -# Environment -MKDIR=gnumkdir -p -RM=rm -f -MV=mv -CP=cp - -# Macros -CND_CONF=spy -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -IMAGE_TYPE=debug -OUTPUT_SUFFIX=elf -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -else -IMAGE_TYPE=production -OUTPUT_SUFFIX=hex -DEBUGGABLE_SUFFIX=elf -FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -endif - -ifeq ($(COMPARE_BUILD), true) -COMPARISON_BUILD=-mafrlcsj -else -COMPARISON_BUILD= -endif - -ifdef SUB_IMAGE_ADDRESS - -else -SUB_IMAGE_ADDRESS_COMMAND= -endif - -# Object Directory -OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} - -# Distribution Directory -DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} - -# Source Files Quoted if spaced -SOURCEFILES_QUOTED_IF_SPACED=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qs.cpp ../../../../../src/qs/qs_64bit.cpp ../../../../../src/qs/qs_fp.cpp ../../../../../src/qs/qs_rx.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - -# Object Files Quoted if spaced -OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qs.o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ${OBJECTDIR}/_ext/820665884/qs_fp.o ${OBJECTDIR}/_ext/820665884/qs_rx.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o -POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o.d ${OBJECTDIR}/_ext/820665871/qep_msm.o.d ${OBJECTDIR}/_ext/820665871/qf_act.o.d ${OBJECTDIR}/_ext/820665871/qf_actq.o.d ${OBJECTDIR}/_ext/820665871/qf_defer.o.d ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d ${OBJECTDIR}/_ext/820665871/qf_mem.o.d ${OBJECTDIR}/_ext/820665871/qf_ps.o.d ${OBJECTDIR}/_ext/820665871/qf_qact.o.d ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d ${OBJECTDIR}/_ext/820665871/qf_time.o.d ${OBJECTDIR}/_ext/820665887/qv.o.d ${OBJECTDIR}/_ext/820665884/qs.o.d ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d ${OBJECTDIR}/_ext/820665884/qs_fp.o.d ${OBJECTDIR}/_ext/820665884/qs_rx.o.d ${OBJECTDIR}/_ext/820665884/qstamp.o.d ${OBJECTDIR}/_ext/43898991/main.o.d ${OBJECTDIR}/_ext/43898991/philo.o.d ${OBJECTDIR}/_ext/43898991/table.o.d ${OBJECTDIR}/bsp.o.d - -# Object Files -OBJECTFILES=${OBJECTDIR}/_ext/820665871/qep_hsm.o ${OBJECTDIR}/_ext/820665871/qep_msm.o ${OBJECTDIR}/_ext/820665871/qf_act.o ${OBJECTDIR}/_ext/820665871/qf_actq.o ${OBJECTDIR}/_ext/820665871/qf_defer.o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ${OBJECTDIR}/_ext/820665871/qf_mem.o ${OBJECTDIR}/_ext/820665871/qf_ps.o ${OBJECTDIR}/_ext/820665871/qf_qact.o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ${OBJECTDIR}/_ext/820665871/qf_time.o ${OBJECTDIR}/_ext/820665887/qv.o ${OBJECTDIR}/_ext/820665884/qs.o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ${OBJECTDIR}/_ext/820665884/qs_fp.o ${OBJECTDIR}/_ext/820665884/qs_rx.o ${OBJECTDIR}/_ext/820665884/qstamp.o ${OBJECTDIR}/_ext/43898991/main.o ${OBJECTDIR}/_ext/43898991/philo.o ${OBJECTDIR}/_ext/43898991/table.o ${OBJECTDIR}/bsp.o - -# Source Files -SOURCEFILES=../../../../../src/qf/qep_hsm.cpp ../../../../../src/qf/qep_msm.cpp ../../../../../src/qf/qf_act.cpp ../../../../../src/qf/qf_actq.cpp ../../../../../src/qf/qf_defer.cpp ../../../../../src/qf/qf_dyn.cpp ../../../../../src/qf/qf_mem.cpp ../../../../../src/qf/qf_ps.cpp ../../../../../src/qf/qf_qact.cpp ../../../../../src/qf/qf_qeq.cpp ../../../../../src/qf/qf_qmact.cpp ../../../../../src/qf/qf_time.cpp ../../../../../src/qv/qv.cpp ../../../../../src/qs/qs.cpp ../../../../../src/qs/qs_64bit.cpp ../../../../../src/qs/qs_fp.cpp ../../../../../src/qs/qs_rx.cpp ../../../../../src/qs/qstamp.cpp ../../main.cpp ../../philo.cpp ../../table.cpp bsp.cpp - - -CFLAGS= -ASFLAGS= -LDLIBSOPTIONS= - -############# Tool locations ########################################## -# If you copy a project from one host to another, the path where the # -# compiler is installed may be different. # -# If you open this project with MPLAB X in the new host, this # -# makefile will be regenerated and the paths will be corrected. # -####################################################################### -# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build -FIXDEPS=fixDeps - -.build-conf: ${BUILD_SUBPROJECTS} -ifneq ($(INFORMATION_MESSAGE), ) - @echo $(INFORMATION_MESSAGE) -endif - ${MAKE} -f nbproject/Makefile-spy.mk dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} - -MP_PROCESSOR_OPTION=32MX250F128B -MP_LINKER_FILE_OPTION= -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assemble -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: assembleWithPreprocess -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compile -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -else -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: compileCPP -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs.o: ../../../../../src/qs/qs.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs.o.d" -o ${OBJECTDIR}/_ext/820665884/qs.o ../../../../../src/qs/qs.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_64bit.o: ../../../../../src/qs/qs_64bit.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ../../../../../src/qs/qs_64bit.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_fp.o: ../../../../../src/qs/qs_fp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_fp.o ../../../../../src/qs/qs_fp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_rx.o: ../../../../../src/qs/qs_rx.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_rx.o ../../../../../src/qs/qs_rx.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -else -${OBJECTDIR}/_ext/820665871/qep_hsm.o: ../../../../../src/qf/qep_hsm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_hsm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_hsm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_hsm.o ../../../../../src/qf/qep_hsm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qep_msm.o: ../../../../../src/qf/qep_msm.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qep_msm.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qep_msm.o.d" -o ${OBJECTDIR}/_ext/820665871/qep_msm.o ../../../../../src/qf/qep_msm.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_act.o: ../../../../../src/qf/qf_act.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_act.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_act.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_act.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_act.o ../../../../../src/qf/qf_act.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_actq.o: ../../../../../src/qf/qf_actq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_actq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_actq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_actq.o ../../../../../src/qf/qf_actq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_defer.o: ../../../../../src/qf/qf_defer.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_defer.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_defer.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_defer.o ../../../../../src/qf/qf_defer.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_dyn.o: ../../../../../src/qf/qf_dyn.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_dyn.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_dyn.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_dyn.o ../../../../../src/qf/qf_dyn.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_mem.o: ../../../../../src/qf/qf_mem.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_mem.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_mem.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_mem.o ../../../../../src/qf/qf_mem.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_ps.o: ../../../../../src/qf/qf_ps.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_ps.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_ps.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_ps.o ../../../../../src/qf/qf_ps.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qact.o: ../../../../../src/qf/qf_qact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qact.o ../../../../../src/qf/qf_qact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qeq.o: ../../../../../src/qf/qf_qeq.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qeq.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qeq.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qeq.o ../../../../../src/qf/qf_qeq.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_qmact.o: ../../../../../src/qf/qf_qmact.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_qmact.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_qmact.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_qmact.o ../../../../../src/qf/qf_qmact.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665871/qf_time.o: ../../../../../src/qf/qf_time.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665871" - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o.d - @${RM} ${OBJECTDIR}/_ext/820665871/qf_time.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665871/qf_time.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665871/qf_time.o.d" -o ${OBJECTDIR}/_ext/820665871/qf_time.o ../../../../../src/qf/qf_time.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665887/qv.o: ../../../../../src/qv/qv.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665887" - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o.d - @${RM} ${OBJECTDIR}/_ext/820665887/qv.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665887/qv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665887/qv.o.d" -o ${OBJECTDIR}/_ext/820665887/qv.o ../../../../../src/qv/qv.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs.o: ../../../../../src/qs/qs.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs.o.d" -o ${OBJECTDIR}/_ext/820665884/qs.o ../../../../../src/qs/qs.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_64bit.o: ../../../../../src/qs/qs_64bit.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_64bit.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_64bit.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_64bit.o ../../../../../src/qs/qs_64bit.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_fp.o: ../../../../../src/qs/qs_fp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_fp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_fp.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_fp.o ../../../../../src/qs/qs_fp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qs_rx.o: ../../../../../src/qs/qs_rx.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qs_rx.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qs_rx.o.d" -o ${OBJECTDIR}/_ext/820665884/qs_rx.o ../../../../../src/qs/qs_rx.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/820665884/qstamp.o: ../../../../../src/qs/qstamp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/820665884" - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o.d - @${RM} ${OBJECTDIR}/_ext/820665884/qstamp.o - @${FIXDEPS} "${OBJECTDIR}/_ext/820665884/qstamp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/820665884/qstamp.o.d" -o ${OBJECTDIR}/_ext/820665884/qstamp.o ../../../../../src/qs/qstamp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/main.o: ../../main.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/main.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/main.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/main.o.d" -o ${OBJECTDIR}/_ext/43898991/main.o ../../main.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/philo.o: ../../philo.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/philo.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/philo.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/philo.o.d" -o ${OBJECTDIR}/_ext/43898991/philo.o ../../philo.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/_ext/43898991/table.o: ../../table.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}/_ext/43898991" - @${RM} ${OBJECTDIR}/_ext/43898991/table.o.d - @${RM} ${OBJECTDIR}/_ext/43898991/table.o - @${FIXDEPS} "${OBJECTDIR}/_ext/43898991/table.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/_ext/43898991/table.o.d" -o ${OBJECTDIR}/_ext/43898991/table.o ../../table.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -${OBJECTDIR}/bsp.o: bsp.cpp nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} "${OBJECTDIR}" - @${RM} ${OBJECTDIR}/bsp.o.d - @${RM} ${OBJECTDIR}/bsp.o - @${FIXDEPS} "${OBJECTDIR}/bsp.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CPPC} $(MP_EXTRA_CC_PRE) -g -x c++ -c -mprocessor=$(MP_PROCESSOR_OPTION) -fno-rtti -fno-exceptions -fno-check-new -fno-enforce-eh-specs -DQ_SPY -I"../.." -I"../../../../../include" -I"../../../../../src" -I"../../../../../ports/pic32/qv/xc32" -MMD -MF "${OBJECTDIR}/bsp.o.d" -o ${OBJECTDIR}/bsp.o bsp.cpp -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) - -endif - -# ------------------------------------------------------------------------------------ -# Rules for buildStep: link -ifeq ($(TYPE_IMAGE), DEBUG_RUN) -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC00490:0x1FC00BEF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,-D=__DEBUG_D,--defsym=__MPLAB_DEBUGGER_PK3=1,--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - -else -dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk - @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} - ${MP_CPPC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_spy=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=0,--no-code-in-dinit,--no-dinit-in-serial-mem,--report-mem,--warn-section-align,--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml - ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} -endif - - -# Subprojects -.build-subprojects: - - -# Subprojects -.clean-subprojects: - -# Clean Targets -.clean-conf: ${CLEAN_SUBPROJECTS} - ${RM} -r build/spy - ${RM} -r dist/spy - -# Enable dependency checking -.dep.inc: .depcheck-impl - -DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) -ifneq (${DEPFILES},) -include ${DEPFILES} -endif diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-variables.mk b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-variables.mk deleted file mode 100644 index 5a1eb7fce..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Makefile-variables.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Generated - do not edit! -# -# NOCDDL -# -CND_BASEDIR=`pwd` -# dbg configuration -CND_ARTIFACT_DIR_dbg=dist/dbg/production -CND_ARTIFACT_NAME_dbg=xc32.production.hex -CND_ARTIFACT_PATH_dbg=dist/dbg/production/xc32.production.hex -CND_PACKAGE_DIR_dbg=${CND_DISTDIR}/dbg/package -CND_PACKAGE_NAME_dbg=xc32.tar -CND_PACKAGE_PATH_dbg=${CND_DISTDIR}/dbg/package/xc32.tar -# rel configuration -CND_ARTIFACT_DIR_rel=dist/rel/production -CND_ARTIFACT_NAME_rel=xc32.production.hex -CND_ARTIFACT_PATH_rel=dist/rel/production/xc32.production.hex -CND_PACKAGE_DIR_rel=${CND_DISTDIR}/rel/package -CND_PACKAGE_NAME_rel=xc32.tar -CND_PACKAGE_PATH_rel=${CND_DISTDIR}/rel/package/xc32.tar -# spy configuration -CND_ARTIFACT_DIR_spy=dist/spy/production -CND_ARTIFACT_NAME_spy=xc32.production.hex -CND_ARTIFACT_PATH_spy=dist/spy/production/xc32.production.hex -CND_PACKAGE_DIR_spy=${CND_DISTDIR}/spy/package -CND_PACKAGE_NAME_spy=xc32.tar -CND_PACKAGE_PATH_spy=${CND_DISTDIR}/spy/package/xc32.tar diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-dbg.bash b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-dbg.bash deleted file mode 100644 index 29e2d1aa0..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-dbg.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=dbg -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-rel.bash b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-rel.bash deleted file mode 100644 index 8e0fe7095..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-rel.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=rel -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-spy.bash b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-spy.bash deleted file mode 100644 index e6524a8df..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/Package-spy.bash +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -x - -# -# Generated - do not edit! -# - -# Macros -TOP=`pwd` -CND_CONF=spy -CND_DISTDIR=dist -TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging -TMPDIRNAME=tmp-packaging -OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -OUTPUT_BASENAME=xc32.${IMAGE_TYPE}.${OUTPUT_SUFFIX} -PACKAGE_TOP_DIR=xc32/ - -# Functions -function checkReturnCode -{ - rc=$? - if [ $rc != 0 ] - then - exit $rc - fi -} -function makeDirectory -# $1 directory path -# $2 permission (optional) -{ - mkdir -p "$1" - checkReturnCode - if [ "$2" != "" ] - then - chmod $2 "$1" - checkReturnCode - fi -} -function copyFileToTmpDir -# $1 from-file path -# $2 to-file path -# $3 permission -{ - cp "$1" "$2" - checkReturnCode - if [ "$3" != "" ] - then - chmod $3 "$2" - checkReturnCode - fi -} - -# Setup -cd "${TOP}" -mkdir -p ${CND_DISTDIR}/${CND_CONF}/package -rm -rf ${TMPDIR} -mkdir -p ${TMPDIR} - -# Copy files and create directories and links -cd "${TOP}" -makeDirectory ${TMPDIR}/xc32/bin -copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 - - -# Generate tar file -cd "${TOP}" -rm -f ${CND_DISTDIR}/${CND_CONF}/package/xc32.tar -cd ${TMPDIR} -tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/xc32.tar * -checkReturnCode - -# Cleanup -cd "${TOP}" -rm -rf ${TMPDIR} diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/configurations.xml b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/configurations.xml deleted file mode 100644 index 93782e715..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/configurations.xml +++ /dev/null @@ -1,759 +0,0 @@ - - - - - - - - - ../../../../../src/qf/qep_hsm.cpp - ../../../../../src/qf/qep_msm.cpp - ../../../../../src/qf/qf_act.cpp - ../../../../../src/qf/qf_actq.cpp - ../../../../../src/qf/qf_defer.cpp - ../../../../../src/qf/qf_dyn.cpp - ../../../../../src/qf/qf_mem.cpp - ../../../../../src/qf/qf_ps.cpp - ../../../../../src/qf/qf_qact.cpp - ../../../../../src/qf/qf_qeq.cpp - ../../../../../src/qf/qf_qmact.cpp - ../../../../../src/qf/qf_time.cpp - ../../../../../src/qv/qv.cpp - - - ../../../../../src/qs/qs.cpp - ../../../../../src/qs/qs_64bit.cpp - ../../../../../src/qs/qs_fp.cpp - ../../../../../src/qs/qs_rx.cpp - ../../../../../src/qs/qstamp.cpp - - - ../../main.cpp - ../../philo.cpp - ../../table.cpp - bsp.cpp - ../../bsp.hpp - ../../dpp.hpp - - - Makefile - - - - ../.. - ../../../../../src/qf - ../../../../../src/qv - ../../../../../include - ../../../../../src/qs - ../../../../../src/qk - ../../../../../ports/pic32/qk/xc32 - - Makefile - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 2.20 - 3 - - - - - - - - - - - - - false - false - - - - - - - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 2.20 - 3 - - - - - - - - - - - - - false - false - - - - - - - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - PIC32MX250F128B - - - PKOBSKDEPlatformTool - XC32 - 2.20 - 3 - - - - - - - - - - - - - false - false - - - - - - - false - - false - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/configurations.xml b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/configurations.xml deleted file mode 100644 index 01328964e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/configurations.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - Makefile - 0 - - - - C:\tools\Microchip\xc32\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - - C:\tools\Microchip\xc32\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - - C:\tools\Microchip\xc32\bin - - place holder 1 - place holder 2 - - - - - true - 0 - 0 - 0 - - - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.properties b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.xml b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.xml deleted file mode 100644 index cd3e03d7e..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/private/private.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.properties b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.properties deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.xml b/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.xml deleted file mode 100644 index 3c57e43fc..000000000 --- a/examples/pic32/dpp_microstick2-pic32/qv/xc32/nbproject/project.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - com.microchip.mplab.nbide.embedded.makeproject - - - dpp-microstick2-pic32-qv - e9bbb168-4146-4fa4-b2f4-357b75b20ee3 - 0 - - cpp - hpp - ISO-8859-1 - - - - ../.. - ../../../../../src/qf - ../../../../../src/qv - ../../../../../include - ../../../../../src/qs - ../../../../../src/qk - ../../../../../ports/pic32/qk/xc32 - - - - dbg - 2 - - - rel - 2 - - - spy - 2 - - - - false - - - - diff --git a/examples/pic32/dpp_microstick2-pic32/table.cpp b/examples/pic32/dpp_microstick2-pic32/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/pic32/dpp_microstick2-pic32/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/README.md b/examples/posix-win32/README.md deleted file mode 100644 index 5cccbde78..000000000 --- a/examples/posix-win32/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# ABOUT THE "posix-win32" EXAMPLES -The examples in the "posix-win32" directory are for the General Purpose -Operating Systems (GPOSes), such as: - -- POSIX (e.g., Linux, macOS, and RTOSes with the -POSIX subsystems, like INTEGRITY, vxWorks, etc.) -- Windows (Win32 API) - -The examples run in the standard terminal (as console applications) -and can be built with the standard C compilers available on the -respective operating systems, such as GCC, LLVM, Visual C++. The provided Makefiles support the GNU GCC toolchain. - -> **NOTE** -For Windows, the GNU GCC toolchain (MinGW) and the 'make' utility are -provided in the QTools collection, which is available from: - -- https://github.com/QuantumLeaps/qtools - -> **NOTE** -The "QP-bundle" for Windows also contains the GCC toolchain for Windows -(MinGW), the 'make' utility, and other POSIX-style extensions. - -- https://www.state-machine.com/#Downloads - - -# Single-Threaded and Multi-Threaded QP/C++ Ports -Each of the examples can be built with the single-threaded QP/C++ ports -(posix-qv or win32-qv) or multi-threaded ports (posix or win32). The choice -is made in the Makefiles, by editing the line, which defines the -`QP_PORT_DIR` symbol in the Makefile. For example, the following lines -in the Makefile select the single-threaded posix-qv port and leave the -multi-threaded posix port commented-out: - -``` -QP_PORT_DIR := $(QPC)/ports/posix-qv -#QP_PORT_DIR := $(QPC)/ports/posix -``` - -To reverse the selection, you need to move the comment '#' character. - -> **NOTE** -The single-threaded QP/C++ ports (posix-qv and win32-qv) are recommended for -emulating deeply-embedded software on the desktop. - -The multi-threaded QP/C++ ports (posix and win32) are intended for the -actual applications that run on (embedded)Linux or (embedded)Windows. - - -# Debug, Release, and Spy Build Configurations -The Makefiles and Visual Studio projects for the examples generally -support the following three build configurations: - -### Debug Configuration -This is the default build configuration, with full debugging information and -minimal optimization. To build this configuration, type: - -``` -make -``` - -To clean this build, type - -``` -make clean -``` - -The object files and the executable is located in the 'build' sub-directory. - - -### Release Configuration -This configuration is built with no debugging information and high -optimization. Single-stepping and debugging might be difficult due -to the lack of debugging information and optimized code. To build -this configuration, type: - -``` -make CONF=rel -``` - -To clean this build, type - -``` -make CONF=rel clean -``` - -The object files and the executable is located in the 'build_rel' directory. - -### Spy Configuration -This configuration is built with the QP's Q-SPY trace functionality. -The QP/Spy output is performed by a TCP/IP socket and requires launching -the QSPY host application with the -t option. To build this configuration, -type: - -``` -make CONF=spy -``` - -To clean this build, type - -``` -make CONF=spy clean -``` - -The object files and the executable are located in the 'build_spy' directory. - -> **NOTE** -Only specific examples support the Spy build configuration. The examples -that don't support it, will report an error or will fail the linking stage. - - -# Support and Contact Information -- Free discussion forum: https://sourceforge.net/p/qpc/discussion/668726/ -- Quantum Leaps website: https://www.state-machine.com -- Quantum Leaps email: info@state-machine.com diff --git a/examples/posix-win32/blinky/Makefile b/examples/posix-win32/blinky/Makefile deleted file mode 100644 index 185daadb2..000000000 --- a/examples/posix-win32/blinky/Makefile +++ /dev/null @@ -1,295 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.0 -# Last updated on 2023-07-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC, . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := blinky - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - blinky.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -# C++ QS source files -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_64bit.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/blinky/README.md b/examples/posix-win32/blinky/README.md deleted file mode 100644 index 3c0d7e0d5..000000000 --- a/examples/posix-win32/blinky/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Example: Blinky Console - -![Blinky on Win32](blinky_win.png) - -This example corresponds to the QM Tutorial at: - -https://www.state-machine.com/qm/gs_tut.html - - -Specifically the files are as follows: - -``` -blinky.qm - the QM model for the Blinky active object -blinky.cpp - the generated code for the Blinky application -Makefile - the makefile to build Blinky on Windows/Linux/macOS -``` diff --git a/examples/posix-win32/blinky/blinky.cpp b/examples/posix-win32/blinky/blinky.cpp deleted file mode 100644 index 1c0721eb2..000000000 --- a/examples/posix-win32/blinky/blinky.cpp +++ /dev/null @@ -1,222 +0,0 @@ -//$file${.::blinky.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: blinky.qm -// File: ${.::blinky.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::blinky.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include -#include // for exit() - -using namespace std; -using namespace QP; - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -enum { BSP_TICKS_PER_SEC = 100 }; - -void BSP_ledOff(void) { - cout << "LED OFF" << endl; -} -void BSP_ledOn(void) { - cout << "LED ON" << endl; -} -extern "C" void Q_onError(char const * const module, int loc) { - cout << "Assertion failed in " << module << ':' << loc << endl; - exit(-1); -} -void QF::onStartup(void) {} -void QF::onCleanup(void) {} -void QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, nullptr); // QTimeEvt clock tick processing -} - -enum BlinkySignals { - TIMEOUT_SIG = Q_USER_SIG, - MAX_SIG -}; - -//=============== ask QM to declare the Blinky class ================== -//$declare${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky} ............................................................. -class Blinky : public QP::QMActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - static Blinky inst; - -public: - Blinky(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( off); - QM_ACTION_DECL(off_e); - QM_STATE_DECL( on); - QM_ACTION_DECL(on_e); -}; // class Blinky -//$enddecl${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -QActive * const AO_Blinky = &Blinky::inst; - -int main() { - QF::init(); // initialize the framework - - static QEvt const *blinky_queueSto[10]; - AO_Blinky->start(1U, // priority - blinky_queueSto, Q_DIM(blinky_queueSto), - nullptr, 0U); // no stack - return QF::run(); // run the QF application -} - -//================ ask QM to define the Blinky class ================== -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky} ............................................................. -Blinky Blinky::inst; - -//${AOs::Blinky::Blinky} ..................................................... -Blinky::Blinky() -: QMActive(Q_STATE_CAST(&Blinky::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Blinky::SM} ......................................................... -QM_STATE_DEF(Blinky, initial) { - //${AOs::Blinky::SM::initial} - m_timeEvt.armX(BSP_TICKS_PER_SEC/2, BSP_TICKS_PER_SEC/2); - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Blinky::off); - QS_FUN_DICTIONARY(&Blinky::on); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &off_s, // target state - { - &off_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${AOs::Blinky::SM::off} .................................................... -QP::QMState const Blinky::off_s = { - QM_STATE_NULL, // superstate (top) - &Blinky::off, - &Blinky::off_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Blinky::SM::off} -QM_ACTION_DEF(Blinky, off_e) { - BSP_ledOff(); - return qm_entry(&off_s); -} -//${AOs::Blinky::SM::off} -QM_STATE_DEF(Blinky, off) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky::SM::off::TIMEOUT} - case TIMEOUT_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &on_s, // target state - { - &on_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${AOs::Blinky::SM::on} ..................................................... -QP::QMState const Blinky::on_s = { - QM_STATE_NULL, // superstate (top) - &Blinky::on, - &Blinky::on_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${AOs::Blinky::SM::on} -QM_ACTION_DEF(Blinky, on_e) { - BSP_ledOn(); - return qm_entry(&on_s); -} -//${AOs::Blinky::SM::on} -QM_STATE_DEF(Blinky, on) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky::SM::on::TIMEOUT} - case TIMEOUT_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &off_s, // target state - { - &off_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} -//$enddef${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/blinky/blinky.qm b/examples/posix-win32/blinky/blinky.qm deleted file mode 100644 index 403a34490..000000000 --- a/examples/posix-win32/blinky/blinky.qm +++ /dev/null @@ -1,116 +0,0 @@ - - - Blinky example - - - - - - - - - - - - - : QMActive(Q_STATE_CAST(&Blinky::initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U) - - - - - - m_timeEvt.armX(BSP_TICKS_PER_SEC/2, BSP_TICKS_PER_SEC/2); -(void)e; // unused parameter - - - - - - - BSP_ledOff(); - - - - - - - - - - - - - BSP_ledOn(); - - - - - - - - - - - - - - - - - - - #include "qpcpp.hpp" -#include <iostream> -#include <cstdlib> // for exit() - -using namespace std; -using namespace QP; - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -enum { BSP_TICKS_PER_SEC = 100 }; - -void BSP_ledOff(void) { - cout << "LED OFF" << endl; -} -void BSP_ledOn(void) { - cout << "LED ON" << endl; -} -extern "C" void Q_onError(char const * const module, int loc) { - cout << "Assertion failed in " << module << ':' << loc << endl; - exit(-1); -} -void QF::onStartup(void) {} -void QF::onCleanup(void) {} -void QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, nullptr); // QTimeEvt clock tick processing -} - -enum BlinkySignals { - TIMEOUT_SIG = Q_USER_SIG, - MAX_SIG -}; - -//=============== ask QM to declare the Blinky class ================== -$declare${AOs::Blinky} - -QActive * const AO_Blinky = &Blinky::inst; - -int main() { - QF::init(); // initialize the framework - - static QEvt const *blinky_queueSto[10]; - AO_Blinky->start(1U, // priority - blinky_queueSto, Q_DIM(blinky_queueSto), - nullptr, 0U); // no stack - return QF::run(); // run the QF application -} - -//================ ask QM to define the Blinky class ================== -$define${AOs::Blinky} - - - diff --git a/examples/posix-win32/blinky/blinky_win.png b/examples/posix-win32/blinky/blinky_win.png deleted file mode 100644 index dfcaf97e6587db042b4da787ea02aea4292404f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9718 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 sTT_ps%+ZT7|GwVvX%T4n{WFDDsF. -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := calc - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - calc.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/calc/bsp.cpp b/examples/posix-win32/calc/bsp.cpp deleted file mode 100644 index ad7588888..000000000 --- a/examples/posix-win32/calc/bsp.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.9.0 -// Date of the Last Update: 2020-08-25 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace QP; -using namespace std; - -#define DISP_WIDTH 15 - -/* helper macros to "stringify" values */ -#define VAL(x) #x -#define STRINGIFY(x) VAL(x) - -static char l_display[DISP_WIDTH + 1]; // the calculator display -static int l_len; // number of displayed characters - -//............................................................................ -void BSP_clear(void) { - memset(l_display, ' ', DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = '0'; - l_display[DISP_WIDTH] = '\0'; - l_len = 0; -} -//............................................................................ -void BSP_insert(int keyId) { - if (l_len == 0) { - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } - else if (l_len < (DISP_WIDTH - 1)) { - MEMMOVE_S(&l_display[0], DISP_WIDTH, &l_display[1], DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } -} -//............................................................................ -void BSP_display(double value) { - SNPRINTF_S(l_display, DISP_WIDTH, "%10.7g", value); -} -//............................................................................ -void BSP_display_error(char const *err) { - STRNCPY_S(l_display, DISP_WIDTH, err); -} -//............................................................................ -void BSP_negate(void) { - BSP_clear(); - l_display[DISP_WIDTH - 2] = '-'; -} -//............................................................................ -void BSP_show_display(void) { - PRINTF_S("\n[%" STRINGIFY(DISP_WIDTH) "s] ", l_display); -} -//............................................................................ -void BSP_exit(void) { - PRINTF_S("\n%s\n", "Bye! Bye!"); - fflush(stdout); - QF::onCleanup(); - exit(0); -} -//............................................................................ -double BSP_get_value(void) { - return strtod(l_display, (char **)0); -} -//............................................................................ -void BSP_message(char const *msg) { - PRINTF_S("%s", msg); -} - -namespace QP { -/*..........................................................................*/ -void QF::onStartup(void) { - QF::consoleSetup(); -} -/*..........................................................................*/ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -/*..........................................................................*/ -void QF::onClockTick(void) { -} - -} // namespace QP - -//............................................................................ -// this function is used by the QP embedded systems-friendly assertions -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - FPRINTF_S(stderr, "Assertion failed in %s:%d", module, loc); - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/calc/bsp.hpp b/examples/posix-win32/calc/bsp.hpp deleted file mode 100644 index 2ad3fc36f..000000000 --- a/examples/posix-win32/calc/bsp.hpp +++ /dev/null @@ -1,48 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.5.0 -// Date of the Last Update: 2019-03-21 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -void BSP_clear(void); -void BSP_negate(void); -void BSP_insert(int keyId); -double BSP_get_value(void); -void BSP_display(double value); -void BSP_display_error(char const *err); -void BSP_exit(void); - -void BSP_show_display(void); -void BSP_message(char const *msg); - -#endif // BSP_HPP diff --git a/examples/posix-win32/calc/calc.cpp b/examples/posix-win32/calc/calc.cpp deleted file mode 100644 index d8660b5fd..000000000 --- a/examples/posix-win32/calc/calc.cpp +++ /dev/null @@ -1,930 +0,0 @@ -//$file${.::calc.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc.qm -// File: ${.::calc.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ -#include "bsp.hpp" // board support package -#include "calc.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -//$declare${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -class Calc : public QP::QHsm { -public: - static Calc inst; - -private: - double m_op1; - double m_op2; - uint8_t m_oper1; - uint8_t m_oper2; - -public: - Calc(); - - // guard function to evaluate the current expression - // taking into account the precedence of operands. - // return: true if evaluation successful - // false when error encountered - bool eval( - double op, - uint8_t oper) noexcept; - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(on); - Q_STATE_DECL(ready); - Q_STATE_DECL(begin); - Q_STATE_DECL(result); - Q_STATE_DECL(operand1); - Q_STATE_DECL(zero1); - Q_STATE_DECL(int1); - Q_STATE_DECL(frac1); - Q_STATE_DECL(negated1); - Q_STATE_DECL(opEntered); - Q_STATE_DECL(operand2); - Q_STATE_DECL(zero2); - Q_STATE_DECL(int2); - Q_STATE_DECL(frac2); - Q_STATE_DECL(negated2); - Q_STATE_DECL(error); - Q_STATE_DECL(final); -}; // class Calc -//$enddecl${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -QP::QHsm * const the_calc = &Calc::inst; -//$enddef${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -Calc Calc::inst; - -//${SMs::Calc::Calc} ......................................................... -Calc::Calc() - : QHsm(Q_STATE_CAST(&Calc::initial)) -{} - -//${SMs::Calc::eval} ......................................................... -bool Calc::eval( - double op, - uint8_t oper) noexcept -{ - double result; - if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; - } - else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; - } - - if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; - } - if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; - } - BSP_display(result); - - return true; -} - -//${SMs::Calc::SM} ........................................................... -Q_STATE_DEF(Calc, initial) { - //${SMs::Calc::SM::initial} - BSP_clear(); - (void)e; /* unused parameter */ - - QS_FUN_DICTIONARY(&Calc::on); - QS_FUN_DICTIONARY(&Calc::ready); - QS_FUN_DICTIONARY(&Calc::begin); - QS_FUN_DICTIONARY(&Calc::result); - QS_FUN_DICTIONARY(&Calc::operand1); - QS_FUN_DICTIONARY(&Calc::zero1); - QS_FUN_DICTIONARY(&Calc::int1); - QS_FUN_DICTIONARY(&Calc::frac1); - QS_FUN_DICTIONARY(&Calc::negated1); - QS_FUN_DICTIONARY(&Calc::opEntered); - QS_FUN_DICTIONARY(&Calc::operand2); - QS_FUN_DICTIONARY(&Calc::zero2); - QS_FUN_DICTIONARY(&Calc::int2); - QS_FUN_DICTIONARY(&Calc::frac2); - QS_FUN_DICTIONARY(&Calc::negated2); - QS_FUN_DICTIONARY(&Calc::error); - QS_FUN_DICTIONARY(&Calc::final); - - return tran(&on); -} - -//${SMs::Calc::SM::on} ....................................................... -Q_STATE_DEF(Calc, on) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on} - case Q_ENTRY_SIG: { - BSP_message("on-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on} - case Q_EXIT_SIG: { - BSP_message("on-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::initial} - case Q_INIT_SIG: { - BSP_message("on-INIT;"); - status_ = tran(&ready); - break; - } - //${SMs::Calc::SM::on::C} - case C_SIG: { - BSP_clear(); - status_ = tran(&on); - break; - } - //${SMs::Calc::SM::on::OFF} - case OFF_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready} ................................................ -Q_STATE_DEF(Calc, ready) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready} - case Q_ENTRY_SIG: { - BSP_message("ready-ENTRY;"); - m_oper2 = KEY_NULL; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready} - case Q_EXIT_SIG: { - BSP_message("ready-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::initial} - case Q_INIT_SIG: { - BSP_message("ready-INIT;"); - status_ = tran(&begin); - break; - } - //${SMs::Calc::SM::on::ready::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - status_ = tran(&zero1); - break; - } - //${SMs::Calc::SM::on::ready::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::ready::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::ready::OPER} - case OPER_SIG: { - m_op1 = BSP_get_value(); - m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - status_ = tran(&opEntered); - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::begin} ......................................... -Q_STATE_DEF(Calc, begin) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::begin} - case Q_ENTRY_SIG: { - BSP_message("begin-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::begin} - case Q_EXIT_SIG: { - BSP_message("begin-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::begin::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::ready::begin::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - status_ = tran(&negated1); - } - //${SMs::Calc::SM::on::ready::begin::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&ready); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::result} ........................................ -Q_STATE_DEF(Calc, result) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::result} - case Q_ENTRY_SIG: { - BSP_message("result-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::result} - case Q_EXIT_SIG: { - BSP_message("result-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&ready); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1} ............................................. -Q_STATE_DEF(Calc, operand1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1} - case Q_ENTRY_SIG: { - BSP_message("operand1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1} - case Q_EXIT_SIG: { - BSP_message("operand1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::CE} - case CE_SIG: { - BSP_clear(); - status_ = tran(&begin); - break; - } - //${SMs::Calc::SM::on::operand1::OPER} - case OPER_SIG: { - m_op1 = BSP_get_value(); - m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - status_ = tran(&opEntered); - break; - } - //${SMs::Calc::SM::on::operand1::EQUALS} - case EQUALS_SIG: { - status_ = tran(&result); - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::zero1} ...................................... -Q_STATE_DEF(Calc, zero1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::zero1} - case Q_ENTRY_SIG: { - BSP_message("zero1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1} - case Q_EXIT_SIG: { - BSP_message("zero1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1::DIGIT_0} - case DIGIT_0_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::operand1::zero1::POINT} - case POINT_SIG: { - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::int1} ....................................... -Q_STATE_DEF(Calc, int1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::int1} - case Q_ENTRY_SIG: { - BSP_message("int1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::int1} - case Q_EXIT_SIG: { - BSP_message("int1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::int1::POINT} - case POINT_SIG: { - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::operand1::int1::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::frac1} ...................................... -Q_STATE_DEF(Calc, frac1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::frac1} - case Q_ENTRY_SIG: { - BSP_message("frac1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1} - case Q_EXIT_SIG: { - BSP_message("frac1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1::POINT} - case POINT_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::negated1} ................................... -Q_STATE_DEF(Calc, negated1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::negated1} - case Q_ENTRY_SIG: { - BSP_message("negated1-ENTRY;"); - BSP_negate(); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::negated1} - case Q_EXIT_SIG: { - BSP_message("negated1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::negated1::DIGIT_0} - case DIGIT_0_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&zero1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::POINT} - case POINT_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand1::negated1::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - ; - status_ = Q_RET_HANDLED; - } - //${SMs::Calc::SM::on::operand1::negated1::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::opEntered} ............................................ -Q_STATE_DEF(Calc, opEntered) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::opEntered} - case Q_ENTRY_SIG: { - BSP_message("opEntered-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::opEntered} - case Q_EXIT_SIG: { - BSP_message("opEntered-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::opEntered::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - status_ = tran(&zero2); - break; - } - //${SMs::Calc::SM::on::opEntered::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int2); - break; - } - //${SMs::Calc::SM::on::opEntered::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac2); - break; - } - //${SMs::Calc::SM::on::opEntered::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::opEntered::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - status_ = tran(&negated2); - } - //${SMs::Calc::SM::on::opEntered::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2} ............................................. -Q_STATE_DEF(Calc, operand2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2} - case Q_ENTRY_SIG: { - BSP_message("operand2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2} - case Q_EXIT_SIG: { - BSP_message("operand2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::CE} - case CE_SIG: { - BSP_clear(); - status_ = tran(&opEntered); - break; - } - //${SMs::Calc::SM::on::operand2::EQUALS} - case EQUALS_SIG: { - //${SMs::Calc::SM::on::operand2::EQUALS::[eval()]} - if (eval(BSP_get_value(), KEY_NULL)) { - status_ = tran(&result); - } - //${SMs::Calc::SM::on::operand2::EQUALS::[else]} - else { - status_ = tran(&error); - } - break; - } - //${SMs::Calc::SM::on::operand2::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand2::OPER::[eval()]} - if (eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code)) { - status_ = tran(&opEntered); - } - //${SMs::Calc::SM::on::operand2::OPER::[else]} - else { - status_ = tran(&error); - } - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2::zero2} ...................................... -Q_STATE_DEF(Calc, zero2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2::zero2} - case Q_ENTRY_SIG: { - BSP_message("zero2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::zero2} - case Q_EXIT_SIG: { - BSP_message("zero2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::zero2::DIGIT_0} - case DIGIT_0_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::zero2::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int2); - break; - } - //${SMs::Calc::SM::on::operand2::zero2::POINT} - case POINT_SIG: { - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac2); - break; - } - default: { - status_ = super(&operand2); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2::int2} ....................................... -Q_STATE_DEF(Calc, int2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2::int2} - case Q_ENTRY_SIG: { - BSP_message("int2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::int2} - case Q_EXIT_SIG: { - BSP_message("int2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::int2::POINT} - case POINT_SIG: { - BSP_insert((int)'.'); - status_ = tran(&frac2); - break; - } - //${SMs::Calc::SM::on::operand2::int2::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand2); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2::frac2} ...................................... -Q_STATE_DEF(Calc, frac2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2::frac2} - case Q_ENTRY_SIG: { - BSP_message("frac2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::frac2} - case Q_EXIT_SIG: { - BSP_message("frac2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::frac2::POINT} - case POINT_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::frac2::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand2); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2::negated2} ................................... -Q_STATE_DEF(Calc, negated2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2::negated2} - case Q_ENTRY_SIG: { - BSP_message("negated2-ENTRY;"); - BSP_negate(); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::negated2} - case Q_EXIT_SIG: { - BSP_message("negated2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand2::negated2::DIGIT_0} - case DIGIT_0_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&zero2); - break; - } - //${SMs::Calc::SM::on::operand2::negated2::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int2); - break; - } - //${SMs::Calc::SM::on::operand2::negated2::POINT} - case POINT_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&frac2); - break; - } - //${SMs::Calc::SM::on::operand2::negated2::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand2::negated2::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - ; - status_ = Q_RET_HANDLED; - } - //${SMs::Calc::SM::on::operand2::negated2::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&operand2); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::error} ................................................ -Q_STATE_DEF(Calc, error) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::error} - case Q_ENTRY_SIG: { - BSP_message("error-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::error} - case Q_EXIT_SIG: { - BSP_message("error-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::final} .................................................... -Q_STATE_DEF(Calc, final) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::final} - case Q_ENTRY_SIG: { - BSP_message("final-ENTRY;"); - BSP_exit(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/calc/calc.hpp b/examples/posix-win32/calc/calc.hpp deleted file mode 100644 index f9f8c0668..000000000 --- a/examples/posix-win32/calc/calc.hpp +++ /dev/null @@ -1,68 +0,0 @@ -//$file${.::calc.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc.qm -// File: ${.::calc.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef CALC_HPP_ -#define CALC_HPP_ - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -//$declare${Events::CalcEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::CalcEvt} ......................................................... -class CalcEvt : public QP::QEvt { -public: - std::uint8_t key_code; - -public: - CalcEvt( - QP::QSignal sig, - std::uint8_t kc) - : QEvt(sig), - key_code(kc) - {} -}; // class CalcEvt -//$enddecl${Events::CalcEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -extern QP::QHsm * const the_calc; -//$enddecl${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // CALC_HPP_ diff --git a/examples/posix-win32/calc/calc.qm b/examples/posix-win32/calc/calc.qm deleted file mode 100644 index 0dd6839c9..000000000 --- a/examples/posix-win32/calc/calc.qm +++ /dev/null @@ -1,739 +0,0 @@ - - - Improved model of the Calculator described in Chapter 4 of PSiCC2. Improvements include: - -- using "no me->" pointer implementation -- placing the "negated1" state inside "operand1" superstate -- placing the "negated2" state inside "operand2" superstate -- adding handling of operator precedence '*','/' before '+','-' - - - - - - - - - - - - - - - : QEvt(sig), - key_code(kc) - - - - - - - - Calculator state machine - - - The only inst of the Calc object (Singleton pattern). - - - - - - - - - - - - constructor - : QHsm(Q_STATE_CAST(&Calc::initial)) - - - - noexcept - // guard function to evaluate the current expression -// taking into account the precedence of operands. -// return: true if evaluation successful -// false when error encountered - - - - - double result; -if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; -} -else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; -} - -if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; -} -if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; -} -BSP_display(result); - -return true; - - - - - - BSP_clear(); -(void)e; /* unused parameter */ - - - - - - - BSP_message("on-ENTRY;"); - BSP_message("on-EXIT;"); - - - BSP_message("on-INIT;"); - - - - - - - BSP_clear(); - - - - - - - - - - - - - BSP_message("ready-ENTRY;"); -m_oper2 = KEY_NULL; - BSP_message("ready-EXIT;"); - - - BSP_message("ready-INIT;"); - - - - - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - m_op1 = BSP_get_value(); -m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - - - - - - BSP_message("begin-ENTRY;"); - BSP_message("begin-EXIT;"); - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - BSP_message("result-ENTRY;"); - BSP_message("result-EXIT;"); - - - - - - - - - - - - - BSP_message("operand1-ENTRY;"); - BSP_message("operand1-EXIT;"); - - - BSP_clear(); - - - - - - - m_op1 = BSP_get_value(); -m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - - - - - - - - - - - - BSP_message("zero1-ENTRY;"); - BSP_message("zero1-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - - - - BSP_message("int1-ENTRY;"); - BSP_message("int1-EXIT;"); - - - BSP_insert((int)'.'); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("frac1-ENTRY;"); - BSP_message("frac1-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("negated1-ENTRY;"); -BSP_negate(); - BSP_message("negated1-EXIT;"); - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - else - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - ; - - - - - - - - - - - - - - - - - - - - - BSP_message("opEntered-ENTRY;"); - BSP_message("opEntered-EXIT;"); - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - BSP_message("operand2-ENTRY;"); - BSP_message("operand2-EXIT;"); - - - BSP_clear(); - - - - - - - - - - - - - - - - eval(BSP_get_value(), KEY_NULL) - - - - - - - - - - - - - - - - - - - - eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code) - - - - - - - - - - - BSP_message("zero2-ENTRY;"); - BSP_message("zero2-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - - - - BSP_message("int2-ENTRY;"); - BSP_message("int2-EXIT;"); - - - BSP_insert((int)'.'); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("frac2-ENTRY;"); - BSP_message("frac2-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("negated2-ENTRY;"); -BSP_negate(); - BSP_message("negated2-EXIT;"); - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - else - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - ; - - - - - - - - - - - - - - - - - - - - - BSP_message("error-ENTRY;"); - BSP_message("error-EXIT;"); - - - - - - - - - - - - - BSP_message("final-ENTRY;"); -BSP_exit(); - - - - - - - - - - Global opaque pointer to the Calc inst - = &Calc::inst; - - - - - - - #ifndef CALC_HPP_ -#define CALC_HPP_ - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -$declare${Events::CalcEvt} - -$declare${SMs::the_calc} - -#endif // CALC_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ -#include "bsp.hpp" // board support package -#include "calc.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -$declare${SMs::Calc} - -$define${SMs::the_calc} -$define(SMs::Calc) - - - diff --git a/examples/posix-win32/calc/main.cpp b/examples/posix-win32/calc/main.cpp deleted file mode 100644 index e99affb1a..000000000 --- a/examples/posix-win32/calc/main.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//============================================================================ -// Product: Calculator Example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ API -#include "bsp.hpp" // board support package -#include "calc.hpp" // application - -#include - -using namespace QP; -using namespace std; - -//............................................................................ -int main() { - - QF::init(); - QF::onStartup(); - - cout << "Calculator example, QEP version: " - << QP_VERSION_STR << endl - << "Press '0' .. '9' to enter a digit\n" - "Press '.' to enter the decimal point\n" - "Press '+' or '#' to add\n" - "Press '-' to subtract or negate a number\n" - "Press '*' to multiply\n" - "Press '/' to divide\n" - "Press '=' or to get the result\n" - "Press 'c' or 'C' to Cancel\n" - "Press 'e' or 'E' to Cancel Entry\n" - "Press to quit.\n\n"; - - the_calc->init(0U); // trigger initial transition - - for (;;) { // event loop - - BSP_show_display(); // show the display - cout << ": "; - - std::uint8_t key_code = - static_cast(QF::consoleWaitForKey()); - cout << static_cast(key_code) << ' '; - - QSignal sig = 0U; - switch (key_code) { - case 'c': // intentionally fall through - case 'C': { - sig = C_SIG; - break; - } - case 'e': // intentionally fall through - case 'E': { - sig = CE_SIG; - break; - } - case '0': { - sig = DIGIT_0_SIG; - break; - } - case '1': // intentionally fall through - case '2': // intentionally fall through - case '3': // intentionally fall through - case '4': // intentionally fall through - case '5': // intentionally fall through - case '6': // intentionally fall through - case '7': // intentionally fall through - case '8': // intentionally fall through - case '9': { - sig = DIGIT_1_9_SIG; - break; - } - case '.': { - sig = POINT_SIG; - break; - } - case '+': // intentionally fall through - case '-': // intentionally fall through - case '*': // intentionally fall through - case '/': { - sig = OPER_SIG; - break; - } - case '#': { // alternative '+' - sig = OPER_SIG; - key_code = '+'; - break; - } - case '=': // intentionally fall through - case '\r': { // Enter key - sig = EQUALS_SIG; - break; - } - case '\33': { // ESC key - sig = OFF_SIG; - break; - } - default: { - sig = 0U; // invalid event - break; - } - } - - if (sig != 0) { // valid event generated? - CalcEvt const calc_evt(sig, key_code); - the_calc->dispatch(&calc_evt, 0U); // dispatch event - } - } - - QF::onCleanup(); - return 0; -} diff --git a/examples/posix-win32/calc2/Makefile b/examples/posix-win32/calc2/Makefile deleted file mode 100644 index 7cc6b48c3..000000000 --- a/examples/posix-win32/calc2/Makefile +++ /dev/null @@ -1,291 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := calc2 - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - calc2.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/calc2/bsp.cpp b/examples/posix-win32/calc2/bsp.cpp deleted file mode 100644 index ad7588888..000000000 --- a/examples/posix-win32/calc2/bsp.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.9.0 -// Date of the Last Update: 2020-08-25 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace QP; -using namespace std; - -#define DISP_WIDTH 15 - -/* helper macros to "stringify" values */ -#define VAL(x) #x -#define STRINGIFY(x) VAL(x) - -static char l_display[DISP_WIDTH + 1]; // the calculator display -static int l_len; // number of displayed characters - -//............................................................................ -void BSP_clear(void) { - memset(l_display, ' ', DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = '0'; - l_display[DISP_WIDTH] = '\0'; - l_len = 0; -} -//............................................................................ -void BSP_insert(int keyId) { - if (l_len == 0) { - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } - else if (l_len < (DISP_WIDTH - 1)) { - MEMMOVE_S(&l_display[0], DISP_WIDTH, &l_display[1], DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } -} -//............................................................................ -void BSP_display(double value) { - SNPRINTF_S(l_display, DISP_WIDTH, "%10.7g", value); -} -//............................................................................ -void BSP_display_error(char const *err) { - STRNCPY_S(l_display, DISP_WIDTH, err); -} -//............................................................................ -void BSP_negate(void) { - BSP_clear(); - l_display[DISP_WIDTH - 2] = '-'; -} -//............................................................................ -void BSP_show_display(void) { - PRINTF_S("\n[%" STRINGIFY(DISP_WIDTH) "s] ", l_display); -} -//............................................................................ -void BSP_exit(void) { - PRINTF_S("\n%s\n", "Bye! Bye!"); - fflush(stdout); - QF::onCleanup(); - exit(0); -} -//............................................................................ -double BSP_get_value(void) { - return strtod(l_display, (char **)0); -} -//............................................................................ -void BSP_message(char const *msg) { - PRINTF_S("%s", msg); -} - -namespace QP { -/*..........................................................................*/ -void QF::onStartup(void) { - QF::consoleSetup(); -} -/*..........................................................................*/ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -/*..........................................................................*/ -void QF::onClockTick(void) { -} - -} // namespace QP - -//............................................................................ -// this function is used by the QP embedded systems-friendly assertions -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - FPRINTF_S(stderr, "Assertion failed in %s:%d", module, loc); - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/calc2/bsp.hpp b/examples/posix-win32/calc2/bsp.hpp deleted file mode 100644 index 2ad3fc36f..000000000 --- a/examples/posix-win32/calc2/bsp.hpp +++ /dev/null @@ -1,48 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.5.0 -// Date of the Last Update: 2019-03-21 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -void BSP_clear(void); -void BSP_negate(void); -void BSP_insert(int keyId); -double BSP_get_value(void); -void BSP_display(double value); -void BSP_display_error(char const *err); -void BSP_exit(void); - -void BSP_show_display(void); -void BSP_message(char const *msg); - -#endif // BSP_HPP diff --git a/examples/posix-win32/calc2/calc2.cpp b/examples/posix-win32/calc2/calc2.cpp deleted file mode 100644 index c22129328..000000000 --- a/examples/posix-win32/calc2/calc2.cpp +++ /dev/null @@ -1,711 +0,0 @@ -//$file${.::calc2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc2.qm -// File: ${.::calc2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ -#include "bsp.hpp" // board support package -#include "calc2.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -//$declare${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -class Calc : public QP::QHsm { -public: - static Calc inst; - -private: - double m_op1; - double m_op2; - uint8_t m_oper1; - uint8_t m_oper2; - -public: - Calc(); - - // guard function to evaluate the current expression - // taking into account the precedence of operands. - // return: true if evaluation successful - // false when error encountered - bool eval( - double op, - uint8_t oper) noexcept; - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(on); - Q_STATE_DECL(ready); - Q_STATE_DECL(begin); - Q_STATE_DECL(result); - Q_STATE_DECL(operand1); - Q_STATE_DECL(zero1); - Q_STATE_DECL(int1); - Q_STATE_DECL(frac1); - Q_STATE_DECL(negated1); - Q_STATE_DECL(opEntered); - Q_STATE_DECL(error); - Q_STATE_DECL(final); -}; // class Calc -//$enddecl${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -QP::QHsm * const the_calc = &Calc::inst; -//$enddef${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -Calc Calc::inst; - -//${SMs::Calc::Calc} ......................................................... -Calc::Calc() - : QHsm(Q_STATE_CAST(&Calc::initial)) -{} - -//${SMs::Calc::eval} ......................................................... -bool Calc::eval( - double op, - uint8_t oper) noexcept -{ - double result; - if (m_oper1 == KEY_NULL) { // no op1 yet - m_op1 = op; - m_oper1 = oper; - result = m_op1; - } - else if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; - } - else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; - } - - if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; - } - if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; - } - BSP_display(result); - - return true; -} - -//${SMs::Calc::SM} ........................................................... -Q_STATE_DEF(Calc, initial) { - //${SMs::Calc::SM::initial} - BSP_clear(); - (void)e; /* unused parameter */ - - QS_FUN_DICTIONARY(&Calc::on); - QS_FUN_DICTIONARY(&Calc::ready); - QS_FUN_DICTIONARY(&Calc::begin); - QS_FUN_DICTIONARY(&Calc::result); - QS_FUN_DICTIONARY(&Calc::operand1); - QS_FUN_DICTIONARY(&Calc::zero1); - QS_FUN_DICTIONARY(&Calc::int1); - QS_FUN_DICTIONARY(&Calc::frac1); - QS_FUN_DICTIONARY(&Calc::negated1); - QS_FUN_DICTIONARY(&Calc::opEntered); - QS_FUN_DICTIONARY(&Calc::error); - QS_FUN_DICTIONARY(&Calc::final); - - return tran(&on); -} - -//${SMs::Calc::SM::on} ....................................................... -Q_STATE_DEF(Calc, on) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on} - case Q_ENTRY_SIG: { - BSP_message("on-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on} - case Q_EXIT_SIG: { - BSP_message("on-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::initial} - case Q_INIT_SIG: { - BSP_message("on-INIT;"); - status_ = tran(&ready); - break; - } - //${SMs::Calc::SM::on::C} - case C_SIG: { - BSP_clear(); - status_ = tran(&on); - break; - } - //${SMs::Calc::SM::on::OFF} - case OFF_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready} ................................................ -Q_STATE_DEF(Calc, ready) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready} - case Q_ENTRY_SIG: { - BSP_message("ready-ENTRY;"); - m_oper1 = KEY_NULL; - m_oper2 = KEY_NULL; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready} - case Q_EXIT_SIG: { - BSP_message("ready-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::initial} - case Q_INIT_SIG: { - BSP_message("ready-INIT;"); - status_ = tran(&begin); - break; - } - //${SMs::Calc::SM::on::ready::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - status_ = tran(&zero1); - break; - } - //${SMs::Calc::SM::on::ready::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::ready::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::ready::OPER} - case OPER_SIG: { - m_op1 = BSP_get_value(); - m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - status_ = tran(&opEntered); - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::begin} ......................................... -Q_STATE_DEF(Calc, begin) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::begin} - case Q_ENTRY_SIG: { - BSP_message("begin-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::begin} - case Q_EXIT_SIG: { - BSP_message("begin-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::begin::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::ready::begin::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - status_ = tran(&negated1); - } - //${SMs::Calc::SM::on::ready::begin::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&ready); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::result} ........................................ -Q_STATE_DEF(Calc, result) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::result} - case Q_ENTRY_SIG: { - BSP_message("result-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::ready::result} - case Q_EXIT_SIG: { - BSP_message("result-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&ready); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1} ............................................. -Q_STATE_DEF(Calc, operand1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1} - case Q_ENTRY_SIG: { - BSP_message("operand1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1} - case Q_EXIT_SIG: { - BSP_message("operand1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::CE} - case CE_SIG: { - BSP_clear(); - status_ = tran(&ready); - break; - } - //${SMs::Calc::SM::on::operand1::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand1::OPER::[eval()]} - if (eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code)) { - status_ = tran(&opEntered); - } - //${SMs::Calc::SM::on::operand1::OPER::[else]} - else { - status_ = tran(&error); - } - break; - } - //${SMs::Calc::SM::on::operand1::EQUALS} - case EQUALS_SIG: { - //${SMs::Calc::SM::on::operand1::EQUALS::[eval()]} - if (eval(BSP_get_value(), KEY_NULL)) { - status_ = tran(&result); - } - //${SMs::Calc::SM::on::operand1::EQUALS::[else]} - else { - status_ = tran(&error); - } - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::zero1} ...................................... -Q_STATE_DEF(Calc, zero1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::zero1} - case Q_ENTRY_SIG: { - BSP_message("zero1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1} - case Q_EXIT_SIG: { - BSP_message("zero1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1::DIGIT_0} - case DIGIT_0_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::zero1::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::operand1::zero1::POINT} - case POINT_SIG: { - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::int1} ....................................... -Q_STATE_DEF(Calc, int1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::int1} - case Q_ENTRY_SIG: { - BSP_message("int1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::int1} - case Q_EXIT_SIG: { - BSP_message("int1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::int1::POINT} - case POINT_SIG: { - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::operand1::int1::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::frac1} ...................................... -Q_STATE_DEF(Calc, frac1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::frac1} - case Q_ENTRY_SIG: { - BSP_message("frac1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1} - case Q_EXIT_SIG: { - BSP_message("frac1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1::POINT} - case POINT_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::frac1::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1::negated1} ................................... -Q_STATE_DEF(Calc, negated1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::negated1} - case Q_ENTRY_SIG: { - BSP_message("negated1-ENTRY;"); - BSP_negate(); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::negated1} - case Q_EXIT_SIG: { - BSP_message("negated1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::operand1::negated1::DIGIT_0} - case DIGIT_0_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&zero1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::POINT} - case POINT_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::operand1::negated1::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand1::negated1::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - ; - status_ = Q_RET_HANDLED; - } - //${SMs::Calc::SM::on::operand1::negated1::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&operand1); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::opEntered} ............................................ -Q_STATE_DEF(Calc, opEntered) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::opEntered} - case Q_ENTRY_SIG: { - BSP_message("opEntered-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::opEntered} - case Q_EXIT_SIG: { - BSP_message("opEntered-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::opEntered::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - status_ = tran(&zero1); - break; - } - //${SMs::Calc::SM::on::opEntered::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = tran(&int1); - break; - } - //${SMs::Calc::SM::on::opEntered::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - status_ = tran(&frac1); - break; - } - //${SMs::Calc::SM::on::opEntered::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::opEntered::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - status_ = tran(&negated1); - } - //${SMs::Calc::SM::on::opEntered::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::error} ................................................ -Q_STATE_DEF(Calc, error) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::error} - case Q_ENTRY_SIG: { - BSP_message("error-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::on::error} - case Q_EXIT_SIG: { - BSP_message("error-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&on); - break; - } - } - return status_; -} - -//${SMs::Calc::SM::final} .................................................... -Q_STATE_DEF(Calc, final) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::final} - case Q_ENTRY_SIG: { - BSP_message("final-ENTRY;"); - BSP_exit(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/calc2/calc2.hpp b/examples/posix-win32/calc2/calc2.hpp deleted file mode 100644 index d56ea2d32..000000000 --- a/examples/posix-win32/calc2/calc2.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//$file${.::calc2.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc2.qm -// File: ${.::calc2.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc2.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef CALC2_HPP -#define CALC2_HPP - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -//$declare${Events::CalcEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::CalcEvt} ......................................................... -class CalcEvt : public QP::QEvt { -public: - std::uint8_t key_code; - -public: - CalcEvt( - QP::QSignal sig, - std::uint8_t kc) - : QEvt(sig), - key_code(kc) - {} -}; // class CalcEvt -//$enddecl${Events::CalcEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -extern QP::QHsm * const the_calc; -//$enddecl${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // CALC2_HPP - diff --git a/examples/posix-win32/calc2/calc2.qm b/examples/posix-win32/calc2/calc2.qm deleted file mode 100644 index b0c3a9285..000000000 --- a/examples/posix-win32/calc2/calc2.qm +++ /dev/null @@ -1,587 +0,0 @@ - - - Improved model of the Calculator described in Chapter 4 of PSiCC2. Improvements include: - -- using "no me->" pointer implementation -- placing the "negated1" state inside "operand1" superstate -- placing the "negated2" state inside "operand2" superstate -- adding handling of operator precedence '*','/' before '+','-' - - - - - - - - - - - - - - - : QEvt(sig), - key_code(kc) - - - - - - - - Calculator state machine - - - The only inst of the Calc object (Singleton pattern). - - - - - - - - - - - - constructor - : QHsm(Q_STATE_CAST(&Calc::initial)) - - - - noexcept - // guard function to evaluate the current expression -// taking into account the precedence of operands. -// return: true if evaluation successful -// false when error encountered - - - - - double result; -if (m_oper1 == KEY_NULL) { // no op1 yet - m_op1 = op; - m_oper1 = oper; - result = m_op1; -} -else if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; -} -else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; -} - -if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; -} -if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; -} -BSP_display(result); - -return true; - - - - - - BSP_clear(); -(void)e; /* unused parameter */ - - - - - - - BSP_message("on-ENTRY;"); - BSP_message("on-EXIT;"); - - - BSP_message("on-INIT;"); - - - - - - - BSP_clear(); - - - - - - - - - - - - - BSP_message("ready-ENTRY;"); -m_oper1 = KEY_NULL; -m_oper2 = KEY_NULL; - BSP_message("ready-EXIT;"); - - - BSP_message("ready-INIT;"); - - - - - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - m_op1 = BSP_get_value(); -m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - - - - - - BSP_message("begin-ENTRY;"); - BSP_message("begin-EXIT;"); - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - BSP_message("result-ENTRY;"); - BSP_message("result-EXIT;"); - - - - - - - - - - - - - BSP_message("operand1-ENTRY;"); - BSP_message("operand1-EXIT;"); - - - BSP_clear(); - - - - - - - - - - - - - - - - eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code) - - - - - - - - - - - - - - - - - - - - eval(BSP_get_value(), KEY_NULL) - - - - - - - - - - - BSP_message("zero1-ENTRY;"); - BSP_message("zero1-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - - - - BSP_message("int1-ENTRY;"); - BSP_message("int1-EXIT;"); - - - BSP_insert((int)'.'); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("frac1-ENTRY;"); - BSP_message("frac1-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("negated1-ENTRY;"); -BSP_negate(); - BSP_message("negated1-EXIT;"); - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - else - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - ; - - - - - - - - - - - - - - - - - - - - - BSP_message("opEntered-ENTRY;"); - BSP_message("opEntered-EXIT;"); - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - BSP_message("error-ENTRY;"); - BSP_message("error-EXIT;"); - - - - - - - - - - - - - BSP_message("final-ENTRY;"); -BSP_exit(); - - - - - - - - - - Global opaque pointer to the Calc inst - = &Calc::inst; - - - - - - - #ifndef CALC2_HPP -#define CALC2_HPP - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -$declare${Events::CalcEvt} - -$declare${SMs::the_calc} - -#endif // CALC2_HPP - - - - - #include "qpcpp.hpp" // QP/C++ -#include "bsp.hpp" // board support package -#include "calc2.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -$declare${SMs::Calc} - -$define${SMs::the_calc} -$define(SMs::Calc) - - - diff --git a/examples/posix-win32/calc2/main.cpp b/examples/posix-win32/calc2/main.cpp deleted file mode 100644 index d04347d5d..000000000 --- a/examples/posix-win32/calc2/main.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//============================================================================ -// Product: Calculator Example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ API -#include "bsp.hpp" // board support package -#include "calc2.hpp" // application - -#include - -using namespace QP; -using namespace std; - -//............................................................................ -int main() { - - QF::init(); - QF::onStartup(); - - cout << "Calculator example, QEP version: " - << QP_VERSION_STR << endl - << "Press '0' .. '9' to enter a digit\n" - "Press '.' to enter the decimal point\n" - "Press '+' or '#' to add\n" - "Press '-' to subtract or negate a number\n" - "Press '*' to multiply\n" - "Press '/' to divide\n" - "Press '=' or to get the result\n" - "Press 'c' or 'C' to Cancel\n" - "Press 'e' or 'E' to Cancel Entry\n" - "Press to quit.\n\n"; - - the_calc->init(0U); // trigger initial transition - - for (;;) { // event loop - - BSP_show_display(); // show the display - cout << ": "; - - std::uint8_t key_code = - static_cast(QF::consoleWaitForKey()); - cout << static_cast(key_code) << ' '; - - QSignal sig = 0U; - switch (key_code) { - case 'c': // intentionally fall through - case 'C': { - sig = C_SIG; - break; - } - case 'e': // intentionally fall through - case 'E': { - sig = CE_SIG; - break; - } - case '0': { - sig = DIGIT_0_SIG; - break; - } - case '1': // intentionally fall through - case '2': // intentionally fall through - case '3': // intentionally fall through - case '4': // intentionally fall through - case '5': // intentionally fall through - case '6': // intentionally fall through - case '7': // intentionally fall through - case '8': // intentionally fall through - case '9': { - sig = DIGIT_1_9_SIG; - break; - } - case '.': { - sig = POINT_SIG; - break; - } - case '+': // intentionally fall through - case '-': // intentionally fall through - case '*': // intentionally fall through - case '/': { - sig = OPER_SIG; - break; - } - case '#': { // alternative '+' - sig = OPER_SIG; - key_code = '+'; - break; - } - case '=': // intentionally fall through - case '\r': { // Enter key - sig = EQUALS_SIG; - break; - } - case '\33': { // ESC key - sig = OFF_SIG; - break; - } - default: { - sig = 0U; // invalid event - break; - } - } - - if (sig != 0) { // valid event generated? - CalcEvt const calc_evt(sig, key_code); - the_calc->dispatch(&calc_evt, 0U); // dispatch event - } - } - - QF::onCleanup(); - return 0; -} diff --git a/examples/posix-win32/calc_sub/Makefile b/examples/posix-win32/calc_sub/Makefile deleted file mode 100644 index 016118bec..000000000 --- a/examples/posix-win32/calc_sub/Makefile +++ /dev/null @@ -1,292 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := calc_sub - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - calc_sub.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/calc_sub/bsp.cpp b/examples/posix-win32/calc_sub/bsp.cpp deleted file mode 100644 index ad7588888..000000000 --- a/examples/posix-win32/calc_sub/bsp.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.9.0 -// Date of the Last Update: 2020-08-25 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace QP; -using namespace std; - -#define DISP_WIDTH 15 - -/* helper macros to "stringify" values */ -#define VAL(x) #x -#define STRINGIFY(x) VAL(x) - -static char l_display[DISP_WIDTH + 1]; // the calculator display -static int l_len; // number of displayed characters - -//............................................................................ -void BSP_clear(void) { - memset(l_display, ' ', DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = '0'; - l_display[DISP_WIDTH] = '\0'; - l_len = 0; -} -//............................................................................ -void BSP_insert(int keyId) { - if (l_len == 0) { - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } - else if (l_len < (DISP_WIDTH - 1)) { - MEMMOVE_S(&l_display[0], DISP_WIDTH, &l_display[1], DISP_WIDTH - 1); - l_display[DISP_WIDTH - 1] = (char)keyId; - ++l_len; - } -} -//............................................................................ -void BSP_display(double value) { - SNPRINTF_S(l_display, DISP_WIDTH, "%10.7g", value); -} -//............................................................................ -void BSP_display_error(char const *err) { - STRNCPY_S(l_display, DISP_WIDTH, err); -} -//............................................................................ -void BSP_negate(void) { - BSP_clear(); - l_display[DISP_WIDTH - 2] = '-'; -} -//............................................................................ -void BSP_show_display(void) { - PRINTF_S("\n[%" STRINGIFY(DISP_WIDTH) "s] ", l_display); -} -//............................................................................ -void BSP_exit(void) { - PRINTF_S("\n%s\n", "Bye! Bye!"); - fflush(stdout); - QF::onCleanup(); - exit(0); -} -//............................................................................ -double BSP_get_value(void) { - return strtod(l_display, (char **)0); -} -//............................................................................ -void BSP_message(char const *msg) { - PRINTF_S("%s", msg); -} - -namespace QP { -/*..........................................................................*/ -void QF::onStartup(void) { - QF::consoleSetup(); -} -/*..........................................................................*/ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -/*..........................................................................*/ -void QF::onClockTick(void) { -} - -} // namespace QP - -//............................................................................ -// this function is used by the QP embedded systems-friendly assertions -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - FPRINTF_S(stderr, "Assertion failed in %s:%d", module, loc); - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/calc_sub/bsp.hpp b/examples/posix-win32/calc_sub/bsp.hpp deleted file mode 100644 index 229410e1c..000000000 --- a/examples/posix-win32/calc_sub/bsp.hpp +++ /dev/null @@ -1,48 +0,0 @@ -//============================================================================ -// Product: Board Support Package (BSP) for the Calculator example -// Last Updated for Version: 6.5.0 -// Date of the Last Update: 2019-03-21 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -void BSP_clear(void); -void BSP_negate(void); -void BSP_insert(int keyId); -double BSP_get_value(void); -void BSP_display(double value); -void BSP_display_error(char const *err); -void BSP_exit(void); - -void BSP_show_display(void); -void BSP_message(char const *msg); - -#endif // BSP_HPP_ diff --git a/examples/posix-win32/calc_sub/calc_sub.cpp b/examples/posix-win32/calc_sub/calc_sub.cpp deleted file mode 100644 index 0d615f78f..000000000 --- a/examples/posix-win32/calc_sub/calc_sub.cpp +++ /dev/null @@ -1,1332 +0,0 @@ -//$file${.::calc_sub.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc_sub.qm -// File: ${.::calc_sub.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc_sub.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ API -#include "bsp.hpp" // board support package -#include "calc_sub.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -//$declare${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -class Calc : public QP::QMsm { -public: - static Calc inst; - -private: - double m_op1; - double m_op2; - uint8_t m_oper1; - uint8_t m_oper2; - -public: - Calc(); - - // guard function to evaluate the current expression - // taking into account the precedence of operands. - // return: true if evaluation successful - // false when error encountered - bool eval( - double op, - uint8_t oper); - -protected: - // exit points for submachine ${SMs::Calc::SM::operand} - struct SM_operand { - QP::QMState super; - QP::QActionHandler const CE; // exit-point segment - } const *sub_operand; - - QM_STATE_DECL( initial); - QM_STATE_DECL( on); - QM_ACTION_DECL(on_e); - QM_ACTION_DECL(on_x); - QM_ACTION_DECL(on_i); - QM_STATE_DECL( ready); - QM_ACTION_DECL(ready_e); - QM_ACTION_DECL(ready_x); - QM_ACTION_DECL(ready_i); - QM_STATE_DECL( result); - QM_ACTION_DECL(result_e); - QM_ACTION_DECL(result_x); - QM_STATE_DECL( begin); - QM_ACTION_DECL(begin_e); - QM_ACTION_DECL(begin_x); - QM_SM_STATE_DECL(operand, operand1); - QM_ACTION_DECL(operand1_e); - QM_ACTION_DECL(operand1_CE); - QM_STATE_DECL( opEntered); - QM_ACTION_DECL(opEntered_e); - QM_ACTION_DECL(opEntered_x); - QM_SM_STATE_DECL(operand, operand2); - QM_ACTION_DECL(operand2_e); - QM_ACTION_DECL(operand2_CE); - QM_STATE_DECL( error); - QM_ACTION_DECL(error_e); - QM_ACTION_DECL(error_x); - QM_STATE_DECL( final); - QM_ACTION_DECL(final_e); - - // submachine ${SMs::Calc::SM::operand} - QM_STATE_DECL( operand); - QM_ACTION_DECL(operand_e); - QM_ACTION_DECL(operand_x); - QM_ACTION_DECL(operand_i); - QM_ACTION_DECL(operand_zero_ep); - QM_ACTION_DECL(operand_intgr_ep); - QM_ACTION_DECL(operand_frac_ep); - QM_ACTION_DECL(operand_neg_ep); - QM_STATE_DECL( operand_zero); - QM_ACTION_DECL(operand_zero_e); - QM_ACTION_DECL(operand_zero_x); - QM_STATE_DECL( operand_intgr); - QM_ACTION_DECL(operand_intgr_e); - QM_ACTION_DECL(operand_intgr_x); - QM_STATE_DECL( operand_frac); - QM_ACTION_DECL(operand_frac_e); - QM_ACTION_DECL(operand_frac_x); - QM_STATE_DECL( operand_neg); - QM_ACTION_DECL(operand_neg_e); - QM_ACTION_DECL(operand_neg_x); -}; // class Calc -//$enddecl${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -QP::QAsm * const the_calc = &Calc::inst; -//$enddef${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::Calc} ............................................................... -Calc Calc::inst; - -//${SMs::Calc::Calc} ......................................................... -Calc::Calc() - : QMsm(&initial) -{} - -//${SMs::Calc::eval} ......................................................... -bool Calc::eval( - double op, - uint8_t oper) -{ - double result; - if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; - } - else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; - } - - if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; - } - if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; - } - BSP_display(result); - - return true; -} - -//${SMs::Calc::SM} ........................................................... -QM_STATE_DEF(Calc, initial) { - //${SMs::Calc::SM::initial} - BSP_clear(); - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Calc::on); - QS_FUN_DICTIONARY(&Calc::ready); - QS_FUN_DICTIONARY(&Calc::result); - QS_FUN_DICTIONARY(&Calc::begin); - QS_FUN_DICTIONARY(&Calc::operand1); - QS_FUN_DICTIONARY(&Calc::opEntered); - QS_FUN_DICTIONARY(&Calc::operand2); - QS_FUN_DICTIONARY(&Calc::error); - QS_FUN_DICTIONARY(&Calc::final); - QS_FUN_DICTIONARY(&Calc::operand_zero); - QS_FUN_DICTIONARY(&Calc::operand_intgr); - QS_FUN_DICTIONARY(&Calc::operand_frac); - QS_FUN_DICTIONARY(&Calc::operand_neg); - QS_FUN_DICTIONARY(&Calc::operand); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &on_s, // target state - { - &on_e, // entry - &on_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${SMs::Calc::SM::on} ....................................................... -QP::QMState const Calc::on_s = { - QM_STATE_NULL, // superstate (top) - &Calc::on, - &Calc::on_e, - &Calc::on_x, - &Calc::on_i -}; -//${SMs::Calc::SM::on} -QM_ACTION_DEF(Calc, on_e) { - BSP_message("on-ENTRY;"); - return qm_entry(&on_s); -} -//${SMs::Calc::SM::on} -QM_ACTION_DEF(Calc, on_x) { - BSP_message("on-EXIT;"); - return qm_exit(&on_s); -} -//${SMs::Calc::SM::on::initial} -QM_ACTION_DEF(Calc, on_i) { - //${SMs::Calc::SM::on::initial} - BSP_message("on-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &ready_s, // target state - { - &ready_e, // entry - &ready_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::Calc::SM::on} -QM_STATE_DEF(Calc, on) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::C} - case C_SIG: { - BSP_clear(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &on_s, // target state - { - &on_x, // exit - &on_e, // entry - &on_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::on::OFF} - case OFF_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &final_s, // target state - { - &on_x, // exit - &final_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready} ................................................ -QP::QMState const Calc::ready_s = { - &Calc::on_s, // superstate - &Calc::ready, - &Calc::ready_e, - &Calc::ready_x, - &Calc::ready_i -}; -//${SMs::Calc::SM::on::ready} -QM_ACTION_DEF(Calc, ready_e) { - BSP_message("ready-ENTRY;"); - m_oper2 = KEY_NULL; - return qm_entry(&ready_s); -} -//${SMs::Calc::SM::on::ready} -QM_ACTION_DEF(Calc, ready_x) { - BSP_message("ready-EXIT;"); - return qm_exit(&ready_s); -} -//${SMs::Calc::SM::on::ready::initial} -QM_ACTION_DEF(Calc, ready_i) { - //${SMs::Calc::SM::on::ready::initial} - BSP_message("ready-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &begin_s, // target state - { - &begin_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::Calc::SM::on::ready} -QM_STATE_DEF(Calc, ready) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &ready_x, // exit - &operand1_e, // entry - &operand_zero_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::ready::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &ready_x, // exit - &operand1_e, // entry - &operand_intgr_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::ready::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &ready_x, // exit - &operand1_e, // entry - &operand_frac_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::ready::OPER} - case OPER_SIG: { - m_op1 = BSP_get_value(); - m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &opEntered_s, // target state - { - &ready_x, // exit - &opEntered_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::result} ........................................ -QP::QMState const Calc::result_s = { - &Calc::ready_s, // superstate - &Calc::result, - &Calc::result_e, - &Calc::result_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::on::ready::result} -QM_ACTION_DEF(Calc, result_e) { - BSP_message("result-ENTRY;"); - return qm_entry(&result_s); -} -//${SMs::Calc::SM::on::ready::result} -QM_ACTION_DEF(Calc, result_x) { - BSP_message("result-EXIT;"); - return qm_exit(&result_s); -} -//${SMs::Calc::SM::on::ready::result} -QM_STATE_DEF(Calc, result) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::ready::begin} ......................................... -QP::QMState const Calc::begin_s = { - &Calc::ready_s, // superstate - &Calc::begin, - &Calc::begin_e, - &Calc::begin_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::on::ready::begin} -QM_ACTION_DEF(Calc, begin_e) { - BSP_message("begin-ENTRY;"); - return qm_entry(&begin_s); -} -//${SMs::Calc::SM::on::ready::begin} -QM_ACTION_DEF(Calc, begin_x) { - BSP_message("begin-EXIT;"); - return qm_exit(&begin_s); -} -//${SMs::Calc::SM::on::ready::begin} -QM_STATE_DEF(Calc, begin) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::ready::begin::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::ready::begin::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &begin_x, // exit - &ready_x, // exit - &operand1_e, // entry - &operand_neg_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - } - //${SMs::Calc::SM::on::ready::begin::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand1} ............................................. -Calc::SM_operand const Calc::operand1_s = { - { - &Calc::on_s, // superstate - &Calc::operand1, - &Calc::operand1_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. - }, - &Calc::operand1_CE -}; -//${SMs::Calc::SM::on::operand1} -QM_ACTION_DEF(Calc, operand1_e) { - sub_operand = &Calc::operand1_s; // attach submachine - return operand_e(this); // enter submachine -} -//${SMs::Calc::SM::on::operand1} -QM_ACTION_DEF(Calc, operand1_CE) { - BSP_message("operand1:XP-CE;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &ready_s, // target state - { - &operand_x, // submachine exit - &ready_e, // entry - &ready_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran(&tatbl_); -} -//${SMs::Calc::SM::on::operand1} -QM_STATE_DEF(Calc, operand1) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand1::OPER} - case OPER_SIG: { - m_op1 = BSP_get_value(); - m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &opEntered_s, // target state - { - &opEntered_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::on::operand1::EQUALS} - case EQUALS_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &result_s, // target state - { - &ready_e, // entry - &result_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::opEntered} ............................................ -QP::QMState const Calc::opEntered_s = { - &Calc::on_s, // superstate - &Calc::opEntered, - &Calc::opEntered_e, - &Calc::opEntered_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::on::opEntered} -QM_ACTION_DEF(Calc, opEntered_e) { - BSP_message("opEntered-ENTRY;"); - return qm_entry(&opEntered_s); -} -//${SMs::Calc::SM::on::opEntered} -QM_ACTION_DEF(Calc, opEntered_x) { - BSP_message("opEntered-EXIT;"); - return qm_exit(&opEntered_s); -} -//${SMs::Calc::SM::on::opEntered} -QM_STATE_DEF(Calc, opEntered) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::opEntered::DIGIT_0} - case DIGIT_0_SIG: { - BSP_clear(); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &opEntered_x, // exit - &operand2_e, // entry - &operand_zero_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::opEntered::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_clear(); - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &opEntered_x, // exit - &operand2_e, // entry - &operand_intgr_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::opEntered::POINT} - case POINT_SIG: { - BSP_clear(); - BSP_insert((int)'0'); - BSP_insert((int)'.'); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &opEntered_x, // exit - &operand2_e, // entry - &operand_frac_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - break; - } - //${SMs::Calc::SM::on::opEntered::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::opEntered::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - &opEntered_x, // exit - &operand2_e, // entry - &operand_neg_ep, // EP - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_ep(&tatbl_); - } - //${SMs::Calc::SM::on::opEntered::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::operand2} ............................................. -Calc::SM_operand const Calc::operand2_s = { - { - &Calc::on_s, // superstate - &Calc::operand2, - &Calc::operand2_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. - }, - &Calc::operand2_CE -}; -//${SMs::Calc::SM::on::operand2} -QM_ACTION_DEF(Calc, operand2_e) { - sub_operand = &Calc::operand2_s; // attach submachine - return operand_e(this); // enter submachine -} -//${SMs::Calc::SM::on::operand2} -QM_ACTION_DEF(Calc, operand2_CE) { - BSP_message("operand2:XP-CE;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &opEntered_s, // target state - { - &operand_x, // submachine exit - &opEntered_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran(&tatbl_); -} -//${SMs::Calc::SM::on::operand2} -QM_STATE_DEF(Calc, operand2) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::on::operand2::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::on::operand2::OPER::[eval()]} - if (eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code)) { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &opEntered_s, // target state - { - &opEntered_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - //${SMs::Calc::SM::on::operand2::OPER::[else]} - else { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &error_s, // target state - { - &error_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - break; - } - //${SMs::Calc::SM::on::operand2::EQUALS} - case EQUALS_SIG: { - //${SMs::Calc::SM::on::operand2::EQUALS::[eval()]} - if (eval(BSP_get_value(), KEY_NULL)) { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &result_s, // target state - { - &ready_e, // entry - &result_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - //${SMs::Calc::SM::on::operand2::EQUALS::[else]} - else { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &error_s, // target state - { - &error_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::on::error} ................................................ -QP::QMState const Calc::error_s = { - &Calc::on_s, // superstate - &Calc::error, - &Calc::error_e, - &Calc::error_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::on::error} -QM_ACTION_DEF(Calc, error_e) { - BSP_message("error-ENTRY;"); - return qm_entry(&error_s); -} -//${SMs::Calc::SM::on::error} -QM_ACTION_DEF(Calc, error_x) { - BSP_message("error-EXIT;"); - return qm_exit(&error_s); -} -//${SMs::Calc::SM::on::error} -QM_STATE_DEF(Calc, error) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::final} .................................................... -QP::QMState const Calc::final_s = { - QM_STATE_NULL, // superstate (top) - &Calc::final, - &Calc::final_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::final} -QM_ACTION_DEF(Calc, final_e) { - BSP_message("final-ENTRY;"); - BSP_exit(); - return qm_entry(&final_s); -} -//${SMs::Calc::SM::final} -QM_STATE_DEF(Calc, final) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::operand} .................................................. -//${SMs::Calc::SM::operand} -QP::QMState const Calc::operand_s = { - QM_STATE_NULL, // superstate unused - &Calc::operand, - &Calc::operand_e, - &Calc::operand_x, - &Calc::operand_i -}; -//${SMs::Calc::SM::operand} -QM_ACTION_DEF(Calc, operand_e) { - BSP_message("operand-ENTRY;"); - return qm_entry(&operand_s); -} -//${SMs::Calc::SM::operand} -QM_ACTION_DEF(Calc, operand_x) { - BSP_message("operand-EXIT;"); - return qm_sm_exit(&sub_operand->super); -} -//${SMs::Calc::SM::operand::initial} -QM_ACTION_DEF(Calc, operand_i) { - //${SMs::Calc::SM::operand::initial} - BSP_message("operand-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &operand_zero_s, // target state - { - &operand_zero_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::Calc::SM::operand} -QM_STATE_DEF(Calc, operand) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::operand::CE} - case CE_SIG: { - BSP_message("operand::CE;"); - BSP_clear(); - static QP::QMTranActTable const tatbl_ = { // tran-action table - &operand_s, // target submachine - { - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_xp(sub_operand->CE, &tatbl_); - break; - } - default: { - status_ = qm_super_sub(&sub_operand->super); - break; - } - } - return status_; -} -//${SMs::Calc::SM::operand::EP-zero} -QM_ACTION_DEF(Calc, operand_zero_ep) { - BSP_message("operand::EP-zero;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &operand_zero_s, // target state - { - &operand_zero_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_ep(&tatbl_); -} -//${SMs::Calc::SM::operand::EP-intgr} -QM_ACTION_DEF(Calc, operand_intgr_ep) { - BSP_message("operand::EP-intgr;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &operand_intgr_s, // target state - { - &operand_intgr_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_ep(&tatbl_); -} -//${SMs::Calc::SM::operand::EP-frac} -QM_ACTION_DEF(Calc, operand_frac_ep) { - BSP_message("operand::EP-frac;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &operand_frac_s, // target state - { - &operand_frac_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_ep(&tatbl_); -} -//${SMs::Calc::SM::operand::EP-neg} -QM_ACTION_DEF(Calc, operand_neg_ep) { - BSP_message("operand::EP-neg;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &operand_neg_s, // target state - { - &operand_neg_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_ep(&tatbl_); -} - -//${SMs::Calc::SM::operand::zero} ............................................ -QP::QMState const Calc::operand_zero_s = { - &Calc::operand_s, // superstate - &Calc::operand_zero, - &Calc::operand_zero_e, - &Calc::operand_zero_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::operand::zero} -QM_ACTION_DEF(Calc, operand_zero_e) { - BSP_message("operand::zero-ENTRY;"); - return qm_entry(&operand_zero_s); -} -//${SMs::Calc::SM::operand::zero} -QM_ACTION_DEF(Calc, operand_zero_x) { - BSP_message("operand::zero-EXIT;"); - return qm_exit(&operand_zero_s); -} -//${SMs::Calc::SM::operand::zero} -QM_STATE_DEF(Calc, operand_zero) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::operand::zero::DIGIT_0} - case DIGIT_0_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::operand::zero::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_intgr_s, // target state - { - &operand_zero_x, // exit - &operand_intgr_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::operand::zero::POINT} - case POINT_SIG: { - BSP_insert((int)'0'); - BSP_insert((int)'.'); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_frac_s, // target state - { - &operand_zero_x, // exit - &operand_frac_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::operand::intgr} ........................................... -QP::QMState const Calc::operand_intgr_s = { - &Calc::operand_s, // superstate - &Calc::operand_intgr, - &Calc::operand_intgr_e, - &Calc::operand_intgr_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::operand::intgr} -QM_ACTION_DEF(Calc, operand_intgr_e) { - BSP_message("operand::intgr-ENTRY;"); - return qm_entry(&operand_intgr_s); -} -//${SMs::Calc::SM::operand::intgr} -QM_ACTION_DEF(Calc, operand_intgr_x) { - BSP_message("operand::intgr-EXIT;"); - return qm_exit(&operand_intgr_s); -} -//${SMs::Calc::SM::operand::intgr} -QM_STATE_DEF(Calc, operand_intgr) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::operand::intgr::POINT} - case POINT_SIG: { - BSP_insert((int)'.'); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_frac_s, // target state - { - &operand_intgr_x, // exit - &operand_frac_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::operand::intgr::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::operand::frac} ............................................ -QP::QMState const Calc::operand_frac_s = { - &Calc::operand_s, // superstate - &Calc::operand_frac, - &Calc::operand_frac_e, - &Calc::operand_frac_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::operand::frac} -QM_ACTION_DEF(Calc, operand_frac_e) { - BSP_message("operand::frac-ENTRY;"); - return qm_entry(&operand_frac_s); -} -//${SMs::Calc::SM::operand::frac} -QM_ACTION_DEF(Calc, operand_frac_x) { - BSP_message("operand::frac-EXIT;"); - return qm_exit(&operand_frac_s); -} -//${SMs::Calc::SM::operand::frac} -QM_STATE_DEF(Calc, operand_frac) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::operand::frac::POINT} - case POINT_SIG: { - ; - status_ = Q_RET_HANDLED; - break; - } - //${SMs::Calc::SM::operand::frac::DIGIT_0, DIGIT_1_9} - case DIGIT_0_SIG: // intentionally fall through - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::Calc::SM::operand::neg} ............................................. -QP::QMState const Calc::operand_neg_s = { - &Calc::operand_s, // superstate - &Calc::operand_neg, - &Calc::operand_neg_e, - &Calc::operand_neg_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::Calc::SM::operand::neg} -QM_ACTION_DEF(Calc, operand_neg_e) { - BSP_message("operand::neg-ENTRY;"); - BSP_negate(); - return qm_entry(&operand_neg_s); -} -//${SMs::Calc::SM::operand::neg} -QM_ACTION_DEF(Calc, operand_neg_x) { - BSP_message("operand::neg-EXIT;"); - return qm_exit(&operand_neg_s); -} -//${SMs::Calc::SM::operand::neg} -QM_STATE_DEF(Calc, operand_neg) { - QP::QState status_; - switch (e->sig) { - //${SMs::Calc::SM::operand::neg::DIGIT_0} - case DIGIT_0_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_zero_s, // target state - { - &operand_neg_x, // exit - &operand_zero_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::operand::neg::DIGIT_1_9} - case DIGIT_1_9_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_intgr_s, // target state - { - &operand_neg_x, // exit - &operand_intgr_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::operand::neg::POINT} - case POINT_SIG: { - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &operand_frac_s, // target state - { - &operand_neg_x, // exit - &operand_frac_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::Calc::SM::operand::neg::OPER} - case OPER_SIG: { - //${SMs::Calc::SM::operand::neg::OPER::[e->key=='-']} - if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) { - ; - status_ = Q_RET_HANDLED; - } - //${SMs::Calc::SM::operand::neg::OPER::[else]} - else { - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} -//$enddef${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/calc_sub/calc_sub.hpp b/examples/posix-win32/calc_sub/calc_sub.hpp deleted file mode 100644 index 3c0121db8..000000000 --- a/examples/posix-win32/calc_sub/calc_sub.hpp +++ /dev/null @@ -1,68 +0,0 @@ -//$file${.::calc_sub.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: calc_sub.qm -// File: ${.::calc_sub.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::calc_sub.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef CALC_SUB_HPP_ -#define CALC_SUB_HPP_ - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -//$declare${Events::CalcEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::CalcEvt} ......................................................... -class CalcEvt : public QP::QEvt { -public: - std::uint8_t key_code; - -public: - CalcEvt( - QP::QSignal sig, - std::uint8_t kc) - : QEvt(sig), - key_code(kc) - {} -}; // class CalcEvt -//$enddecl${Events::CalcEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::the_calc} ........................................................... -extern QP::QAsm * const the_calc; -//$enddecl${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // CALC_SUB_HPP_ diff --git a/examples/posix-win32/calc_sub/calc_sub.qm b/examples/posix-win32/calc_sub/calc_sub.qm deleted file mode 100644 index 07fa445ff..000000000 --- a/examples/posix-win32/calc_sub/calc_sub.qm +++ /dev/null @@ -1,656 +0,0 @@ - - - The improved Calculator model with QMsm state machine implementation strategy and Sub-Machines. - - - - - - - - - - - - - - - : QEvt(sig), - key_code(kc) - - - - - - - - Calculator state machine - - - the single inst of the Calc class - - - - - - - - - - - - constructor - : QMsm(&initial) - - - - // guard function to evaluate the current expression -// taking into account the precedence of operands. -// return: true if evaluation successful -// false when error encountered - - - - - double result; -if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) { - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { /* no op2 yet */ - m_op2 = op; - m_oper2 = oper; - break; - } - } - switch (m_oper1) { - case KEY_PLUS: { - m_op1 += m_op2; - break; - } - case KEY_MINUS: { - m_op1 -= m_op2; - break; - } - case KEY_MULT: { - m_op1 *= m_op2; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < m_op2) && (m_op2 < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op1 /= m_op2; - break; - } - default: { - Q_ERROR(); - break; - } - } - m_oper1 = oper; - m_oper2 = KEY_NULL; - result = m_op1; -} -else { // (oper == KEY_MULT) || (oper == KEY_DIV) - switch (m_oper2) { - case KEY_MULT: { - m_op2 *= op; - break; - } - case KEY_DIVIDE: { - if ((-1e-30 < op) && (op < 1e-30)) { - BSP_display_error(" Error 0 "); // divide by zero - return false; - } - m_op2 /= op; - break; - } - default: { // oper2 not provided yet - m_op2 = op; - break; - } - } - m_oper2 = oper; - result = m_op2; -} - -if ((result < -99999999.0) || (99999999.0 < result)) { - BSP_display_error(" Error 1 "); // out of range - return false; -} -if ((-0.0000001 < result) && (result < 0.0000001)) { - result = 0.0; -} -BSP_display(result); - -return true; - - - - - - BSP_clear(); -(void)e; // unused parameter - - - - - - - BSP_message("on-ENTRY;"); - BSP_message("on-EXIT;"); - - - BSP_message("on-INIT;"); - - - - - - - BSP_clear(); - - - - - - - - - - - - - BSP_message("ready-ENTRY;"); -m_oper2 = KEY_NULL; - BSP_message("ready-EXIT;"); - - - BSP_message("ready-INIT;"); - - - - - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - m_op1 = BSP_get_value(); -m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - - - - - - BSP_message("result-ENTRY;"); - BSP_message("result-EXIT;"); - - - - - - - - BSP_message("begin-ENTRY;"); - BSP_message("begin-EXIT;"); - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - - - - - - - - BSP_message("operand1:XP-CE;"); - - - - - - - m_op1 = BSP_get_value(); -m_oper1 = Q_EVT_CAST(CalcEvt)->key_code; - - - - - - - - - - - - - - - BSP_message("opEntered-ENTRY;"); - BSP_message("opEntered-EXIT;"); - - - BSP_clear(); - - - - - - - BSP_clear(); -BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_clear(); -BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - - - - - - - else - - - - - - - - - - - - - - - - - - BSP_message("operand2:XP-CE;"); - - - - - - - - - else - - - - - - - eval(BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code) - - - - - - - - - - - - - else - - - - - - - eval(BSP_get_value(), KEY_NULL) - - - - - - - - - - - - - BSP_message("error-ENTRY;"); - BSP_message("error-EXIT;"); - - - - - - - - - - - - - BSP_message("final-ENTRY;"); -BSP_exit(); - - - - - - - BSP_message("operand-ENTRY;"); - BSP_message("operand-EXIT;"); - - - BSP_message("operand::EP-zero;"); - - - - - - - - BSP_message("operand::EP-intgr;"); - - - - - - - - BSP_message("operand::EP-frac;"); - - - - - - - - BSP_message("operand::EP-neg;"); - - - - - - - - - - - - - - BSP_message("operand-INIT;"); - - - - - - - BSP_message("operand::CE;"); -BSP_clear(); - - - - - - - BSP_message("operand::zero-ENTRY;"); - BSP_message("operand::zero-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert((int)'0'); -BSP_insert((int)'.'); - - - - - - - - - - - - BSP_message("operand::intgr-ENTRY;"); - BSP_message("operand::intgr-EXIT;"); - - - BSP_insert((int)'.'); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("operand::frac-ENTRY;"); - BSP_message("operand::frac-EXIT;"); - - - ; - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - - - - BSP_message("operand::neg-ENTRY;"); -BSP_negate(); - BSP_message("operand::neg-EXIT;"); - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); - - - - - - - - - else - - - - - - - Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS - ; - - - - - - - - - - - - - - - - - - - - - - - - opaque pointer to the Calc state machine - = &Calc::inst; - - - - - - - #ifndef CALC_SUB_HPP_ -#define CALC_SUB_HPP_ - -enum CalcSignals { - C_SIG = QP::Q_USER_SIG, - CE_SIG, - DIGIT_0_SIG, - DIGIT_1_9_SIG, - POINT_SIG, - OPER_SIG, - EQUALS_SIG, - OFF_SIG -}; - -$declare${Events::CalcEvt} - -$declare${SMs::the_calc} - -#endif // CALC_SUB_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ API -#include "bsp.hpp" // board support package -#include "calc_sub.hpp" // application - -Q_DEFINE_THIS_FILE - -#define KEY_NULL '\0' -#define KEY_PLUS '+' -#define KEY_MINUS '-' -#define KEY_MULT '*' -#define KEY_DIVIDE '/' - -$declare${SMs::Calc} - -$define${SMs::the_calc} -$define${SMs::Calc} - - - diff --git a/examples/posix-win32/calc_sub/lint-plus/README.txt b/examples/posix-win32/calc_sub/lint-plus/README.txt deleted file mode 100644 index f4869b162..000000000 --- a/examples/posix-win32/calc_sub/lint-plus/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -About this Example -================== -This directory contains the facilities for "linting" the application with -PC-Lint-Plus. - -To "lint" the application, invoke the batch "lin.bat" without parameters. -Optionally, you can supply the parameter -dQ_SPY to include the QS -instrumentation in the "linting" process. - -The output from the "linting" is saved in the file "lin_out.log". - -*** -NOTE: You need to adjust the symbol PCLP_DIR at the top of the lin.bat -file, to point to the directory where PC-Lint-Plus is installed on your -machine. -*** - - -The PC-Lint-Plus Options File -============================= -The "options.lnt" file specifies the linting options. You might need -to modify this file to suit your needs. - - -**** -NOTE: The purpose of this example is NOT to find problems with the -supporting 3rd-party code, which every non-trivial embedded system needs. -Rather, the purpose of this particular example is to check YOUR application -level code, such as state machines. -**** diff --git a/examples/posix-win32/calc_sub/lint-plus/lin.bat b/examples/posix-win32/calc_sub/lint-plus/lin.bat deleted file mode 100644 index 4cbefe73c..000000000 --- a/examples/posix-win32/calc_sub/lint-plus/lin.bat +++ /dev/null @@ -1,73 +0,0 @@ -@echo off -:: =========================================================================== -:: Product: QP/C++ build script for PC-Lint-Plus -:: Last Updated for Version: 6.8.0 -:: Date of the Last Update: 2020-01-26 -:: -:: Q u a n t u m L e a P s -:: ------------------------ -:: Modern Embedded Software -:: -:: Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -:: -:: This program is open source software: you can redistribute it and/or -:: modify it under the terms of the GNU General Public License as published -:: by the Free Software Foundation, either version 3 of the License, or -:: (at your option) any later version. -:: -:: Alternatively, this program may be distributed and modified under the -:: terms of Quantum Leaps commercial licenses, which expressly supersede -:: the GNU General Public License and are specifically designed for -:: licensees interested in retaining the proprietary status of their code. -:: -:: This program is distributed in the hope that it will be useful, -:: but WITHOUT ANY WARRANTY; without even the implied warranty of -:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -:: GNU General Public License for more details. -:: -:: You should have received a copy of the GNU General Public License -:: along with this program. If not, see . -:: -:: Contact information: -:: -:: -:: =========================================================================== -@setlocal - -:: usage of lin.bat -@echo Usage: lin [16bit] [-d...] [files...] -@echo examples: -@echo lin ..\table.cpp : use 32bit CPU (default) for linting ..\table.cpp -@echo lin 16bit -dQ_SPY ..\philo.cpp : use 16bit CPU and define Q_SPY for linting ..\philo.cpp -@echo lin ..\philo.cpp ..\table.cpp : use 32bit CPU for linting ..\philo.c and ..\table.cpp -@echo. - -:: NOTE: adjust to for your installation directory of PC-Lint-Plus -@set PCLP=C:\tools\lint-plus\windows\pclp32.exe - -if NOT exist "%PCLP%" ( - @echo The PC-Lint-Plus toolset not found. Please adjust lin.bat - @goto end -) - -:: set the QP/C++ directory -set QPCPP=..\..\..\.. -set QPCPP_LINT=%QPCPP%\ports\lint-plus - -if "%1"=="16bit" ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\16bit options.lnt %2 %3 %4 %5 %6 %7 %8 - @echo 16bit CPU -) else ( - set LINTFLAGS=%QPCPP_LINT%\std.lnt -i%QPCPP_LINT%\32bit options.lnt %1 %2 %3 %4 %6 %7 %8 - @echo 32bit CPU (default) -) - -:: cleanup -@del *.log - - -:: linting ------------------------------------------------------------------- -%PCLP% -os(lint_out.log) %LINTFLAGS% - -:end -@endlocal diff --git a/examples/posix-win32/calc_sub/lint-plus/options.lnt b/examples/posix-win32/calc_sub/lint-plus/options.lnt deleted file mode 100644 index e4803831e..000000000 --- a/examples/posix-win32/calc_sub/lint-plus/options.lnt +++ /dev/null @@ -1,67 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Product: PC-Lint-Plus options for linting QP/C++ applications -// Last updated for version 6.8.0 -// Last updated on 2020-01-27 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//////////////////////////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////////////////////// -// general options --unit_check // perform only subset check (suppresses Global Wrapup) --max_threads=1 // suppress message "no '-max_threads=N' option" -//-vf // print names of all source files (for debugging linting) - -// include directories --i.. // application includes --i%QPCPP%\include // QP/C++ public includes --i%QPCPP_LINT% // QP/C++ lint "port" --i%QPCPP_LINT%\qk // QP/C++ lint "port" to QK - -// standards -%QPCPP_LINT%\au-autosar.lnt // AUTOSAR-C++:2014 -%QPCPP_LINT%\au-ds.lnt // Dan Saks recommendations -//-strong(AXJ) // Strong type checking - -// size/alignment options (included from %QPCPP_LINT%\??bit\) -cpu.lnt // for the chosen CPU - -///////////////////////////////////////////////////////////////////////////// -// QP/C++ options for clients -qpcpp.lnt // QP/C++ options - -///////////////////////////////////////////////////////////////////////////// -// additional suppression rules for building this application - -// underlying type for enums is always 'int' -+fei - -// local struct member not referenced --esym(754, - Calc::*) diff --git a/examples/posix-win32/calc_sub/main.cpp b/examples/posix-win32/calc_sub/main.cpp deleted file mode 100644 index d877ba2f0..000000000 --- a/examples/posix-win32/calc_sub/main.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//============================================================================ -// Product: Calculator Example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ API -#include "bsp.hpp" // board support package -#include "calc_sub.hpp" // application - -#include - -using namespace QP; -using namespace std; - -//............................................................................ -int main() { - - QF::init(); - QF::onStartup(); - - cout << "Calculator example, QEP version: " - << QP_VERSION_STR << endl - << "Press '0' .. '9' to enter a digit\n" - "Press '.' to enter the decimal point\n" - "Press '+' or '#' to add\n" - "Press '-' to subtract or negate a number\n" - "Press '*' to multiply\n" - "Press '/' to divide\n" - "Press '=' or to get the result\n" - "Press 'c' or 'C' to Cancel\n" - "Press 'e' or 'E' to Cancel Entry\n" - "Press to quit.\n\n"; - - the_calc->init(0U); // trigger initial transition - - for (;;) { // event loop - - BSP_show_display(); // show the display - cout << ": "; - - std::uint8_t key_code = - static_cast(QF::consoleWaitForKey()); - cout << static_cast(key_code) << ' '; - - QSignal sig = 0U; - switch (key_code) { - case 'c': // intentionally fall through - case 'C': { - sig = C_SIG; - break; - } - case 'e': // intentionally fall through - case 'E': { - sig = CE_SIG; - break; - } - case '0': { - sig = DIGIT_0_SIG; - break; - } - case '1': // intentionally fall through - case '2': // intentionally fall through - case '3': // intentionally fall through - case '4': // intentionally fall through - case '5': // intentionally fall through - case '6': // intentionally fall through - case '7': // intentionally fall through - case '8': // intentionally fall through - case '9': { - sig = DIGIT_1_9_SIG; - break; - } - case '.': { - sig = POINT_SIG; - break; - } - case '+': // intentionally fall through - case '-': // intentionally fall through - case '*': // intentionally fall through - case '/': { - sig = OPER_SIG; - break; - } - case '#': { // alternative '+' - sig = OPER_SIG; - key_code = '+'; - break; - } - case '=': // intentionally fall through - case '\r': { // Enter key - sig = EQUALS_SIG; - break; - } - case '\33': { // ESC key - sig = OFF_SIG; - break; - } - default: { - sig = 0U; // invalid event - break; - } - } - - if (sig != 0) { // valid event generated? - CalcEvt const calc_evt(sig, key_code); - the_calc->dispatch(&calc_evt, 0U); // dispatch event - } - } - - QF::onCleanup(); - return 0; -} diff --git a/examples/posix-win32/comp/Makefile b/examples/posix-win32/comp/Makefile deleted file mode 100644 index 6c6dcb623..000000000 --- a/examples/posix-win32/comp/Makefile +++ /dev/null @@ -1,292 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := comp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - alarm.cpp \ - clock.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/comp/alarm.cpp b/examples/posix-win32/comp/alarm.cpp deleted file mode 100644 index 00882279e..000000000 --- a/examples/posix-win32/comp/alarm.cpp +++ /dev/null @@ -1,162 +0,0 @@ -//$file${.::alarm.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: comp.qm -// File: ${.::alarm.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::alarm.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "alarm.hpp" -#include "clock.hpp" - -Q_DEFINE_THIS_FILE - -// Alarm component -------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Components::Alarm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::Alarm} ....................................................... - -//${Components::Alarm::Alarm} ................................................ -Alarm::Alarm() - : QHsm(Q_STATE_CAST(&Alarm::initial)) -{} - -//${Components::Alarm::SM} ................................................... -Q_STATE_DEF(Alarm, initial) { - //${Components::Alarm::SM::initial} - m_alarm_time = 12U*60U; - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Alarm::off); - QS_FUN_DICTIONARY(&Alarm::on); - - return tran(&off); -} - -//${Components::Alarm::SM::off} .............................................. -Q_STATE_DEF(Alarm, off) { - QP::QState status_; - switch (e->sig) { - //${Components::Alarm::SM::off} - case Q_ENTRY_SIG: { - // while in the off state, the alarm is kept in decimal format - m_alarm_time = (m_alarm_time/60)*100 + m_alarm_time%60; - BSP_showTime24H("*** Alarm OFF ", m_alarm_time, 100U); - status_ = Q_RET_HANDLED; - break; - } - //${Components::Alarm::SM::off} - case Q_EXIT_SIG: { - // upon exit, the alarm is converted to binary format - m_alarm_time = (m_alarm_time/100U)*60U + m_alarm_time%100U; - status_ = Q_RET_HANDLED; - break; - } - //${Components::Alarm::SM::off::ALARM_ON} - case ALARM_ON_SIG: { - //${Components::Alarm::SM::off::ALARM_ON::[alarminrange?]} - if ((m_alarm_time / 100U < 24U) - && (m_alarm_time % 100U < 60U)) - { - status_ = tran(&on); - } - //${Components::Alarm::SM::off::ALARM_ON::[else]} - else { - m_alarm_time = 0U; - BSP_showTime24H("*** Alarm reset", m_alarm_time, 100U); - status_ = Q_RET_HANDLED; - } - break; - } - //${Components::Alarm::SM::off::ALARM_SET} - case ALARM_SET_SIG: { - // while setting, the alarm is kept in decimal format - m_alarm_time = - (10U * m_alarm_time + Q_EVT_CAST(SetEvt)->digit) % 10000U; - BSP_showTime24H("*** Alarm reset ", m_alarm_time, 100U); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Components::Alarm::SM::on} ............................................... -Q_STATE_DEF(Alarm, on) { - QP::QState status_; - switch (e->sig) { - //${Components::Alarm::SM::on} - case Q_ENTRY_SIG: { - BSP_showTime24H("*** Alarm ON ", m_alarm_time, 60U); - status_ = Q_RET_HANDLED; - break; - } - //${Components::Alarm::SM::on::ALARM_OFF} - case ALARM_OFF_SIG: { - status_ = tran(&off); - break; - } - //${Components::Alarm::SM::on::ALARM_SET} - case ALARM_SET_SIG: { - BSP_showMsg("*** Cannot set Alarm when it is ON"); - status_ = Q_RET_HANDLED; - break; - } - //${Components::Alarm::SM::on::TIME} - case TIME_SIG: { - //${Components::Alarm::SM::on::TIME::[Q_EVT_CAST(TimeEvt)->current_ti~} - if (Q_EVT_CAST(TimeEvt)->current_time == m_alarm_time) { - BSP_showMsg("ALARM!!!"); - - // asynchronously post the event to the container AO - APP_alarmClock->POST(Q_NEW(QEvt, ALARM_SIG), this); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${Components::Alarm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/comp/alarm.hpp b/examples/posix-win32/comp/alarm.hpp deleted file mode 100644 index 973cc432c..000000000 --- a/examples/posix-win32/comp/alarm.hpp +++ /dev/null @@ -1,51 +0,0 @@ -//$file${.::alarm.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: comp.qm -// File: ${.::alarm.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::alarm.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef ALARM_HPP -#define ALARM_HPP - -//$declare${Components::Alarm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::Alarm} ....................................................... -class Alarm : public QP::QHsm { -private: - uint32_t m_alarm_time; - -public: - Alarm(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; // class Alarm -//$enddecl${Components::Alarm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // ALARM_HPP diff --git a/examples/posix-win32/comp/bsp.cpp b/examples/posix-win32/comp/bsp.cpp deleted file mode 100644 index 7ee0230c7..000000000 --- a/examples/posix-win32/comp/bsp.cpp +++ /dev/null @@ -1,132 +0,0 @@ -//============================================================================ -// Product: Console-based BSP -// Last Updated for Version: 6.3.6 -// Date of the Last Update: 2018-10-14 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2018 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "clock.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace std; -using namespace QP; - -//............................................................................ -void BSP_init(int /*argc*/, char * /*argv*/[]) { -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case 'o': { // 'o': Alarm on event? - APP_alarmClock->POST(Q_NEW(QEvt, ALARM_ON_SIG), nullptr); - break; - } - case 'f': { // 'f': Alarm off event? - APP_alarmClock->POST(Q_NEW(QEvt, ALARM_OFF_SIG), nullptr); - break; - } - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - SetEvt *e = Q_NEW(SetEvt, ALARM_SET_SIG); - e->digit = (uint8_t)(key - '0'); - APP_alarmClock->POST(e, nullptr); - break; - } - case '0': { - SetEvt *e = Q_NEW(SetEvt, ALARM_SET_SIG); - e->digit = 0; - APP_alarmClock->POST(e, nullptr); - break; - } - case 'a': { // 'a': Clock 12H event? - APP_alarmClock->POST(Q_NEW(QEvt, CLOCK_12H_SIG), nullptr); - break; - } - case 'b': { // 'b': Clock 24H event? - APP_alarmClock->POST(Q_NEW(QEvt, CLOCK_24H_SIG), nullptr); - break; - } - case '\33': { // ESC pressed? - APP_alarmClock->POST(Q_NEW(QEvt, TERMINATE_SIG), nullptr); - break; - } - } -} -//............................................................................ -void BSP_showMsg(char const *str) { - PRINTF_S("%s\n", str); - fflush(stdout); -} -//............................................................................ -void BSP_showTime24H(char const *str, uint32_t time, uint32_t base) { - PRINTF_S("%s %02d:%02d\n", str, (int)(time / base), (int)(time % base)); - fflush(stdout); -} -//............................................................................ -void BSP_showTime12H(char const *str, uint32_t time, uint32_t base) { - uint32_t h = time / base; - - PRINTF_S("%s %02d:%02d %s\n", str, (h % 12) ? (h % 12) : 12, - time % base, (h / 12) ? "PM" : "AM"); - fflush(stdout); -} -//............................................................................ -void QF::onStartup(void) { - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate - QF::consoleSetup(); -} -//............................................................................ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -//............................................................................ -void QP::QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, &l_clock_tick); // perform the QF clock tick processing - int key = QF::consoleGetKey(); - if (key != 0) { /* any key pressed? */ - BSP_onKeyboardInput((uint8_t)key); - } -} -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - FPRINTF_S(stderr, "Assertion failed in %s at %d\n", file, line); - exit(-1); - -} diff --git a/examples/posix-win32/comp/bsp.hpp b/examples/posix-win32/comp/bsp.hpp deleted file mode 100644 index d0e2e9d42..000000000 --- a/examples/posix-win32/comp/bsp.hpp +++ /dev/null @@ -1,46 +0,0 @@ -//============================================================================ -// Product: Orthogonal Component with QM state pattern example -// Last Updated for Version: 5.4.0 -// Date of the Last Update: 2015-05-14 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -void BSP_init(int argc, char *argv[]); -void BSP_onKeyboardInput(uint8_t key); /* process the keyboard scan code */ - -#define BSP_TICKS_PER_SEC 100U - -void BSP_showMsg(char const *str); -void BSP_showTime12H(char const *str, uint32_t time, uint32_t base); -void BSP_showTime24H(char const *str, uint32_t time, uint32_t base); - -#endif // BSP_HPP diff --git a/examples/posix-win32/comp/clock.cpp b/examples/posix-win32/comp/clock.cpp deleted file mode 100644 index 43a4879c4..000000000 --- a/examples/posix-win32/comp/clock.cpp +++ /dev/null @@ -1,253 +0,0 @@ -//$file${.::clock.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: comp.qm -// File: ${.::clock.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::clock.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "alarm.hpp" -#include "clock.hpp" - -#include "safe_std.h" // portable "safe" / facilities - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -//$declare${Components::AlarmClock} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::AlarmClock} .................................................. -class AlarmClock : public QP::QActive { -private: - uint32_t m_current_time; - Alarm m_alarm; - -public: - QTimeEvt m_timeEvt; - -public: - AlarmClock(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(timekeeping); - Q_STATE_DECL(mode24h); - Q_STATE_DECL(mode12h); - Q_STATE_DECL(final); -}; // class AlarmClock -//$enddecl${Components::AlarmClock} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Local objects ------------------------------------------------------------- -static AlarmClock l_alarmClock; // the single instance of the AO - -// Global-scope objects ------------------------------------------------------ -QActive * const APP_alarmClock = &l_alarmClock; // "opaque" AO pointer - -//............................................................................ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Components::AlarmClock} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::AlarmClock} .................................................. - -//${Components::AlarmClock::AlarmClock} ...................................... -AlarmClock::AlarmClock() -: QActive(Q_STATE_CAST(&AlarmClock::initial)), - m_alarm(), // orthogonal component ctor - m_timeEvt(this, TICK_SIG, 0U) -{} - -//${Components::AlarmClock::SM} .............................................. -Q_STATE_DEF(AlarmClock, initial) { - //${Components::AlarmClock::SM::initial} - (void)e; // unused parameter - m_current_time = 0U; - - // (!) trigger the initial transition in the component - m_alarm.init(m_prio); - - QS_FUN_DICTIONARY(&AlarmClock::timekeeping); - QS_FUN_DICTIONARY(&AlarmClock::mode24h); - QS_FUN_DICTIONARY(&AlarmClock::mode12h); - QS_FUN_DICTIONARY(&AlarmClock::final); - - return tran(&timekeeping); -} - -//${Components::AlarmClock::SM::timekeeping} ................................. -Q_STATE_DEF(AlarmClock, timekeeping) { - QP::QState status_; - switch (e->sig) { - //${Components::AlarmClock::SM::timekeeping} - case Q_ENTRY_SIG: { - // periodic timeout every second - m_timeEvt.armX(BSP_TICKS_PER_SEC, BSP_TICKS_PER_SEC); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping::initial} - case Q_INIT_SIG: { - status_ = tran(&mode24h); - break; - } - //${Components::AlarmClock::SM::timekeeping::CLOCK_24H} - case CLOCK_24H_SIG: { - status_ = tran(&mode24h); - break; - } - //${Components::AlarmClock::SM::timekeeping::CLOCK_12H} - case CLOCK_12H_SIG: { - status_ = tran(&mode12h); - break; - } - //${Components::AlarmClock::SM::timekeeping::ALARM} - case ALARM_SIG: { - BSP_showMsg("Wake up!!!"); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping::ALARM_SET, ALARM_ON, ALARM_OFF} - case ALARM_SET_SIG: // intentionally fall through - case ALARM_ON_SIG: // intentionally fall through - case ALARM_OFF_SIG: { - // (!) synchronously dispatch to the orthogonal component - m_alarm.dispatch(e, m_prio); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping::TERMINATE} - case TERMINATE_SIG: { - BSP_showMsg("--> final"); - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Components::AlarmClock::SM::timekeeping::mode24h} ........................ -Q_STATE_DEF(AlarmClock, mode24h) { - QP::QState status_; - switch (e->sig) { - //${Components::AlarmClock::SM::timekeeping::mode24h} - case Q_ENTRY_SIG: { - BSP_showMsg("*** 24-hour mode"); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping::mode24h::TICK} - case TICK_SIG: { - // roll over in 24-hr mode? - if (++m_current_time == 24U*60U) { - m_current_time = 0U; - } - BSP_showTime24H("", m_current_time, 60U); - - // temporary synchronous event for the component - TimeEvt const pe(TIME_SIG, m_current_time); - - // (!) synchronously dispatch to the orthogonal component - m_alarm.dispatch(&pe, m_prio); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&timekeeping); - break; - } - } - return status_; -} - -//${Components::AlarmClock::SM::timekeeping::mode12h} ........................ -Q_STATE_DEF(AlarmClock, mode12h) { - QP::QState status_; - switch (e->sig) { - //${Components::AlarmClock::SM::timekeeping::mode12h} - case Q_ENTRY_SIG: { - BSP_showMsg("*** 12-hour mode"); - status_ = Q_RET_HANDLED; - break; - } - //${Components::AlarmClock::SM::timekeeping::mode12h::TICK} - case TICK_SIG: { - // roll over in 12-hr mode? - if (++m_current_time == 12U*60U) { - m_current_time = 0U; - } - BSP_showTime12H("", m_current_time, 60U); - - // temporary synchronous event for the component - TimeEvt const pe(TIME_SIG, m_current_time); - - // (!) synchronously dispatch to the orthogonal component - m_alarm.dispatch(&pe, m_prio); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&timekeeping); - break; - } - } - return status_; -} - -//${Components::AlarmClock::SM::final} ....................................... -Q_STATE_DEF(AlarmClock, final) { - QP::QState status_; - switch (e->sig) { - //${Components::AlarmClock::SM::final} - case Q_ENTRY_SIG: { - BSP_showMsg("Bye! Bye!"); - QF::stop(); // terminate the application - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${Components::AlarmClock} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/comp/clock.hpp b/examples/posix-win32/comp/clock.hpp deleted file mode 100644 index f56f5a532..000000000 --- a/examples/posix-win32/comp/clock.hpp +++ /dev/null @@ -1,80 +0,0 @@ -//$file${.::clock.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: comp.qm -// File: ${.::clock.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::clock.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef CLOCK_HPP -#define CLOCK_HPP - -using namespace QP; - -enum AlarmClockSignals { - TICK_SIG = Q_USER_SIG, // time tick event - ALARM_SET_SIG, // set the alarm - ALARM_ON_SIG, // turn the alarm on - ALARM_OFF_SIG, // turn the alarm off - ALARM_SIG, // alarm event from Alarm component to AlarmClock container - CLOCK_12H_SIG, // set the clock in 12H mode - CLOCK_24H_SIG, // set the clock in 24H mode - TIME_SIG, // time event sent to Alarm (contains current time) - TERMINATE_SIG // terminate the application -}; - -//$declare${Events::SetEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::SetEvt} .......................................................... -class SetEvt : public QP::QEvt { -public: - uint8_t digit; -}; // class SetEvt -//$enddecl${Events::SetEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$declare${Events::TimeEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::TimeEvt} ......................................................... -class TimeEvt : public QP::QEvt { -public: - std::uint32_t current_time; - -public: - constexpr TimeEvt( - QP::QSignal sig, - std::uint32_t time) - : QEvt(sig), - current_time(time) - {} -}; // class TimeEvt -//$enddecl${Events::TimeEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${Components::APP_alarmClock} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::APP_alarmClock} .............................................. -extern QActive * const APP_alarmClock; -//$enddecl${Components::APP_alarmClock} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // CLOCK_HPP - diff --git a/examples/posix-win32/comp/comp.qm b/examples/posix-win32/comp/comp.qm deleted file mode 100644 index 345c0472a..000000000 --- a/examples/posix-win32/comp/comp.qm +++ /dev/null @@ -1,350 +0,0 @@ - - - Dining Philosopher Problem example - - - - - - - - - - - - - - - - - - - - : QEvt(sig), - current_time(time) - - - - - - - - Alarm "Orthogonal Component" - - - - - : QHsm(Q_STATE_CAST(&Alarm::initial)) - - - - - - m_alarm_time = 12U*60U; -(void)e; // unused parameter - - - - - - - // while in the off state, the alarm is kept in decimal format -m_alarm_time = (m_alarm_time/60)*100 + m_alarm_time%60; -BSP_showTime24H("*** Alarm OFF ", m_alarm_time, 100U); - // upon exit, the alarm is converted to binary format -m_alarm_time = (m_alarm_time/100U)*60U + m_alarm_time%100U; - - - - - (m_alarm_time / 100U < 24U) -&& (m_alarm_time % 100U < 60U) - - - - - - - - m_alarm_time = 0U; -BSP_showTime24H("*** Alarm reset", m_alarm_time, 100U); - - - - - - - - - - - // while setting, the alarm is kept in decimal format -m_alarm_time = - (10U * m_alarm_time + Q_EVT_CAST(SetEvt)->digit) % 10000U; -BSP_showTime24H("*** Alarm reset ", m_alarm_time, 100U); - - - - - - - - - - - - BSP_showTime24H("*** Alarm ON ", m_alarm_time, 60U); - - - - - - - - - BSP_showMsg("*** Cannot set Alarm when it is ON"); - - - - - - - - - Q_EVT_CAST(TimeEvt)->current_time == m_alarm_time - BSP_showMsg("ALARM!!!"); - -// asynchronously post the event to the container AO -APP_alarmClock->POST(Q_NEW(QEvt, ALARM_SIG), this); - - - - - - - - - - - - - - - - - - Alarm clock "Container" - - - - - - - - - : QActive(Q_STATE_CAST(&AlarmClock::initial)), - m_alarm(), // orthogonal component ctor - m_timeEvt(this, TICK_SIG, 0U) - - - - - - (void)e; // unused parameter -m_current_time = 0U; - -// (!) trigger the initial transition in the component -m_alarm.init(m_prio); - - - - - - - // periodic timeout every second -m_timeEvt.armX(BSP_TICKS_PER_SEC, BSP_TICKS_PER_SEC); - m_timeEvt.disarm(); - - - - - - - - - - - - - - - - - - - - - BSP_showMsg("Wake up!!!"); - - - - - - - // (!) synchronously dispatch to the orthogonal component -m_alarm.dispatch(e, m_prio); - - - - - - - BSP_showMsg("--> final"); - - - - - - - BSP_showMsg("*** 24-hour mode"); - - - // roll over in 24-hr mode? -if (++m_current_time == 24U*60U) { - m_current_time = 0U; -} -BSP_showTime24H("", m_current_time, 60U); - -// temporary synchronous event for the component -TimeEvt const pe(TIME_SIG, m_current_time); - -// (!) synchronously dispatch to the orthogonal component -m_alarm.dispatch(&pe, m_prio); - - - - - - - - - - - BSP_showMsg("*** 12-hour mode"); - - - // roll over in 12-hr mode? -if (++m_current_time == 12U*60U) { - m_current_time = 0U; -} -BSP_showTime12H("", m_current_time, 60U); - -// temporary synchronous event for the component -TimeEvt const pe(TIME_SIG, m_current_time); - -// (!) synchronously dispatch to the orthogonal component -m_alarm.dispatch(&pe, m_prio); - - - - - - - - - - - - - - - - BSP_showMsg("Bye! Bye!"); -QF::stop(); // terminate the application - - - - - - - - - - Opaque pointer to the single instance of the AlarmClock AO - - - - - - - #ifndef ALARM_HPP -#define ALARM_HPP - -$declare(Components::Alarm) - -#endif // ALARM_HPP - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "alarm.hpp" -#include "clock.hpp" - -Q_DEFINE_THIS_FILE - -// Alarm component -------------------- -$define(Components::Alarm) - - - - #ifndef CLOCK_HPP -#define CLOCK_HPP - -using namespace QP; - -enum AlarmClockSignals { - TICK_SIG = Q_USER_SIG, // time tick event - ALARM_SET_SIG, // set the alarm - ALARM_ON_SIG, // turn the alarm on - ALARM_OFF_SIG, // turn the alarm off - ALARM_SIG, // alarm event from Alarm component to AlarmClock container - CLOCK_12H_SIG, // set the clock in 12H mode - CLOCK_24H_SIG, // set the clock in 24H mode - TIME_SIG, // time event sent to Alarm (contains current time) - TERMINATE_SIG // terminate the application -}; - -$declare(Events::SetEvt) -$declare(Events::TimeEvt) - -$declare(Components::APP_alarmClock) - -#endif // CLOCK_HPP - - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "alarm.hpp" -#include "clock.hpp" - -#include "safe_std.h" // portable "safe" <stdio.h>/<string.h> facilities - -Q_DEFINE_THIS_FILE - -// Active object class ------------------------------------------------------- -$declare(Components::AlarmClock) - -// Local objects ------------------------------------------------------------- -static AlarmClock l_alarmClock; // the single instance of the AO - -// Global-scope objects ------------------------------------------------------ -QActive * const APP_alarmClock = &l_alarmClock; // "opaque" AO pointer - -//............................................................................ -$define(Components::AlarmClock) - - - diff --git a/examples/posix-win32/comp/main.cpp b/examples/posix-win32/comp/main.cpp deleted file mode 100644 index fa373a279..000000000 --- a/examples/posix-win32/comp/main.cpp +++ /dev/null @@ -1,70 +0,0 @@ -//============================================================================ -// Product: "Orthogonal Component" state pattern example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "alarm.hpp" -#include "clock.hpp" - -#include "safe_std.h" // portable "safe" / facilities - -//............................................................................ -int main(int argc, char *argv[]) { - static QEvt const *alarmClockQSto[10]; // queue storage for AlarmClock - static QF_MPOOL_EL(TimeEvt) smlPoolSto[10]; // storage for small pool - - - PRINTF_S("Orthogonal Component pattern\nQP version: %s\n" - "Press 'o' to turn the Alarm ON\n" - "Press 'f' to turn the Alarm OFF\n" - "Press '0'..'9' to set the Alarm time\n" - "Press 'a' to set the Clock in 12-hour mode\n" - "Press 'b' to set the Clock in 24-hour mode\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP_init(argc, argv); // initialize the BSP - QF::init(); // initialize the framework and the underlying RT kernel - - // publish-subscribe not used, no call to QActive::psInit() - - // initialize event pools... - QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - APP_alarmClock->start(1U, - alarmClockQSto, Q_DIM(alarmClockQSto), - nullptr, 0); - - return QF::run(); // run the QF application -} diff --git a/examples/posix-win32/defer/Makefile b/examples/posix-win32/defer/Makefile deleted file mode 100644 index 108a24364..000000000 --- a/examples/posix-win32/defer/Makefile +++ /dev/null @@ -1,291 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := defer - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - defer.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/defer/bsp.cpp b/examples/posix-win32/defer/bsp.cpp deleted file mode 100644 index a7aed5d44..000000000 --- a/examples/posix-win32/defer/bsp.cpp +++ /dev/null @@ -1,124 +0,0 @@ -//============================================================================ -// Product: Console-based BSP -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -Q_DEFINE_THIS_FILE - -#ifdef Q_SPY -static std::uint8_t const l_QF::onClockTick = 0; -#endif - -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const module, int_t const loc) { - printf("Assertion failed in %s:%d\n", module, loc); - FPRINTF_S(stderr, "Assertion failed in %s:%d", module, loc); - QP::QF::onCleanup(); - exit(-1); -} - -//............................................................................ -void BSP_init(int argc, char * argv[]) { - Q_UNUSED_PAR(argc); - Q_UNUSED_PAR(argv); - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - QS_OBJ_DICTIONARY(&l_QF::onClockTick); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); -} -//............................................................................ -namespace QP { - -void QF::onStartup(void) { - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate - QF::consoleSetup(); -} -//............................................................................ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -//............................................................................ -void QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, &l_QF::onClockTick); // perform the QF clock tick processing - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output - - int key = QF::consoleGetKey(); - if (key != 0) { /* any key pressed? */ - BSP_onKeyboardInput((uint8_t)key); - } -} - -//............................................................................ -#ifdef Q_XTOR -QP::QTimeEvt::~QTimeEvt() {} -QP::QEQueue::~QEQueue() {} -QP::QMPool::~QMPool() {} -#endif - -//---------------------------------------------------------------------------- -#ifdef Q_SPY - -//............................................................................ -//! callback function to execute a user command (to be implemented in BSP) -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - switch (cmdId) { - case 0U: { - break; - } - default: - break; - } - - // unused parameters - (void)param1; - (void)param2; - (void)param3; -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP diff --git a/examples/posix-win32/defer/bsp.hpp b/examples/posix-win32/defer/bsp.hpp deleted file mode 100644 index 89a86bc75..000000000 --- a/examples/posix-win32/defer/bsp.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//============================================================================ -// Product: Console-based BSP, MinGW -// Last Updated for Version: 5.1.1 -// Date of the Last Update: Oct 09, 2013 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// Quantum Leaps Web sites: http://www.quantum-leaps.com -// https://state-machine.com -// e-mail: info@quantum-leaps.com -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -void BSP_init(int argc, char *argv[]); -void BSP_onKeyboardInput(uint8_t ch); // process the keyboard character - -#define BSP_TICKS_PER_SEC 50U - -#endif // BSP_HPP diff --git a/examples/posix-win32/defer/defer.cpp b/examples/posix-win32/defer/defer.cpp deleted file mode 100644 index b7c043063..000000000 --- a/examples/posix-win32/defer/defer.cpp +++ /dev/null @@ -1,370 +0,0 @@ -//$file${.::defer.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: defer.qm -// File: ${.::defer.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::defer.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities - -Q_DEFINE_THIS_FILE - -//............................................................................ -enum TServerSignals { - NEW_REQUEST_SIG = QP::Q_USER_SIG, // the new request signal - RECEIVED_SIG, // the request has been received - AUTHORIZED_SIG, // the request has been authorized - TERMINATE_SIG // terminate the application -}; -//............................................................................ -//$declare${Events::RequestEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::RequestEvt} ...................................................... -class RequestEvt : public QP::QEvt { -public: - uint8_t ref_num; -}; // class RequestEvt -//$enddecl${Events::RequestEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object class -----------------------------------------------------.. -//$declare${Components::TServer} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::TServer} ..................................................... -class TServer : public QP::QActive { -private: - - // native QF queue for deferred request events - QP::QEQueue m_requestQueue; - - // storage for the deferred queue buffer - QP::QEvt const * m_requestQSto[3]; - - // request event being processed - RequestEvt const * m_activeRequest; - - // private time event generator - QP::QTimeEvt m_receivedEvt; - - // private time event generator - QP::QTimeEvt m_authorizedEvt; - -public: - static TServer inst; - -public: - explicit TServer() noexcept - : QActive(Q_STATE_CAST(&initial)), - m_receivedEvt(this, RECEIVED_SIG), - m_authorizedEvt(this, AUTHORIZED_SIG) - { - m_requestQueue.init(m_requestQSto, Q_DIM(m_requestQSto)); - } - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(idle); - Q_STATE_DECL(busy); - Q_STATE_DECL(receiving); - Q_STATE_DECL(authorizing); - Q_STATE_DECL(final); -}; // class TServer -//$enddecl${Components::TServer} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Components::TServer} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::TServer} ..................................................... -TServer TServer::inst; - -//${Components::TServer::SM} ................................................. -Q_STATE_DEF(TServer, initial) { - //${Components::TServer::SM::initial} - (void)e; // unused parameter - m_activeRequest = nullptr; // no active request yet - - QS_OBJ_DICTIONARY(&TServer::inst); - QS_OBJ_DICTIONARY(&TServer::inst.m_receivedEvt); - QS_OBJ_DICTIONARY(&TServer::inst.m_authorizedEvt); - QS_OBJ_DICTIONARY(&TServer::inst.m_requestQueue); - - QS_FUN_DICTIONARY(&TServer::idle); - QS_FUN_DICTIONARY(&TServer::busy); - QS_FUN_DICTIONARY(&TServer::receiving); - QS_FUN_DICTIONARY(&TServer::authorizing); - QS_FUN_DICTIONARY(&TServer::final); - - return tran(&idle); -} - -//${Components::TServer::SM::idle} ........................................... -Q_STATE_DEF(TServer, idle) { - QP::QState status_; - switch (e->sig) { - //${Components::TServer::SM::idle} - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "idle-ENTRY;"); - - // recall the oldest deferred request... - if (recall(&m_requestQueue)) { - PRINTF_S("%s\n", "Request recalled"); - } - else { - PRINTF_S("%s\n", "No deferred requests"); - } - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::idle::NEW_REQUEST} - case NEW_REQUEST_SIG: { - // create and save a new reference to the request event so that - // this event will be available beyond this RTC step and won't be - // recycled. - Q_NEW_REF(m_activeRequest, RequestEvt); - - PRINTF_S("Processing request #%d\n", - (int)m_activeRequest->ref_num); - status_ = tran(&receiving); - break; - } - //${Components::TServer::SM::idle::TERMINATE} - case TERMINATE_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Components::TServer::SM::busy} ........................................... -Q_STATE_DEF(TServer, busy) { - QP::QState status_; - switch (e->sig) { - //${Components::TServer::SM::busy} - case Q_EXIT_SIG: { - PRINTF_S("busy-EXIT; done processing request #%d\n", - (int)m_activeRequest->ref_num); - - // delete the reference to the active request, because - // it is now processed. - Q_DELETE_REF(m_activeRequest); - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::NEW_REQUEST} - case NEW_REQUEST_SIG: { - // defer the new request event... - if (defer(&m_requestQueue, e)) { - PRINTF_S("Request #%d deferred;\n", - (int)Q_EVT_CAST(RequestEvt)->ref_num); - } - else { // deferred queue full - // option1: ignore the new request and do nothing here - - // option2: - // flush the oldest request to make room for the new one - QP::QEvt const *old_evt = m_requestQueue.get(0U); - Q_ASSERT(old_evt != nullptr); - PRINTF_S("Previous request #%d DISCARDED;\n", - (int)((RequestEvt*)old_evt)->ref_num); - QP::QF::gc(old_evt); // explicitly recycle old - - // repeat the defer request after making room in the queue - if (!defer(&m_requestQueue, e)) { - Q_ERROR(); // now it must succeed - } - } - - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::TERMINATE} - case TERMINATE_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Components::TServer::SM::busy::receiving} ................................ -Q_STATE_DEF(TServer, receiving) { - QP::QState status_; - switch (e->sig) { - //${Components::TServer::SM::busy::receiving} - case Q_ENTRY_SIG: { - // inform about the first stage of processing of the request... - PRINTF_S("receiving-ENTRY; active request: #%d\n", - (int)m_activeRequest->ref_num); - - // one-shot timeout in 1 second - m_receivedEvt.armX(BSP_TICKS_PER_SEC, 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::receiving} - case Q_EXIT_SIG: { - m_receivedEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::receiving::RECEIVED} - case RECEIVED_SIG: { - status_ = tran(&authorizing); - break; - } - default: { - status_ = super(&busy); - break; - } - } - return status_; -} - -//${Components::TServer::SM::busy::authorizing} .............................. -Q_STATE_DEF(TServer, authorizing) { - QP::QState status_; - switch (e->sig) { - //${Components::TServer::SM::busy::authorizing} - case Q_ENTRY_SIG: { - // inform about the second stage of processing of the request.. - PRINTF_S("authorizing-ENTRY; active request: #%d\n", - (int)m_activeRequest->ref_num); - - // one-shot timeout in 2 seconds - m_authorizedEvt.armX(2U*BSP_TICKS_PER_SEC, 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::authorizing} - case Q_EXIT_SIG: { - m_authorizedEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${Components::TServer::SM::busy::authorizing::AUTHORIZED} - case AUTHORIZED_SIG: { - status_ = tran(&idle); - break; - } - default: { - status_ = super(&busy); - break; - } - } - return status_; -} - -//${Components::TServer::SM::final} .......................................... -Q_STATE_DEF(TServer, final) { - QP::QState status_; - switch (e->sig) { - //${Components::TServer::SM::final} - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "final-ENTRY;"); - QP::QF::stop(); // terminate the application - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${Components::TServer} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// test harness ============================================================== - -// Local-scope objects ------------------------------------------------------- -static QP::QEvt const *l_tserverQSto[10]; // Event queue storage for TServer -static QF_MPOOL_EL(RequestEvt) l_smlPoolSto[20]; // storage for small pool - -//............................................................................ -int main(int argc, char *argv[]) { - PRINTF_S("Deferred Event state pattern\nQP version: %s\n" - "Press 'n' to generate a new request\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - QP::QF::init(); // initialize the framework and the underlying RTOS/OS - - BSP_init(argc, argv); // initialize the BSP - - // initialize event pools... - QP::QF::poolInit(l_smlPoolSto, - sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // publish-subscribe not used, no call to QActive::psInit() - - QS_SIG_DICTIONARY(NEW_REQUEST_SIG, nullptr); // global signals - QS_SIG_DICTIONARY(RECEIVED_SIG, nullptr); - QS_SIG_DICTIONARY(AUTHORIZED_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - - // start the active objects... - TServer::inst.start(1U, - l_tserverQSto, Q_DIM(l_tserverQSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case 'n': { // 'n': new request? - static uint8_t reqCtr = 0; // count the requests - RequestEvt *e = Q_NEW(RequestEvt, NEW_REQUEST_SIG); - e->ref_num = (++reqCtr); // set the reference number - // post directly to TServer active object - TServer::inst.POST(e, (void *)0); - break; - } - case '\33': { // ESC pressed? - static QP::QEvt const terminateEvt(TERMINATE_SIG); - TServer::inst.POST(&terminateEvt, (void *)0); - break; - } - } -} - diff --git a/examples/posix-win32/defer/defer.qm b/examples/posix-win32/defer/defer.qm deleted file mode 100644 index 26630efec..000000000 --- a/examples/posix-win32/defer/defer.qm +++ /dev/null @@ -1,282 +0,0 @@ - - - Deferred Event state pattern - - - - - - - - - reference number of the request - - - - - - - - "Transaction Server" AO - - - // native QF queue for deferred request events - - - - // storage for the deferred queue buffer - - - - // request event being processed - - - - // private time event generator - - - - // private time event generator - - - - - - noexcept - ctor - : QActive(Q_STATE_CAST(&initial)), - m_receivedEvt(this, RECEIVED_SIG), - m_authorizedEvt(this, AUTHORIZED_SIG) - -m_requestQueue.init(m_requestQSto, Q_DIM(m_requestQSto)); - - - - - - (void)e; // unused parameter -m_activeRequest = nullptr; // no active request yet - -QS_OBJ_DICTIONARY(&TServer::inst); -QS_OBJ_DICTIONARY(&TServer::inst.m_receivedEvt); -QS_OBJ_DICTIONARY(&TServer::inst.m_authorizedEvt); -QS_OBJ_DICTIONARY(&TServer::inst.m_requestQueue); - - - - - - - PRINTF_S("%s\n", "idle-ENTRY;"); - -// recall the oldest deferred request... -if (recall(&m_requestQueue)) { - PRINTF_S("%s\n", "Request recalled"); -} -else { - PRINTF_S("%s\n", "No deferred requests"); -} - - - // create and save a new reference to the request event so that -// this event will be available beyond this RTC step and won't be -// recycled. -Q_NEW_REF(m_activeRequest, RequestEvt); - -PRINTF_S("Processing request #%d\n", - (int)m_activeRequest->ref_num); - - - - - - - - - - - - - - - - - PRINTF_S("busy-EXIT; done processing request #%d\n", - (int)m_activeRequest->ref_num); - -// delete the reference to the active request, because -// it is now processed. -Q_DELETE_REF(m_activeRequest); - - - // defer the new request event... -if (defer(&m_requestQueue, e)) { - PRINTF_S("Request #%d deferred;\n", - (int)Q_EVT_CAST(RequestEvt)->ref_num); -} -else { // deferred queue full - // option1: ignore the new request and do nothing here - - // option2: - // flush the oldest request to make room for the new one - QP::QEvt const *old_evt = m_requestQueue.get(0U); - Q_ASSERT(old_evt != nullptr); - PRINTF_S("Previous request #%d DISCARDED;\n", - (int)((RequestEvt*)old_evt)->ref_num); - QP::QF::gc(old_evt); // explicitly recycle old - - // repeat the defer request after making room in the queue - if (!defer(&m_requestQueue, e)) { - Q_ERROR(); // now it must succeed - } -} - - - - - - - - - - - - - - // inform about the first stage of processing of the request... -PRINTF_S("receiving-ENTRY; active request: #%d\n", - (int)m_activeRequest->ref_num); - -// one-shot timeout in 1 second -m_receivedEvt.armX(BSP_TICKS_PER_SEC, 0U); - m_receivedEvt.disarm(); - - - - - - - - - - - - - - // inform about the second stage of processing of the request.. -PRINTF_S("authorizing-ENTRY; active request: #%d\n", - (int)m_activeRequest->ref_num); - -// one-shot timeout in 2 seconds -m_authorizedEvt.armX(2U*BSP_TICKS_PER_SEC, 0U); - m_authorizedEvt.disarm(); - - - - - - - - - - - - - - - - - - PRINTF_S("%s\n", "final-ENTRY;"); - QP::QF::stop(); // terminate the application - - - - - - - - - - - - - #include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" <stdio.h>/<string.h> facilities - -Q_DEFINE_THIS_FILE - -//............................................................................ -enum TServerSignals { - NEW_REQUEST_SIG = QP::Q_USER_SIG, // the new request signal - RECEIVED_SIG, // the request has been received - AUTHORIZED_SIG, // the request has been authorized - TERMINATE_SIG // terminate the application -}; -//............................................................................ -$declare${Events::RequestEvt} - -// Active object class -----------------------------------------------------.. -$declare${Components::TServer} - -$define${Components::TServer} - -// test harness ============================================================== - -// Local-scope objects ------------------------------------------------------- -static QP::QEvt const *l_tserverQSto[10]; // Event queue storage for TServer -static QF_MPOOL_EL(RequestEvt) l_smlPoolSto[20]; // storage for small pool - -//............................................................................ -int main(int argc, char *argv[]) { - PRINTF_S("Deferred Event state pattern\nQP version: %s\n" - "Press 'n' to generate a new request\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - QP::QF::init(); // initialize the framework and the underlying RTOS/OS - - BSP_init(argc, argv); // initialize the BSP - - // initialize event pools... - QP::QF::poolInit(l_smlPoolSto, - sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // publish-subscribe not used, no call to QActive::psInit() - - QS_SIG_DICTIONARY(NEW_REQUEST_SIG, nullptr); // global signals - QS_SIG_DICTIONARY(RECEIVED_SIG, nullptr); - QS_SIG_DICTIONARY(AUTHORIZED_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - - // start the active objects... - TServer::inst.start(1U, - l_tserverQSto, Q_DIM(l_tserverQSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case 'n': { // 'n': new request? - static uint8_t reqCtr = 0; // count the requests - RequestEvt *e = Q_NEW(RequestEvt, NEW_REQUEST_SIG); - e->ref_num = (++reqCtr); // set the reference number - // post directly to TServer active object - TServer::inst.POST(e, (void *)0); - break; - } - case '\33': { // ESC pressed? - static QP::QEvt const terminateEvt(TERMINATE_SIG); - TServer::inst.POST(&terminateEvt, (void *)0); - break; - } - } -} - - - - diff --git a/examples/posix-win32/defer/defer.sln b/examples/posix-win32/defer/defer.sln deleted file mode 100644 index 6c595ca00..000000000 --- a/examples/posix-win32/defer/defer.sln +++ /dev/null @@ -1,42 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30804.86 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "defer", "defer.vcxproj", "{8CC465F7-872E-4D03-B93C-1B64858B4E11}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - QSpy|Win32 = QSpy|Win32 - QSpy|x64 = QSpy|x64 - QSpy64|Win32 = QSpy64|Win32 - QSpy64|x64 = QSpy64|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.ActiveCfg = Debug|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.Build.0 = Debug|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|x64.ActiveCfg = Debug|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|x64.Build.0 = Debug|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|Win32.ActiveCfg = QSpy|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|Win32.Build.0 = QSpy|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|x64.ActiveCfg = QSpy|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|x64.Build.0 = QSpy|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|Win32.ActiveCfg = QSpy64|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|Win32.Build.0 = QSpy64|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|x64.ActiveCfg = QSpy64|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|x64.Build.0 = QSpy64|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|Win32.ActiveCfg = Release|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|Win32.Build.0 = Release|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|x64.ActiveCfg = Release|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {435A4978-E6C4-4DB5-997D-40C45B465DD2} - EndGlobalSection -EndGlobal diff --git a/examples/posix-win32/defer/defer.vcxproj b/examples/posix-win32/defer/defer.vcxproj deleted file mode 100644 index 3f6c2867e..000000000 --- a/examples/posix-win32/defer/defer.vcxproj +++ /dev/null @@ -1,426 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - QSpy64 - Win32 - - - QSpy64 - x64 - - - QSpy - x64 - - - Release - Win32 - - - QSpy - Win32 - - - Release - x64 - - - - {8CC465F7-872E-4D03-B93C-1B64858B4E11} - defer - Win32Proj - 10.0 - - - - Application - NotSet - v143 - - - Application - NotSet - v143 - - - Application - NotSet - v143 - - - Application - NotSet - v143 - - - Application - NotSet - true - v143 - - - Application - NotSet - true - v143 - - - Application - NotSet - v143 - - - Application - NotSet - v143 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - false - $(SolutionDir)$(Configuration)\ - QSpy64\ - $(Configuration)\ - QSpy64\ - true - true - true - true - - - QSpy64\ - QSpy64\ - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - Default - - - %(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - Default - - - qp.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - MaxSpeed - true - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;QP_CONFIG;WIN32;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - true - NotUsing - Level4 - ProgramDatabase - 4127 - - - %(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - true - true - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - MaxSpeed - true - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;WIN32;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - true - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - true - true - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;QP_CONFIG;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;ws2_32.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;QP_CONFIG;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX64 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - - true - - - - - true - - - - - - - - - - - - - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/posix-win32/defer/defer.vcxproj.filters b/examples/posix-win32/defer/defer.vcxproj.filters deleted file mode 100644 index e9128df7a..000000000 --- a/examples/posix-win32/defer/defer.vcxproj.filters +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QS - - - QS - - - QS - - - QS - - - QS - - - QP_port - - - QP_port - - - - - - QP_port - - - - - - {132373cd-4fbf-4759-b90b-33d062646870} - - - {3782d84c-89fd-4955-b3bb-1a48d8ed5e1e} - - - {63c2ea15-0007-4619-903e-97d5e7a963d6} - - - - - QP_port - - - \ No newline at end of file diff --git a/examples/posix-win32/defer/qspy200823_204112.seq b/examples/posix-win32/defer/qspy200823_204112.seq deleted file mode 100644 index 740a188d4..000000000 --- a/examples/posix-win32/defer/qspy200823_204112.seq +++ /dev/null @@ -1,87 +0,0 @@ --g NULL,l_QF_onClockTick,TServer::inst - - +-------+-------+ +-------+-------+ +-------+-------+ - | NULL | |l_QF_onClockTic| | TServer::inst | - +-------+-------+ +-------+-------+ +-------+-------+ -3115372171 | | (RcallA) -3127751904 *--NEW_REQUEST_SIG--+------------------>| -3127792184 | | -3144424365 | *--RECEIVED_SIG---->| -3144429488 | | -3177742936 | *--AUTHORIZED_SIG-->| -3177796020 | | (RcallA) -3177816231 | | -3190753295 *--NEW_REQUEST_SIG--+------------------>| -3190792988 | | -3200126862 *--NEW_REQUEST_SIG--+------------------>| -3200127346 | | (Defer) -3207429692 | *--RECEIVED_SIG---->| -3207435638 | | -3240835283 | *--AUTHORIZED_SIG-->| -3240884412 | | *<=NEW_REQUEST_SIG] -3240884486 | | (RCall) -3240902469 | | -3240936680 | | -3245246620 *--NEW_REQUEST_SIG--+------------------>| -3245247305 | | (Defer) -3254598943 *--NEW_REQUEST_SIG--+------------------>| -3254599651 | | (Defer) -3257598386 | *--RECEIVED_SIG---->| -3257603521 | | -3290915941 | *--AUTHORIZED_SIG-->| -3290965115 | | *<=NEW_REQUEST_SIG] -3290965193 | | (RCall) -3290987012 | | -3291020708 | | -3307601831 | *--RECEIVED_SIG---->| -3307606209 | | -3340602871 | *--AUTHORIZED_SIG-->| -3340652908 | | *<=NEW_REQUEST_SIG] -3340652979 | | (RCall) -3340672425 | | -3340706328 | | -3348619404 *--NEW_REQUEST_SIG--+------------------>| -3348620116 | | (Defer) -3355616936 *--NEW_REQUEST_SIG--+------------------>| -3355617403 | | (Defer) -3357292004 | *--RECEIVED_SIG---->| -3357298729 | | -3360932940 *--NEW_REQUEST_SIG--+------------------>| -3360933640 | | (Defer) -3366616857 *--NEW_REQUEST_SIG--+------------------>| -3366617324 | | (Defer) -3371621400 *--NEW_REQUEST_SIG--+------------------>| -3371622079 | | (Defer) -3384305400 *--NEW_REQUEST_SIG--+------------------>| -3384305951 | | (Defer) -3390606543 | *--AUTHORIZED_SIG-->| -3390655825 | | *<=NEW_REQUEST_SIG] -3390655893 | | (RCall) -3390673855 | | -3390707455 | | -3407298923 | *--RECEIVED_SIG---->| -3407304316 | | -3440608262 | *--AUTHORIZED_SIG-->| -3440664494 | | *<=NEW_REQUEST_SIG] -3440664577 | | (RCall) -3440681734 | | -3440715647 | | -3457296614 | *--RECEIVED_SIG---->| -3457303486 | | -3490610960 | *--AUTHORIZED_SIG-->| -3490665429 | | *<=NEW_REQUEST_SIG] -3490665509 | | (RCall) -3490682552 | | -3490703569 | | -3507305279 | *--RECEIVED_SIG---->| -3507310912 | | -3540615829 | *--AUTHORIZED_SIG-->| -3540644505 | | *<=NEW_REQUEST_SIG] -3540644570 | | (RCall) -3540648118 | | -3540654807 | | -3557301542 | *--RECEIVED_SIG---->| -3557305878 | | -3590617215 | *--AUTHORIZED_SIG-->| -3590645521 | | (RcallA) -3590651879 | | diff --git a/examples/posix-win32/dpp-posix/Makefile b/examples/posix-win32/dpp-posix/Makefile deleted file mode 100644 index 0771596c4..000000000 --- a/examples/posix-win32/dpp-posix/Makefile +++ /dev/null @@ -1,289 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* (multithreaded) -# Last updated for version 7.3.0 -# Last updated on 2023-07-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC, . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_CONFIG \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -# C++ QS source files -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -$(error this example is for POSIX only and does not build or run on Windows) - -else - -# NOTE: -# This example is only for multithreaded POSIX (NOT for POSIX-QV) -# -QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/dpp-posix/bsp.cpp b/examples/posix-win32/dpp-posix/bsp.cpp deleted file mode 100644 index 6986ab7a4..000000000 --- a/examples/posix-win32/dpp-posix/bsp.cpp +++ /dev/null @@ -1,252 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example (console) for POSIX (multithreaded) port -// Last updated for version 7.3.1 -// Last updated on 2023-11-18 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "safe_std.h" // portable "safe" / facilities -#include -#include - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local objects ------------------------------------------------------------- -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_clock_tick = { QP::QS_AP_ID }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - QS_ASSERTION(module, id, 10000U); // report assertion to QS - FPRINTF_S(stderr, "ERROR in %s:%d", module, id); - QP::QF::onCleanup(); - QS_EXIT(); - exit(-1); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -//............................................................................ -void init(int argc, char **argv) { - Q_UNUSED_PAR(argc); - Q_UNUSED_PAR(argv); - - PRINTF_S("Dining Philosophers Problem example" - "\nQP %s\n" - "Press 'p' to pause\n" - "Press 's' to serve\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP::randomSeed(1234U); - - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - QS_OBJ_DICTIONARY(&l_clock_tick); - - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the tick record - QS_LOC_FILTER(-(APP::N_PHILO + 3)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QP prio. of the AO - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - PRINTF_S("Philosopher %2d is %s\n", (int)n, stat); - - // application-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t paused) { - PRINTF_S("Paused is %s\n", paused ? "ON" : "OFF"); -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); - QP::QF::stop(); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -//............................................................................ -void QF::onStartup() { - consoleSetup(); - - // disable the standard clock-tick service by setting tick-rate to 0 - setTickRate(0U, 10U); // zero tick-rate / ticker thread prio. -} -//............................................................................ -void QF::onCleanup() { - PRINTF_S("\n%s\n", "Bye! Bye!"); - consoleCleanup(); -} -//............................................................................ -void QF::onClockTick() { - - // NOTE: - // The standard clock-tick service has been DISABLED in QF::onStartup() - // by setting the clock tick rate to zero. - // Therefore QF::onClockTick() must implement an alternative waiting - // mechanism for the clock period. This particular implementation is - // based on the select() system call to block for the desired timeout. - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = (1000000/BSP::TICKS_PER_SEC); - select(0, NULL, NULL, NULL, &tv); // block for the timevalue - - QTimeEvt::TICK_X(0U, &l_clock_tick); // process time events at rate 0 - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output - - switch (consoleGetKey()) { - case '\33': { // ESC pressed? - BSP::terminate(0); - break; - } - case 'p': { - static QEvt const pauseEvt(APP::PAUSE_SIG); - QActive::PUBLISH(&pauseEvt, &l_clock_tick); - break; - } - case 's': { - static QEvt const serveEvt(APP::SERVE_SIG); - QActive::PUBLISH(&serveEvt, &l_clock_tick); - break; - } - default: { - break; - } - } -} - -//============================================================================ -#ifdef Q_SPY - -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY - -} // namespace QP - diff --git a/examples/posix-win32/dpp-posix/bsp.hpp b/examples/posix-win32/dpp-posix/bsp.hpp deleted file mode 100644 index 2899e39e8..000000000 --- a/examples/posix-win32/dpp-posix/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100U}; - -void init(int argc, char **argv); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/posix-win32/dpp-posix/dpp.hpp b/examples/posix-win32/dpp-posix/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/posix-win32/dpp-posix/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/posix-win32/dpp-posix/dpp.qm b/examples/posix-win32/dpp-posix/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/posix-win32/dpp-posix/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/posix-win32/dpp-posix/main.cpp b/examples/posix-win32/dpp-posix/main.cpp deleted file mode 100644 index 3b28c138a..000000000 --- a/examples/posix-win32/dpp-posix/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main(int argc, char *argv[]) { - QP::QF::init(); // initialize the framework - BSP::init(argc, argv); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/posix-win32/dpp-posix/philo.cpp b/examples/posix-win32/dpp-posix/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/posix-win32/dpp-posix/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/dpp-posix/qp_config.hpp b/examples/posix-win32/dpp-posix/qp_config.hpp deleted file mode 100644 index 0e290148a..000000000 --- a/examples/posix-win32/dpp-posix/qp_config.hpp +++ /dev/null @@ -1,54 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// Use the most recent QP API version -#define QP_API_VERSION 9999 - -// Enable QEvt constructor for dynamic events -#define QEVT_DYN_CTOR - -// Activate the QF QActive_stop() API -#define QF_ACTIVE_STOP - -// The maximum number of active objects in the application -#define QF_MAX_ACTIVE 64U - -// The number of system clock tick rates -#define QF_MAX_TICK_RATE 2U - -#endif // QP_CONFIG_HPP_ diff --git a/examples/posix-win32/dpp-posix/table.cpp b/examples/posix-win32/dpp-posix/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/posix-win32/dpp-posix/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/dpp/Makefile b/examples/posix-win32/dpp/Makefile deleted file mode 100644 index 0e590ac47..000000000 --- a/examples/posix-win32/dpp/Makefile +++ /dev/null @@ -1,299 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.0 -# Last updated on 2023-07-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC, . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_CONFIG \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -# C++ QS source files -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/dpp/Makefile_t b/examples/posix-win32/dpp/Makefile_t deleted file mode 100644 index 0027853ae..000000000 --- a/examples/posix-win32/dpp/Makefile_t +++ /dev/null @@ -1,299 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* (multithreaded) -# Last updated for version 7.3.0 -# Last updated on 2023-07-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC, . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_CONFIG \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -# C++ QS source files -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -#QP_PORT_DIR := $(QPCPP)/ports/win32-qv -QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -# - the single-threaded QP/C++ port (posix-qv) or -# - the multithreaded QP/C++ port (posix). -# -#QP_PORT_DIR := $(QPCPP)/ports/posix-qv -QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/dpp/bsp.cpp b/examples/posix-win32/dpp/bsp.cpp deleted file mode 100644 index 2668a7db1..000000000 --- a/examples/posix-win32/dpp/bsp.cpp +++ /dev/null @@ -1,238 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example (console) -// Last updated for version 7.3.0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "safe_std.h" // portable "safe" / facilities -#include - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local objects ------------------------------------------------------------- -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_clock_tick = { QP::QS_AP_ID }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - QS_ASSERTION(module, id, 10000U); // report assertion to QS - FPRINTF_S(stderr, "ERROR in %s:%d", module, id); - QP::QF::onCleanup(); - QS_EXIT(); - exit(-1); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -//............................................................................ -void init(int argc, char **argv) { - Q_UNUSED_PAR(argc); - Q_UNUSED_PAR(argv); - - PRINTF_S("Dining Philosophers Problem example" - "\nQP %s\n" - "Press 'p' to pause\n" - "Press 's' to serve\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP::randomSeed(1234U); - - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - QS_OBJ_DICTIONARY(&l_clock_tick); - - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the tick record - QS_LOC_FILTER(-(APP::N_PHILO + 3)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QP prio. of the AO - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, 0U); // no stack storage - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - PRINTF_S("Philosopher %2d is %s\n", (int)n, stat); - - // application-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t paused) { - PRINTF_S("Paused is %s\n", paused ? "ON" : "OFF"); -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); - QP::QF::stop(); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -//............................................................................ -void QF::onStartup() { - consoleSetup(); - setTickRate(BSP::TICKS_PER_SEC, 10); // desired tick rate/prio -} -//............................................................................ -void QF::onCleanup() { - PRINTF_S("\n%s\n", "Bye! Bye!"); - consoleCleanup(); -} -//............................................................................ -void QF::onClockTick() { - - QTimeEvt::TICK_X(0U, &l_clock_tick); // process time events at rate 0 - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output - - switch (consoleGetKey()) { - case '\33': { // ESC pressed? - BSP::terminate(0); - break; - } - case 'p': { - static QEvt const pauseEvt(APP::PAUSE_SIG); - QActive::PUBLISH(&pauseEvt, &l_clock_tick); - break; - } - case 's': { - static QEvt const serveEvt(APP::SERVE_SIG); - QActive::PUBLISH(&serveEvt, &l_clock_tick); - break; - } - default: { - break; - } - } -} - -//============================================================================ -#ifdef Q_SPY - -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY - -} // namespace QP - diff --git a/examples/posix-win32/dpp/bsp.hpp b/examples/posix-win32/dpp/bsp.hpp deleted file mode 100644 index 2899e39e8..000000000 --- a/examples/posix-win32/dpp/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100U}; - -void init(int argc, char **argv); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/posix-win32/dpp/dpp.hpp b/examples/posix-win32/dpp/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/posix-win32/dpp/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/posix-win32/dpp/dpp.qm b/examples/posix-win32/dpp/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/posix-win32/dpp/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/posix-win32/dpp/dpp.sln b/examples/posix-win32/dpp/dpp.sln deleted file mode 100644 index 7619074b8..000000000 --- a/examples/posix-win32/dpp/dpp.sln +++ /dev/null @@ -1,42 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30804.86 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dpp", "dpp.vcxproj", "{8CC465F7-872E-4D03-B93C-1B64858B4E11}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - QSpy|Win32 = QSpy|Win32 - QSpy|x64 = QSpy|x64 - QSpy64|Win32 = QSpy64|Win32 - QSpy64|x64 = QSpy64|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.ActiveCfg = Debug|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.Build.0 = Debug|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|x64.ActiveCfg = Debug|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|x64.Build.0 = Debug|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|Win32.ActiveCfg = QSpy|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|Win32.Build.0 = QSpy|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|x64.ActiveCfg = QSpy|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy|x64.Build.0 = QSpy|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|Win32.ActiveCfg = QSpy64|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|Win32.Build.0 = QSpy64|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|x64.ActiveCfg = QSpy64|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.QSpy64|x64.Build.0 = QSpy64|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|Win32.ActiveCfg = Release|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|Win32.Build.0 = Release|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|x64.ActiveCfg = Release|x64 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {435A4978-E6C4-4DB5-997D-40C45B465DD2} - EndGlobalSection -EndGlobal diff --git a/examples/posix-win32/dpp/dpp.vcxproj b/examples/posix-win32/dpp/dpp.vcxproj deleted file mode 100644 index 504a03d17..000000000 --- a/examples/posix-win32/dpp/dpp.vcxproj +++ /dev/null @@ -1,429 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - QSpy64 - Win32 - - - QSpy64 - x64 - - - QSpy - x64 - - - Release - Win32 - - - QSpy - Win32 - - - Release - x64 - - - - {8CC465F7-872E-4D03-B93C-1B64858B4E11} - dpp - Win32Proj - 10.0 - - - - Application - NotSet - v142 - - - Application - NotSet - v142 - - - Application - NotSet - v142 - - - Application - NotSet - v142 - - - Application - NotSet - true - v142 - - - Application - NotSet - true - v142 - - - Application - NotSet - v142 - - - Application - NotSet - v142 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - false - $(SolutionDir)$(Configuration)\ - QSpy64\ - $(Configuration)\ - QSpy64\ - true - true - true - true - - - QSpy64\ - QSpy64\ - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - QP_CONFIG;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - Default - - - %(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - Default - - - qp.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - MaxSpeed - true - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;QP_CONFIG;WIN32;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - true - NotUsing - Level4 - ProgramDatabase - 4127 - - - %(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - true - true - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - MaxSpeed - true - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;WIN32;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - true - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - true - true - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;QP_CONFIG;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;ws2_32.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;QP_CONFIG;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX64 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - - true - - - - - true - - - - - - - - - - - - - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - true - - - - - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/posix-win32/dpp/dpp.vcxproj.filters b/examples/posix-win32/dpp/dpp.vcxproj.filters deleted file mode 100644 index e6695ff6b..000000000 --- a/examples/posix-win32/dpp/dpp.vcxproj.filters +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QS - - - QS - - - QS - - - QS - - - QS - - - QP_port - - - QP_port - - - - - QP_port - - - - - - - {132373cd-4fbf-4759-b90b-33d062646870} - - - {3782d84c-89fd-4955-b3bb-1a48d8ed5e1e} - - - {63c2ea15-0007-4619-903e-97d5e7a963d6} - - - - - QP_port - - - \ No newline at end of file diff --git a/examples/posix-win32/dpp/main.cpp b/examples/posix-win32/dpp/main.cpp deleted file mode 100644 index 3b28c138a..000000000 --- a/examples/posix-win32/dpp/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main(int argc, char *argv[]) { - QP::QF::init(); // initialize the framework - BSP::init(argc, argv); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/posix-win32/dpp/philo.cpp b/examples/posix-win32/dpp/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/posix-win32/dpp/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/dpp/qp_config.hpp b/examples/posix-win32/dpp/qp_config.hpp deleted file mode 100644 index 0e290148a..000000000 --- a/examples/posix-win32/dpp/qp_config.hpp +++ /dev/null @@ -1,54 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// Use the most recent QP API version -#define QP_API_VERSION 9999 - -// Enable QEvt constructor for dynamic events -#define QEVT_DYN_CTOR - -// Activate the QF QActive_stop() API -#define QF_ACTIVE_STOP - -// The maximum number of active objects in the application -#define QF_MAX_ACTIVE 64U - -// The number of system clock tick rates -#define QF_MAX_TICK_RATE 2U - -#endif // QP_CONFIG_HPP_ diff --git a/examples/posix-win32/dpp/qview/dpp.py b/examples/posix-win32/dpp/qview/dpp.py deleted file mode 100644 index 82567887c..000000000 --- a/examples/posix-win32/dpp/qview/dpp.py +++ /dev/null @@ -1,112 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the application-specific -# trace record QS_USER_00 (PHILO_STAT) produced when the status of -# a Philo changes. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback - def on_reset(self): - # clear the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback - def on_run(self): - glb_filter("QS_USER_00") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_USER_00 application-specific trace record. - # This record has the following structure (see bsp.c:displayPhilStat()): - # Seq-Num, Record-ID, Timestamp, format-byte, Philo-num, - # format-byte, Zero-terminated string (status) - def QS_USER_00(self, packet): - # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3] - data = qunpack("xxTxBxZ", packet) - i = data[1] - j = ("t", "h", "e").index(data[2][0]) # the first letter - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j]) - - # print a message to the text view - QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2])) - -#============================================================================= -QView.customize(DPP()) # set the QView customization diff --git a/examples/posix-win32/dpp/qview/dpp1.py b/examples/posix-win32/dpp/qview/dpp1.py deleted file mode 100644 index 5b0fe6726..000000000 --- a/examples/posix-win32/dpp/qview/dpp1.py +++ /dev/null @@ -1,155 +0,0 @@ -# This is an example of QView customization for a specific application -# (DPP in this case). This example animates the Phil images on the -# QView canvas. Additionally, there is a button in the middle of the screen, -# which, when clicked once pauses the DPP ("forks" are not being served). -# A second click on the button, "un-pauses" the DPP ("forks" are served -# to all hungry Philosophers). -# -# This version of the DPP customization uses the predefined QS_QEP_TRAN -# trace record, which provides information about the state transitions of -# the Dining Philosophers. The example also demonstrates how to intercept -# the QS "dictionary" records QS_OBJ_DICT and QS_FUN_DICT to extract the -# information about the addresses of the Philosopher objects and the states -# of their state machines. -# -# NOTE: this is a desktop application, which you cannot reset (and restarted). -# Therefore, the desktop applications must be started *after* the QView is -# already running and is attached to the QSPY host application. - -class DPP: - def __init__(self): - - # add commands to the Custom menu... - QView.custom_menu.add_command(label="Custom command", - command=self.cust_command) - - # configure the custom QView.canvas... - QView.show_canvas() # make the canvas visible - QView.canvas.configure(width=400, height=260) - - # tuple of activity images (correspond to self._philo_state) - self._act_img = ( - PhotoImage(file=HOME_DIR + "/img/thinking.gif"), - PhotoImage(file=HOME_DIR + "/img/hungry.gif"), - PhotoImage(file=HOME_DIR + "/img/eating.gif"), - ) - # tuple of philo canvas images (correspond to self._philo_obj) - self._philo_img = (\ - QView.canvas.create_image(190, 57, image=self._act_img[0]), - QView.canvas.create_image(273, 100, image=self._act_img[0]), - QView.canvas.create_image(237, 185, image=self._act_img[0]), - QView.canvas.create_image(146, 185, image=self._act_img[0]), - QView.canvas.create_image(107, 100, image=self._act_img[0]) - ) - - # button images for UP and DOWN - self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif") - self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif") - - # images of a button for pause/serve - self.btn = QView.canvas.create_image(200, 120, image=self.img_UP) - QView.canvas.tag_bind(self.btn, "", self.cust_pause) - - # request target reset on startup... - # NOTE: Normally, for an embedded application you would like - # to start with resetting the Target, to start clean with - # Qs dictionaries, etc. - # - # However, this is a desktop application, which you cannot reset - # (and restart). Therefore, the desktop applications must be started - # *after* the QView is already running. - #reset_target() - - - # on_reset() callback invoked when Target-reset packet is received - # NOTE: the QS dictionaries are not known at this time yet, so - # this callback shouild generally not set filters or current objects - def on_reset(self): - # (re)set the lists - self._philo_obj = [0, 0, 0, 0, 0] - self._philo_state = [0, 0, 0] - - # on_run() callback invoked when the QF_RUN packet is received - # NOTE: the QS dictionaries are typically known at this time yet, so - # this callback can set filters or current objects - def on_run(self): - glb_filter("QS_QEP_TRAN") - - # NOTE: the names of objects for current_obj() must match - # the QS Object Dictionaries produced by the application. - current_obj(OBJ_AO, "Table::inst") - - # turn lists into tuples for better performance - self._philo_obj = tuple(self._philo_obj) - self._philo_state = tuple(self._philo_state) - - - # example of a custom command - def cust_command(self): - command(1, 12345) - - # example of a custom interaction with a canvas object (pause/serve) - def cust_pause(self, event): - if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP): - QView.canvas.itemconfig(self.btn, image=self.img_UP) - post("SERVE_SIG") - QView.print_text("Table SERVING") - else: - QView.canvas.itemconfig(self.btn, image=self.img_DWN) - post("PAUSE_SIG") - QView.print_text("Table PAUSED") - - # Intercept the QS_OBJ_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Object-ptr, Zero-terminated string - def QS_OBJ_DICT(self, packet): - data = qunpack("xxOZ", packet) - try: - # NOTE: the names of objects must match the QS Object Dictionaries - # produced by the application. - i = ("Philo::inst[0]", - "Philo::inst[1]", - "Philo::inst[2]", - "Philo::inst[3]", - "Philo::inst[4]").index(data[1]) - self._philo_obj[i] = data[0] - except: - pass # dictionary for a different object - - # Intercept the QS_FUN_DICT predefined trace record. - # This record has the following structure: - # Seq-Num, Record-ID, Function-ptr, Zero-terminated string - def QS_FUN_DICT(self, packet): - data = qunpack("xxFZ", packet) - try: - # NOTE: the names of states must match the QS Object Dictionaries - # produced by the application. - j = ("Philo::thinking", - "Philo::hungry", - "Philo::eating").index(data[1]) - self._philo_state[j] = data[0] - except: - pass # dictionary for a different state - - # Intercept the QS_QEP_TRAN predefined trace record. - # This record has the following structure (see qep_hsm.c): - # Seq-Num, Record-ID, Timestamp, Signal, Object-ptr, - # Function-ptr (source state), Function-ptr (new active state) - def QS_QEP_TRAN(self, packet): - data = qunpack("xxTSOFF", packet) - try: - i = self._philo_obj.index(data[2]) - j = self._philo_state.index(data[4]) - - # animate the given philo image according to its activity - QView.canvas.itemconfig(self._philo_img[i], - image=self._act_img[j]) - # print a message to the text view - QView.print_text("%010d Philo %d is %s"\ - %(data[0], i, ("thinking", "hungry", "eating")[j])) - except: - pass # state-entry in a different object - -#============================================================================= -# instantiate the DPP class and set it as the QView customization -QView.customize(DPP()) diff --git a/examples/posix-win32/dpp/qview/img/BTN_DWN.gif b/examples/posix-win32/dpp/qview/img/BTN_DWN.gif deleted file mode 100644 index 36d8c790736950bcfe9d753d25d9fd197be63048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmV+y2C@6 zXoG5Gg>_Q&<;K>&o|uV$+QOa7xTU$Qc*eMh9@O3%ET&cLLF za%hNfX^C=e(7v68d3K9?dD6h1eQRZkb!}^2S$Jt>fpKYMTU35-WsGrck$ZB?ww;M| zYJhQWb7f(RdUSehVv28Sc4u7H$)SXNdCt0;%e%)z@C(n(Yu_5 zb#B_vp6T7PvZRo$p__4NUY?I&U{_Jy&auV3w%5t4dTnQaa9fdmYvS3a@1vmu-E3(!qul8$g~xBSPa^ixxg= zY}0GK)z3zn&MNc;do2ndcKEv%(t8Xnz-R&lTLv)1-Lw@^MDN{8X|nPsKKK!j|57anXq6cT?)8O0>n{K;3j}F7c#3+ zGc`y-CoO{1AWVV>i3EiVb)#jb4VEnd+^Fz_MNgF}xTjR95+U=53jj!5dD7wm4Oy4hjr5k9!0t5dtAn#IeN|0N}TTcKpGRL0e!$B>#PH4TEYq|?2&7kCHTn%3snG6M+{E*Fi#DtHgf_NWK1ds1sr%eK(v`s zORc7U9svdzM1ohx7cw~Ef(r|@5T{xspc{t-9I#si2($8euN8SXV1*U<&RatN5>t4K zzyb;Y+(n!>Sdf5JA56f(8+tBGs{?sJ%<{wzXqssf7y}@K1t};nj|(7MpjQAT{{ct4 z3`3j8(MTWd0G~4?F+dvoLL*dzh$&?O2?1cy1j1ubu*Aa9vK(>J4wSt#3{|8NKp8yE zLxp=R8E|#hA4u@W7(+ihYuOR=ZH3tmd|AO1EdZc}7A?5Y#m8}5aKZyk#KG(aU8nJN z*nz(bxC0O{>;)Mp$e=|OE;#9)3A3*blVkrRO736i_ zO*sV>v~PVD)x&SQ^%V%<1pqmaaDxIbfUm$1s55~Ho`D19eSmqC6MzESSAq9Auzdn( zfF7ivl^;Yw0T^7s4vZkc82rEjQ20t5KESNzZD0dl5C8?($G|MKj{edGiY@h)RpxhW#xIzjD;0`g=5C#y?fhQ?|20Cm(9XcpL z1WbbtEpXid_`rcNAn}Z6^g;u?P=y1i00T96!WA^=Bps3~21YPK3}Wyi9n7Hxa{#~= zupj|BaKL_POkowsFc}q`;0hh!-ws~TF-nq)gGP{n5fIP`Pf(%%4O{>K7S6B*2~0o^ za+tsbws3$G_(272pn*pg@Phsg!3DKcfcOMxf*8oagHeb=3Q#}kfRei<^tj=UvV!yh0(1R{t+5D<_8B2b|VG{gWArg8!u5CH{JzyKOL z(g7#v@LwGBUkzgLI|TR;0Wtun2%ta%B9xPup|BDP;2DxDKym>Wbke_ufXyLLl%IR# z;~o*9fGC6k2RhJ!5Qsq1cb0UaR0ydKT96(mRk8-)+kp!(y2oGgQ40V?00N*eQW}U< zq$FKv7k&{BUvw0gEG^wFIp|HDIu)P~2q^GUAQYeo0VpYSNI^AV)X`cdEP97PyyHA^=6CS#?K8qmWAs^6v#vXu((!5QZq|R0KK==3M=HMRyqX9ZuK< z4KkQPjtwS+EG2;qCQE_`kU+A4^&U8bFj>yZz=9F&stE8J%zF5sAuWJH7(@^V06UO% BVI%+m diff --git a/examples/posix-win32/dpp/qview/img/BTN_UP.gif b/examples/posix-win32/dpp/qview/img/BTN_UP.gif deleted file mode 100644 index 3246ff9827129f635ad0fc3e4de0b62a6438d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmV;!2R!&kNk%w1VJiSF0OkMygK=u(+R2J?Y;0p)n2UIFYGl~TwBy>h)xw~Pd3NaG z%H7kwg=}V*iG_o7af5DYq?LNw!k&b3Wx}?qjE05Jy`s*$oz=aax2vaORZH2>%87bb zZDwTM(yg?rlXh@vb75U(URuSyj(TZZj)HW`wwY5&J#%eqt)g~)baI`Kf{AuFQ2TFJAJrkRV`$*0@Qs(NN&ZD3KTo0F=Zi)&j{x~7T4vz4ivfXu_W*1nj) ztBJa%g{7N?yR??OtB!kcTFLNz@?G@BB;u#lFogNdp$iI0q}1--FCPfj#0xd6KolLIFou!oN}#RE!D z0~sN)n5hFbH9{^fI1dlf4-x_#i-v-ak2>ZcHW?-v0}AllVnYYIbUE5>k|tnxqc|hOj2seV5Kuv2ri>a_Fd6I-%^d)e zC4(S2anevli!%mDAi%Y-|LuLIMMMGQtX=@Cp{Tim9+H^#Xwi z5t;=5@<`|*fyB%PPbRup0U+KA8BCbSfI~FdjSotc91=o+?OQ4sCNydCl8#z`8h$&+i1tdt4$!dvyl+cA9S!98R1G$7HB?qV|wFCrXkkNsbLwf0_1!11S zMwk{PS%INP9C6{In*8NJj*2L;1`AJ#aDbj2bou2OoO=3csJxbNL>V5$a6) z`@#zsTrlqoh5i~v5n4ELf&(tpsNs|ad|+2ocDUh22erbBfW7qAJMRVgmJx;j7g;

zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/posix-win32/dpp/qview/img/eating.gif b/examples/posix-win32/dpp/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/posix-win32/dpp/qview/img/hungry.gif b/examples/posix-win32/dpp/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/posix-win32/dpp/qview/img/thinking.gif b/examples/posix-win32/dpp/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/dpp_comp/Makefile b/examples/posix-win32/dpp_comp/Makefile deleted file mode 100644 index 7a3f6c5c1..000000000 --- a/examples/posix-win32/dpp_comp/Makefile +++ /dev/null @@ -1,299 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.0 -# Last updated on 2023-07-26 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC, . -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_CONFIG \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -# C++ QS source files -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/dpp_comp/bsp.cpp b/examples/posix-win32/dpp_comp/bsp.cpp deleted file mode 100644 index cf30c1cc9..000000000 --- a/examples/posix-win32/dpp_comp/bsp.cpp +++ /dev/null @@ -1,229 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example (console) -// Last updated for version 7.3.0 -// Last updated on 2023-09-04 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "safe_std.h" // portable "safe" / facilities -#include - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local objects ------------------------------------------------------------- -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_clock_tick = { QP::QS_AP_ID }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - QS_ASSERTION(module, id, 10000U); // report assertion to QS - FPRINTF_S(stderr, "ERROR in %s:%d", module, id); - QP::QF::onCleanup(); - QS_EXIT(); - exit(-1); -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -//............................................................................ -void init(int argc, char **argv) { - Q_UNUSED_PAR(argc); - Q_UNUSED_PAR(argv); - - PRINTF_S("Dining Philosophers Problem example" - "\nQP %s\n" - "Press 'p' to pause\n" - "Press 's' to serve\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP::randomSeed(1234U); - - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - QS_OBJ_DICTIONARY(&l_clock_tick); - - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the tick record - QS_LOC_FILTER(-(APP::N_PHILO + 3)); // exclude prio. of AO_Ticker0 -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, 0U); // no stack storage -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - PRINTF_S("Philosopher %2d is %s\n", (int)n, stat); - - // application-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(uint8_t paused) { - PRINTF_S("Paused is %s\n", paused ? "ON" : "OFF"); -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); - QP::QF::stop(); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -//............................................................................ -void QF::onStartup() { - consoleSetup(); - setTickRate(BSP::TICKS_PER_SEC, 10); // desired tick rate/prio -} -//............................................................................ -void QF::onCleanup() { - PRINTF_S("\n%s\n", "Bye! Bye!"); - consoleCleanup(); -} -//............................................................................ -void QF::onClockTick() { - - QTimeEvt::TICK_X(0U, &l_clock_tick); // process time events at rate 0 - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output - - switch (consoleGetKey()) { - case '\33': { // ESC pressed? - BSP::terminate(0); - break; - } - case 'p': { - static QEvt const pauseEvt(APP::PAUSE_SIG); - QActive::PUBLISH(&pauseEvt, &l_clock_tick); - break; - } - case 's': { - static QEvt const serveEvt(APP::SERVE_SIG); - QActive::PUBLISH(&serveEvt, &l_clock_tick); - break; - } - default: { - break; - } - } -} - -//============================================================================ -#ifdef Q_SPY - -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY - -} // namespace QP - diff --git a/examples/posix-win32/dpp_comp/bsp.hpp b/examples/posix-win32/dpp_comp/bsp.hpp deleted file mode 100644 index 2899e39e8..000000000 --- a/examples/posix-win32/dpp_comp/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100U}; - -void init(int argc, char **argv); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/posix-win32/dpp_comp/dpp-comp.qm b/examples/posix-win32/dpp_comp/dpp-comp.qm deleted file mode 100644 index 488fb7520..000000000 --- a/examples/posix-win32/dpp_comp/dpp-comp.qm +++ /dev/null @@ -1,532 +0,0 @@ - - - Dining Philosopher Problem example with the "Orthogonal Component" state pattern (see https://www.state-machine.com/doc/Pattern_Orthogonal.pdf) - -The model demonstrates the following features: - -1. Partitioning the application into Container and Components -2. Packages for Container (cont) and Components (comp) -3. External packages with separate QM-package model files -4. CompTimeEvt class for private time evnents of Components -5. Container to Component communication via synchronous event dispatching -6. Component to Container communication via asynchronous event posting using the LIFO policy. - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = &Table::inst; - - - - - - - - - The only static instance of the Table class (Singleton pattern) - - - - - - - - : QActive(Q_STATE_CAST(&Table::initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - - // take top-most initial tran. in the Philo SM - SM_Philo[n]->INIT(QP::QS_AP_ID + n); - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - Q_ERROR(); - - - - - - - - - - - - - std::uint16_t n = Q_EVT_CAST(CompTimeEvt)->compNum; -SM_Philo[n]->DISPATCH(e, QP::QS_AP_ID + n); - - - - - - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = LEFT(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; - -// synchronoulsy dispatch EAT event to the Philo component -TableEvt const evt(EAT_SIG, n); -SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = RIGHT(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); -} -m = LEFT(n); // check the left neighbor -n = LEFT(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); - -std::uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - Specialized time event for components. The time event can be owned by a component and can dispatch itself to the component. - - - - - The constructor to initialize a Component Time Event. - -When creating a Time-Event, you must commit it to a specific active object 'act', event signal 'sig', and tick rate 'tickRate'. You cannot change these attributes later. - - - - - - - - - : QTimeEvt(act, sig, tickRate), - compNum(num) - - - - - - - - - - - - - : QHsm(&initial), - m_timeEvt(AO_Table, getId(), TIMEOUT_SIG, 0U) - - - - return static_cast<std::uint8_t>(this - &APP::Philo::inst[0]); - - - - - - static_cast<void>(e); // unused parameter - -#ifdef Q_SPY -std::uint8_t n = getId(); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[n], n); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[n].m_timeEvt, n); -#endif - -static bool registered = false; -if (!registered) { - registered = true; - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); -} - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, getId()); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = getId(); -#endif -AO_Table->postLIFO(pe); - - - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -// asynchronously post event to the Container -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, getId()); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = getId(); -#endif -AO_Table->postLIFO(pe); - - - - - - - - - - - - - - - - - = { // opaque pointers to Philo instances - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -$declare ${Comp::CompTimeEvt} -$declare ${Comp::SM_Philo[N_PHILO]} - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${Comp::Philo} - -// definition of the whole "Comp" package -$define ${Comp} - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -namespace { - -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t RIGHT(std::uint8_t const n) { - return static_cast<std::uint8_t>( - (n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t LEFT(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static std::uint8_t const FREE = static_cast<std::uint8_t>(0); -static std::uint8_t const USED = static_cast<std::uint8_t>(1); - -static char const * const THINKING = "thinking"; -static char const * const HUNGRY = "hungry "; -static char const * const EATING = "eating "; - -} // unnamed namespace - -$declare ${Cont::Table} - -$define ${Shared::AO_Table} -$define ${Cont} - - - diff --git a/examples/posix-win32/dpp_comp/dpp.hpp b/examples/posix-win32/dpp_comp/dpp.hpp deleted file mode 100644 index 1ac4e5f47..000000000 --- a/examples/posix-win32/dpp_comp/dpp.hpp +++ /dev/null @@ -1,122 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${Comp::CompTimeEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::CompTimeEvt} ....................................................... -class CompTimeEvt : public QP::QTimeEvt { -public: - std::uint16_t compNum; - -public: - CompTimeEvt( - QP::QActive * act, - std::uint16_t num, - enum_t const sig, - std::uint_fast8_t const tickRate); -}; // class CompTimeEvt - -} // namespace APP -//$enddecl${Comp::CompTimeEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$declare${Comp::SM_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::SM_Philo[N_PHILO]} ................................................. -extern QP::QAsm * const SM_Philo[N_PHILO]; - -} // namespace APP -//$enddecl${Comp::SM_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // DPP_HPP_ diff --git a/examples/posix-win32/dpp_comp/main.cpp b/examples/posix-win32/dpp_comp/main.cpp deleted file mode 100644 index 3b28c138a..000000000 --- a/examples/posix-win32/dpp_comp/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main(int argc, char *argv[]) { - QP::QF::init(); // initialize the framework - BSP::init(argc, argv); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/posix-win32/dpp_comp/philo.cpp b/examples/posix-win32/dpp_comp/philo.cpp deleted file mode 100644 index e41d1de17..000000000 --- a/examples/posix-win32/dpp_comp/philo.cpp +++ /dev/null @@ -1,248 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${Comp::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::Philo} ............................................................. -class Philo : public QP::QHsm { -public: - static Philo inst[N_PHILO]; - -private: - CompTimeEvt m_timeEvt; - friend class Table; - -public: - Philo(); - std::uint8_t getId() { - return static_cast(this - &APP::Philo::inst[0]); - } - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${Comp::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// definition of the whole "Comp" package -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Comp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::CompTimeEvt} ....................................................... - -//${Comp::CompTimeEvt::CompTimeEvt} .......................................... -CompTimeEvt::CompTimeEvt( - QP::QActive * act, - std::uint16_t num, - enum_t const sig, - std::uint_fast8_t const tickRate) - : QTimeEvt(act, sig, tickRate), - compNum(num) -{} - -//${Comp::Philo} ............................................................. -Philo Philo::inst[N_PHILO]; - -//${Comp::Philo::Philo} ...................................................... -Philo::Philo() - : QHsm(&initial), - m_timeEvt(AO_Table, getId(), TIMEOUT_SIG, 0U) -{} - -//${Comp::Philo::SM} ......................................................... -Q_STATE_DEF(Philo, initial) { - //${Comp::Philo::SM::initial} - static_cast(e); // unused parameter - - #ifdef Q_SPY - std::uint8_t n = getId(); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[n], n); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[n].m_timeEvt, n); - #endif - - static bool registered = false; - if (!registered) { - registered = true; - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - } - return tran(&thinking); -} - -//${Comp::Philo::SM::thinking} ............................................... -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::thinking} - case Q_EXIT_SIG: { - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${Comp::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::Philo::SM::hungry} ................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, getId()); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = getId(); - #endif - AO_Table->postLIFO(pe); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::hungry::EAT} - case EAT_SIG: { - status_ = tran(&eating); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::Philo::SM::eating} ................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - // asynchronously post event to the Container - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, getId()); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = getId(); - #endif - AO_Table->postLIFO(pe); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::SM_Philo[N_PHILO]} ................................................. -QP::QAsm * const SM_Philo[N_PHILO] = { // opaque pointers to Philo instances - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Comp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/dpp_comp/qp_config.hpp b/examples/posix-win32/dpp_comp/qp_config.hpp deleted file mode 100644 index 0e290148a..000000000 --- a/examples/posix-win32/dpp_comp/qp_config.hpp +++ /dev/null @@ -1,54 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// The QP configuration takes effect only when the macro QP_CONFIG -// is defined on the command-line to the compiler for all QP source files. - -// Use the most recent QP API version -#define QP_API_VERSION 9999 - -// Enable QEvt constructor for dynamic events -#define QEVT_DYN_CTOR - -// Activate the QF QActive_stop() API -#define QF_ACTIVE_STOP - -// The maximum number of active objects in the application -#define QF_MAX_ACTIVE 64U - -// The number of system clock tick rates -#define QF_MAX_TICK_RATE 2U - -#endif // QP_CONFIG_HPP_ diff --git a/examples/posix-win32/dpp_comp/table.cpp b/examples/posix-win32/dpp_comp/table.cpp deleted file mode 100644 index 71bac9166..000000000 --- a/examples/posix-win32/dpp_comp/table.cpp +++ /dev/null @@ -1,346 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -namespace { - -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t RIGHT(std::uint8_t const n) { - return static_cast( - (n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t LEFT(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static std::uint8_t const FREE = static_cast(0); -static std::uint8_t const USED = static_cast(1); - -static char const * const THINKING = "thinking"; -static char const * const HUNGRY = "hungry "; -static char const * const EATING = "eating "; - -} // unnamed namespace - -//$declare${Cont::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Cont::Table} ............................................................. -class Table : public QP::QActive { -public: - static Table inst; - -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${Cont::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Cont} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Cont::Table} ............................................................. -Table Table::inst; - -//${Cont::Table::Table} ...................................................... -Table::Table() - : QActive(Q_STATE_CAST(&Table::initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${Cont::Table::SM} ......................................................... -Q_STATE_DEF(Table, initial) { - //${Cont::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - - // take top-most initial tran. in the Philo SM - SM_Philo[n]->INIT(QP::QS_AP_ID + n); - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${Cont::Table::SM::active} ................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - std::uint16_t n = Q_EVT_CAST(CompTimeEvt)->compNum; - SM_Philo[n]->DISPATCH(e, QP::QS_AP_ID + n); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Cont::Table::SM::active::serving} ........................................ -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::serving} - case Q_ENTRY_SIG: { - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = LEFT(n); - //${Cont::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${Cont::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${Cont::Table::SM::active::serving::DONE} - case DONE_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${Cont::Table::SM::active::paused} ......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${Cont::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused::DONE} - case DONE_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - - std::uint8_t m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${Cont} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/history_qhsm/Makefile b/examples/posix-win32/history_qhsm/Makefile deleted file mode 100644 index f5aba015a..000000000 --- a/examples/posix-win32/history_qhsm/Makefile +++ /dev/null @@ -1,290 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := history_qhsm - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - main.cpp \ - history.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/history_qhsm/history.cpp b/examples/posix-win32/history_qhsm/history.cpp deleted file mode 100644 index d43a205b6..000000000 --- a/examples/posix-win32/history_qhsm/history.cpp +++ /dev/null @@ -1,292 +0,0 @@ -//$file${.::history.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: history.qm -// File: ${.::history.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::history.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "history.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -Q_DEFINE_THIS_FILE - -//$declare${SMs::ToastOven} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::ToastOven} .......................................................... -class ToastOven : public QP::QHsm { -public: - ToastOven(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(doorClosed); - Q_STATE_DECL(heating); - Q_STATE_DECL(toasting); - Q_STATE_DECL(baking); - Q_STATE_DECL(off); - Q_STATE_DECL(doorOpen); - Q_STATE_DECL(final); - -protected: - QP::QStateHandler hist_doorClosed; -}; // class ToastOven -//$enddecl${SMs::ToastOven} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -static ToastOven l_oven; // the only instance of the ToastOven class - -// global-scope definitions ------------------------------------ -QP::QHsm * const the_oven = &l_oven; // the opaque pointer - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::ToastOven} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::ToastOven} .......................................................... - -//${SMs::ToastOven::ToastOven} ............................................... -ToastOven::ToastOven() - : QHsm(Q_STATE_CAST(&ToastOven::initial)) -{} - -//${SMs::ToastOven::SM} ...................................................... -Q_STATE_DEF(ToastOven, initial) { - //${SMs::ToastOven::SM::initial} - (void)e; /* avoid compiler warning */ - // state history attributes - hist_doorClosed = &off; - - QS_FUN_DICTIONARY(&ToastOven::doorClosed); - QS_FUN_DICTIONARY(&ToastOven::heating); - QS_FUN_DICTIONARY(&ToastOven::toasting); - QS_FUN_DICTIONARY(&ToastOven::baking); - QS_FUN_DICTIONARY(&ToastOven::off); - QS_FUN_DICTIONARY(&ToastOven::doorOpen); - QS_FUN_DICTIONARY(&ToastOven::final); - - return tran(&doorClosed); -} - -//${SMs::ToastOven::SM::doorClosed} .......................................... -Q_STATE_DEF(ToastOven, doorClosed) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "door-Closed"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorClosed} - case Q_EXIT_SIG: { - // save deep history - hist_doorClosed = state(); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorClosed::initial} - case Q_INIT_SIG: { - status_ = tran(&off); - break; - } - //${SMs::ToastOven::SM::doorClosed::TERMINATE} - case TERMINATE_SIG: { - status_ = tran(&final); - break; - } - //${SMs::ToastOven::SM::doorClosed::OPEN} - case OPEN_SIG: { - status_ = tran(&doorOpen); - break; - } - //${SMs::ToastOven::SM::doorClosed::TOAST} - case TOAST_SIG: { - status_ = tran(&toasting); - break; - } - //${SMs::ToastOven::SM::doorClosed::BAKE} - case BAKE_SIG: { - status_ = tran(&baking); - break; - } - //${SMs::ToastOven::SM::doorClosed::OFF} - case OFF_SIG: { - status_ = tran(&off); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating} ................................. -Q_STATE_DEF(ToastOven, heating) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed::heating} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "heater-On"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorClosed::heating} - case Q_EXIT_SIG: { - PRINTF_S("%s;", "heater-Off"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorClosed::heating::initial} - case Q_INIT_SIG: { - status_ = tran(&toasting); - break; - } - default: { - status_ = super(&doorClosed); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating::toasting} ....................... -Q_STATE_DEF(ToastOven, toasting) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed::heating::toasting} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "toasting"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&heating); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating::baking} ......................... -Q_STATE_DEF(ToastOven, baking) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed::heating::baking} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "baking"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&heating); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::off} ..................................... -Q_STATE_DEF(ToastOven, off) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed::off} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "toaster-Off"); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&doorClosed); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorOpen} ............................................ -Q_STATE_DEF(ToastOven, doorOpen) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorOpen} - case Q_ENTRY_SIG: { - PRINTF_S("%s;", "door-Open,lamp-On"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorOpen} - case Q_EXIT_SIG: { - PRINTF_S("%s;", "lamp-Off"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::ToastOven::SM::doorOpen::CLOSE} - case CLOSE_SIG: { - status_ = tran_hist(hist_doorClosed); - break; - } - //${SMs::ToastOven::SM::doorOpen::TERMINATE} - case TERMINATE_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::final} ............................................... -Q_STATE_DEF(ToastOven, final) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::final} - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "-> final\nBye!Bye!"); - QP::QF::onCleanup(); - exit(0); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${SMs::ToastOven} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - diff --git a/examples/posix-win32/history_qhsm/history.hpp b/examples/posix-win32/history_qhsm/history.hpp deleted file mode 100644 index 92cf98f58..000000000 --- a/examples/posix-win32/history_qhsm/history.hpp +++ /dev/null @@ -1,45 +0,0 @@ -//$file${.::history.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: history.qm -// File: ${.::history.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::history.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef HISTORY_HPP -#define HISTORY_HPP - -enum ToastOvenSignals { - OPEN_SIG = QP::Q_USER_SIG, - CLOSE_SIG, - TOAST_SIG, - BAKE_SIG, - OFF_SIG, - TERMINATE_SIG // terminate the application -}; - -extern QP::QHsm * const the_oven; // opaque pointer to the oven HSM - -#endif // HISTORY_HPP diff --git a/examples/posix-win32/history_qhsm/history.qm b/examples/posix-win32/history_qhsm/history.qm deleted file mode 100644 index e56c9e543..000000000 --- a/examples/posix-win32/history_qhsm/history.qm +++ /dev/null @@ -1,183 +0,0 @@ - - - transition to history in a subclass of QHsm - - - - - - - Oven state machine - - - constructor - : QHsm(Q_STATE_CAST(&ToastOven::initial)) - - - - - - (void)e; /* avoid compiler warning */ - - - - - - - PRINTF_S("%s;", "door-Closed"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PRINTF_S("%s;", "heater-On"); - PRINTF_S("%s;", "heater-Off"); - - - - - - - - - PRINTF_S("%s;", "toasting"); - - - - - - - PRINTF_S("%s;", "baking"); - - - - - - - - - - - - PRINTF_S("%s;", "toaster-Off"); - - - - - - - - - - - PRINTF_S("%s;", "door-Open,lamp-On"); - PRINTF_S("%s;", "lamp-Off"); - - - - - - - - - - - - - - - - - - - - PRINTF_S("%s\n", "-> final\nBye!Bye!"); -QP::QF::onCleanup(); -exit(0); - - - - - - - - - - - - - #ifndef HISTORY_HPP -#define HISTORY_HPP - -enum ToastOvenSignals { - OPEN_SIG = QP::Q_USER_SIG, - CLOSE_SIG, - TOAST_SIG, - BAKE_SIG, - OFF_SIG, - TERMINATE_SIG // terminate the application -}; - -extern QP::QHsm * const the_oven; // opaque pointer to the oven HSM - -#endif // HISTORY_HPP - - - - #include "qpcpp.hpp" -#include "history.hpp" - -#include "safe_std.h" // portable "safe" <stdio.h>/<string.h> facilities -#include <stdlib.h> - -Q_DEFINE_THIS_FILE - -$declare(SMs::ToastOven) - -static ToastOven l_oven; // the only instance of the ToastOven class - -// global-scope definitions ------------------------------------ -QP::QHsm * const the_oven = &l_oven; // the opaque pointer - -$define(SMs::ToastOven) - - - - diff --git a/examples/posix-win32/history_qhsm/main.cpp b/examples/posix-win32/history_qhsm/main.cpp deleted file mode 100644 index 2d3e0acae..000000000 --- a/examples/posix-win32/history_qhsm/main.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//============================================================================ -// Product: Transition to History Example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP API -#include "history.hpp" // application - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace QP; -using namespace std; - -//............................................................................ -int main() { - - QF::init(); - QF::onStartup(); - - PRINTF_S("History state pattern\nQEP version: %s\n" - "Press 'o' to OPEN the door\n" - "Press 'c' to CLOSE the door\n" - "Press 't' to start TOASTING\n" - "Press 'b' to start BAKING\n" - "Press 'f' to turn the oven OFF\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - // instantiate the ToastOven HSM and trigger the initial transition - the_oven->init(0U); - - for (;;) { - - PRINTF_S("\n", ""); - - uint8_t c = (uint8_t)QF::consoleWaitForKey(); - PRINTF_S("%c: ", c); - - QP::QSignal sig = 0U; - switch (c) { - case 'o': sig = OPEN_SIG; break; - case 'c': sig = CLOSE_SIG; break; - case 't': sig = TOAST_SIG; break; - case 'b': sig = BAKE_SIG; break; - case 'f': sig = OFF_SIG; break; - case 0x1B: sig = TERMINATE_SIG; break; - } - - // dispatch the event into the state machine - QEvt const e(sig); - the_oven->dispatch(&e, 0U); - } - - QF::onCleanup(); - return 0; -} - -namespace QP { -/*..........................................................................*/ -void QF::onStartup(void) { - QF::consoleSetup(); -} -/*..........................................................................*/ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -/*..........................................................................*/ -void QF::onClockTick(void) { -} - -} // namespace QP - -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - FPRINTF_S(stderr, "Assertion failed in %s, line %d", file, line); - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/history_qmsm/Makefile b/examples/posix-win32/history_qmsm/Makefile deleted file mode 100644 index 4c131946d..000000000 --- a/examples/posix-win32/history_qmsm/Makefile +++ /dev/null @@ -1,290 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := history_qmsm - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - main.cpp \ - history.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/history_qmsm/history.cpp b/examples/posix-win32/history_qmsm/history.cpp deleted file mode 100644 index 01df943a9..000000000 --- a/examples/posix-win32/history_qmsm/history.cpp +++ /dev/null @@ -1,465 +0,0 @@ -//$file${.::history.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: history.qm -// File: ${.::history.cpp} -// -// This code has been generated by QM 5.2.4 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::history.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "history.hpp" - -#include "safe_std.h" // portable "safe" / facilities -#include - -Q_DEFINE_THIS_FILE - -//$declare${SMs::ToastOven} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::ToastOven} .......................................................... -class ToastOven : public QP::QMsm { -public: - ToastOven(); - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( doorClosed); - QM_ACTION_DECL(doorClosed_e); - QM_ACTION_DECL(doorClosed_x); - QM_ACTION_DECL(doorClosed_i); - QM_STATE_DECL( heating); - QM_ACTION_DECL(heating_e); - QM_ACTION_DECL(heating_x); - QM_ACTION_DECL(heating_i); - QM_STATE_DECL( toasting); - QM_ACTION_DECL(toasting_e); - QM_STATE_DECL( baking); - QM_ACTION_DECL(baking_e); - QM_STATE_DECL( off); - QM_ACTION_DECL(off_e); - QM_STATE_DECL( doorOpen); - QM_ACTION_DECL(doorOpen_e); - QM_ACTION_DECL(doorOpen_x); - QM_STATE_DECL( final); - QM_ACTION_DECL(final_e); - -protected: - QP::QMState const *hist_doorClosed; -}; // class ToastOven -//$enddecl${SMs::ToastOven} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -static ToastOven l_oven; // the only instance of the ToastOven class - -// global-scope definitions ------------------------------------ -QP::QMsm * const the_oven = &l_oven; // the opaque pointer - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.0.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::ToastOven} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::ToastOven} .......................................................... - -//${SMs::ToastOven::ToastOven} ............................................... -ToastOven::ToastOven() - : QMsm(Q_STATE_CAST(&ToastOven::initial)) -{} - -//${SMs::ToastOven::SM} ...................................................... -QM_STATE_DEF(ToastOven, initial) { - //${SMs::ToastOven::SM::initial} - (void)e; /* avoid compiler warning */ - // state history attributes - hist_doorClosed = &off_s; - - QS_FUN_DICTIONARY(&ToastOven::doorClosed); - QS_FUN_DICTIONARY(&ToastOven::heating); - QS_FUN_DICTIONARY(&ToastOven::toasting); - QS_FUN_DICTIONARY(&ToastOven::baking); - QS_FUN_DICTIONARY(&ToastOven::off); - QS_FUN_DICTIONARY(&ToastOven::doorOpen); - QS_FUN_DICTIONARY(&ToastOven::final); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &doorClosed_s, // target state - { - &doorClosed_e, // entry - &doorClosed_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${SMs::ToastOven::SM::doorClosed} .......................................... -QP::QMState const ToastOven::doorClosed_s = { - QM_STATE_NULL, // superstate (top) - &ToastOven::doorClosed, - &ToastOven::doorClosed_e, - &ToastOven::doorClosed_x, - &ToastOven::doorClosed_i -}; -//${SMs::ToastOven::SM::doorClosed} -QM_ACTION_DEF(ToastOven, doorClosed_e) { - PRINTF_S("%s;", "door-Closed"); - return qm_entry(&doorClosed_s); -} -//${SMs::ToastOven::SM::doorClosed} -QM_ACTION_DEF(ToastOven, doorClosed_x) { - // save deep history - hist_doorClosed = stateObj(); - return qm_exit(&doorClosed_s); -} -//${SMs::ToastOven::SM::doorClosed::initial} -QM_ACTION_DEF(ToastOven, doorClosed_i) { - //${SMs::ToastOven::SM::doorClosed::initial} - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &off_s, // target state - { - &off_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::ToastOven::SM::doorClosed} -QM_STATE_DEF(ToastOven, doorClosed) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorClosed::TERMINATE} - case TERMINATE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &final_s, // target state - { - &doorClosed_x, // exit - &final_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::ToastOven::SM::doorClosed::OPEN} - case OPEN_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &doorOpen_s, // target state - { - &doorClosed_x, // exit - &doorOpen_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::ToastOven::SM::doorClosed::TOAST} - case TOAST_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &toasting_s, // target state - { - &heating_e, // entry - &toasting_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::ToastOven::SM::doorClosed::BAKE} - case BAKE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &baking_s, // target state - { - &heating_e, // entry - &baking_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::ToastOven::SM::doorClosed::OFF} - case OFF_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &off_s, // target state - { - &off_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating} ................................. -QP::QMState const ToastOven::heating_s = { - &ToastOven::doorClosed_s, // superstate - &ToastOven::heating, - &ToastOven::heating_e, - &ToastOven::heating_x, - &ToastOven::heating_i -}; -//${SMs::ToastOven::SM::doorClosed::heating} -QM_ACTION_DEF(ToastOven, heating_e) { - PRINTF_S("%s;", "heater-On"); - return qm_entry(&heating_s); -} -//${SMs::ToastOven::SM::doorClosed::heating} -QM_ACTION_DEF(ToastOven, heating_x) { - PRINTF_S("%s;", "heater-Off"); - return qm_exit(&heating_s); -} -//${SMs::ToastOven::SM::doorClosed::heating::initial} -QM_ACTION_DEF(ToastOven, heating_i) { - //${SMs::ToastOven::SM::doorClosed::heating::initial} - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &toasting_s, // target state - { - &toasting_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::ToastOven::SM::doorClosed::heating} -QM_STATE_DEF(ToastOven, heating) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating::toasting} ....................... -QP::QMState const ToastOven::toasting_s = { - &ToastOven::heating_s, // superstate - &ToastOven::toasting, - &ToastOven::toasting_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${SMs::ToastOven::SM::doorClosed::heating::toasting} -QM_ACTION_DEF(ToastOven, toasting_e) { - PRINTF_S("%s;", "toasting"); - return qm_entry(&toasting_s); -} -//${SMs::ToastOven::SM::doorClosed::heating::toasting} -QM_STATE_DEF(ToastOven, toasting) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::heating::baking} ......................... -QP::QMState const ToastOven::baking_s = { - &ToastOven::heating_s, // superstate - &ToastOven::baking, - &ToastOven::baking_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${SMs::ToastOven::SM::doorClosed::heating::baking} -QM_ACTION_DEF(ToastOven, baking_e) { - PRINTF_S("%s;", "baking"); - return qm_entry(&baking_s); -} -//${SMs::ToastOven::SM::doorClosed::heating::baking} -QM_STATE_DEF(ToastOven, baking) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorClosed::off} ..................................... -QP::QMState const ToastOven::off_s = { - &ToastOven::doorClosed_s, // superstate - &ToastOven::off, - &ToastOven::off_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${SMs::ToastOven::SM::doorClosed::off} -QM_ACTION_DEF(ToastOven, off_e) { - PRINTF_S("%s;", "toaster-Off"); - return qm_entry(&off_s); -} -//${SMs::ToastOven::SM::doorClosed::off} -QM_STATE_DEF(ToastOven, off) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::doorOpen} ............................................ -QP::QMState const ToastOven::doorOpen_s = { - QM_STATE_NULL, // superstate (top) - &ToastOven::doorOpen, - &ToastOven::doorOpen_e, - &ToastOven::doorOpen_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::ToastOven::SM::doorOpen} -QM_ACTION_DEF(ToastOven, doorOpen_e) { - PRINTF_S("%s;", "door-Open,lamp-On"); - return qm_entry(&doorOpen_s); -} -//${SMs::ToastOven::SM::doorOpen} -QM_ACTION_DEF(ToastOven, doorOpen_x) { - PRINTF_S("%s;", "lamp-Off"); - return qm_exit(&doorOpen_s); -} -//${SMs::ToastOven::SM::doorOpen} -QM_STATE_DEF(ToastOven, doorOpen) { - QP::QState status_; - switch (e->sig) { - //${SMs::ToastOven::SM::doorOpen::CLOSE} - case CLOSE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &doorClosed_s, // target state - { - &doorOpen_x, // exit - &doorClosed_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran_hist(hist_doorClosed, &tatbl_); - break; - } - //${SMs::ToastOven::SM::doorOpen::TERMINATE} - case TERMINATE_SIG: { - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &final_s, // target state - { - &doorOpen_x, // exit - &final_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::ToastOven::SM::final} ............................................... -QP::QMState const ToastOven::final_s = { - QM_STATE_NULL, // superstate (top) - &ToastOven::final, - &ToastOven::final_e, - Q_ACTION_NULL, // no exit action - Q_ACTION_NULL // no initial tran. -}; -//${SMs::ToastOven::SM::final} -QM_ACTION_DEF(ToastOven, final_e) { - PRINTF_S("%s\n", "-> final\nBye!Bye!"); - QP::QF::onCleanup(); - exit(0); - return qm_entry(&final_s); -} -//${SMs::ToastOven::SM::final} -QM_STATE_DEF(ToastOven, final) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} -//$enddef${SMs::ToastOven} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/history_qmsm/history.hpp b/examples/posix-win32/history_qmsm/history.hpp deleted file mode 100644 index 2033763db..000000000 --- a/examples/posix-win32/history_qmsm/history.hpp +++ /dev/null @@ -1,45 +0,0 @@ -//$file${.::history.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: history.qm -// File: ${.::history.hpp} -// -// This code has been generated by QM 5.2.4 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::history.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef HISTORY_HPP -#define HISTORY_HPP - -enum ToastOvenSignals { - OPEN_SIG = QP::Q_USER_SIG, - CLOSE_SIG, - TOAST_SIG, - BAKE_SIG, - OFF_SIG, - TERMINATE_SIG // terminate the application -}; - -extern QP::QMsm * const the_oven; // opaque pointer to the oven MSM - -#endif // HISTORY_HPP diff --git a/examples/posix-win32/history_qmsm/history.qm b/examples/posix-win32/history_qmsm/history.qm deleted file mode 100644 index 97a8ecaca..000000000 --- a/examples/posix-win32/history_qmsm/history.qm +++ /dev/null @@ -1,182 +0,0 @@ - - - Transition to history in a subclass of QP::QMsm - - - - - - - Oven state machine - - - constructor - : QMsm(Q_STATE_CAST(&ToastOven::initial)) - - - - - - (void)e; /* avoid compiler warning */ - - - - - - - PRINTF_S("%s;", "door-Closed"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PRINTF_S("%s;", "heater-On"); - PRINTF_S("%s;", "heater-Off"); - - - - - - - - - PRINTF_S("%s;", "toasting"); - - - - - - - PRINTF_S("%s;", "baking"); - - - - - - - - - - - - PRINTF_S("%s;", "toaster-Off"); - - - - - - - - - - - PRINTF_S("%s;", "door-Open,lamp-On"); - PRINTF_S("%s;", "lamp-Off"); - - - - - - - - - - - - - - - - - - - - PRINTF_S("%s\n", "-> final\nBye!Bye!"); -QP::QF::onCleanup(); -exit(0); - - - - - - - - - - - - - #ifndef HISTORY_HPP -#define HISTORY_HPP - -enum ToastOvenSignals { - OPEN_SIG = QP::Q_USER_SIG, - CLOSE_SIG, - TOAST_SIG, - BAKE_SIG, - OFF_SIG, - TERMINATE_SIG // terminate the application -}; - -extern QP::QMsm * const the_oven; // opaque pointer to the oven MSM - -#endif // HISTORY_HPP - - - - #include "qpcpp.hpp" -#include "history.hpp" - -#include "safe_std.h" // portable "safe" <stdio.h>/<string.h> facilities -#include <stdlib.h> - -Q_DEFINE_THIS_FILE - -$declare(SMs::ToastOven) - -static ToastOven l_oven; // the only instance of the ToastOven class - -// global-scope definitions ------------------------------------ -QP::QMsm * const the_oven = &l_oven; // the opaque pointer - -$define(SMs::ToastOven) - - - diff --git a/examples/posix-win32/history_qmsm/main.cpp b/examples/posix-win32/history_qmsm/main.cpp deleted file mode 100644 index 2d3e0acae..000000000 --- a/examples/posix-win32/history_qmsm/main.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//============================================================================ -// Product: Transition to History Example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-02 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP API -#include "history.hpp" // application - -#include "safe_std.h" // portable "safe" / facilities -#include - -using namespace QP; -using namespace std; - -//............................................................................ -int main() { - - QF::init(); - QF::onStartup(); - - PRINTF_S("History state pattern\nQEP version: %s\n" - "Press 'o' to OPEN the door\n" - "Press 'c' to CLOSE the door\n" - "Press 't' to start TOASTING\n" - "Press 'b' to start BAKING\n" - "Press 'f' to turn the oven OFF\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - // instantiate the ToastOven HSM and trigger the initial transition - the_oven->init(0U); - - for (;;) { - - PRINTF_S("\n", ""); - - uint8_t c = (uint8_t)QF::consoleWaitForKey(); - PRINTF_S("%c: ", c); - - QP::QSignal sig = 0U; - switch (c) { - case 'o': sig = OPEN_SIG; break; - case 'c': sig = CLOSE_SIG; break; - case 't': sig = TOAST_SIG; break; - case 'b': sig = BAKE_SIG; break; - case 'f': sig = OFF_SIG; break; - case 0x1B: sig = TERMINATE_SIG; break; - } - - // dispatch the event into the state machine - QEvt const e(sig); - the_oven->dispatch(&e, 0U); - } - - QF::onCleanup(); - return 0; -} - -namespace QP { -/*..........................................................................*/ -void QF::onStartup(void) { - QF::consoleSetup(); -} -/*..........................................................................*/ -void QF::onCleanup(void) { - QF::consoleCleanup(); -} -/*..........................................................................*/ -void QF::onClockTick(void) { -} - -} // namespace QP - -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - FPRINTF_S(stderr, "Assertion failed in %s, line %d", file, line); - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/qhsmtst/Makefile b/examples/posix-win32/qhsmtst/Makefile deleted file mode 100644 index e809ef8a1..000000000 --- a/examples/posix-win32/qhsmtst/Makefile +++ /dev/null @@ -1,233 +0,0 @@ -############################################################################## -# Product: Makefile for QEP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.0 -# Last updated on 2023-09-02 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make clean # cleanup the build -# make CONF=rel clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := qhsmtst - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . - -# list of all include directories needed by this project -INCLUDES := -I. - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -QP_PORT_DIR := $(QPCPP)/ports/qep-only - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - main.cpp \ - qhsmtst.cpp \ - qep_hsm.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/qhsmtst/log.txt b/examples/posix-win32/qhsmtst/log.txt deleted file mode 100644 index 5a5349bb9..000000000 --- a/examples/posix-win32/qhsmtst/log.txt +++ /dev/null @@ -1,23 +0,0 @@ -QHsmTst example, QP 7.3.0 -top-INIT;s-ENTRY;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -A:s21-A;s211-EXIT;s21-EXIT;s21-ENTRY;s21-INIT;s211-ENTRY; -B:s21-B;s211-EXIT;s211-ENTRY; -D:s211-D;s211-EXIT;s21-INIT;s211-ENTRY; -E:s-E;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY; -I:s1-I; -F:s1-F;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY; -I:s2-I; -I:s-I; -F:s2-F;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY; -A:s1-A;s11-EXIT;s1-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; -B:s1-B;s11-EXIT;s11-ENTRY; -D:s1-D;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -D:s11-D;s11-EXIT;s1-INIT;s11-ENTRY; -E:s-E;s11-EXIT;s1-EXIT;s1-ENTRY;s11-ENTRY; -G:s11-G;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY; -H:s211-H;s211-EXIT;s21-EXIT;s2-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -H:s11-H;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -G:s21-G;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; -C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -C:s2-C;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; \ No newline at end of file diff --git a/examples/posix-win32/qhsmtst/main.cpp b/examples/posix-win32/qhsmtst/main.cpp deleted file mode 100644 index 7a9170e2d..000000000 --- a/examples/posix-win32/qhsmtst/main.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//============================================================================ -// Product: QHsmTst Example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ - -#include "qpcpp.hpp" // QP/C++ framework -#include "qhsmtst.hpp" // QHsmTst state machine - -#include "safe_std.h" // portable "safe" / facilities -#include // for exit() - -Q_DEFINE_THIS_FILE - -// Local objects ------------------------------------------------------------- -static FILE *l_outFile = (FILE *)0; -static void dispatch(QP::QSignal sig); - -//............................................................................ -int main(int argc, char *argv[ ]) { - - if (argc > 1) { // file name provided? - FOPEN_S(l_outFile, argv[1], "w"); - } - - if (l_outFile == (FILE *)0) { // interactive version? - l_outFile = stdout; - - PRINTF_S("QHsmTst example, built on %s at %s\n" - "QEP: %s.\nEnter x or X quit...\n", - __DATE__, __TIME__, QP_VERSION_STR); - - APP::the_sm->init(0U); // trigger the initial tran. in the test SM - - for (;;) { // event loop - PRINTF_S("\n%s", ">>>"); - char inp[4]; - scanf("%1s", inp); // input the event - - QP::QSignal sig = 0U; - if ('a' <= inp[0] && inp[0] <= 'i') { // in range? - sig = (QP::QSignal)(inp[0] - 'a' + APP::A_SIG); - } - else if ('A' <= inp[0] && inp[0] <= 'I') { // in range? - sig = (QP::QSignal)(inp[0] - 'A' + APP::A_SIG); - } - else if ((inp[0] == 'x') || (inp[0] == 'X')) { // x or X? - sig = APP::TERMINATE_SIG; // terminate the interactive test - } - else { - sig = APP::IGNORE_SIG; - } - - QP::QEvt const e(sig); - APP::the_sm->dispatch(&e, 0U); // dispatch the event - } - } - else { // batch version - PRINTF_S("QHsmTst, output saved to %s\n", argv[1]); - FPRINTF_S(l_outFile, - "QHsmTst example, QP %s\n", QP_VERSION_STR); - - APP::the_sm->init(0U); // trigger the initial tran. in the test SM - - // dynamic transitions - dispatch(APP::A_SIG); - dispatch(APP::B_SIG); - dispatch(APP::D_SIG); - dispatch(APP::E_SIG); - dispatch(APP::I_SIG); - dispatch(APP::F_SIG); - dispatch(APP::I_SIG); - dispatch(APP::I_SIG); - dispatch(APP::F_SIG); - dispatch(APP::A_SIG); - dispatch(APP::B_SIG); - dispatch(APP::D_SIG); - dispatch(APP::D_SIG); - dispatch(APP::E_SIG); - dispatch(APP::G_SIG); - dispatch(APP::H_SIG); - dispatch(APP::H_SIG); - dispatch(APP::C_SIG); - dispatch(APP::G_SIG); - dispatch(APP::C_SIG); - dispatch(APP::C_SIG); - - fclose(l_outFile); - } - - return 0; -} -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - FPRINTF_S(stderr, "Assertion failed in %s, line %d", file, line); - exit(-1); -} -//............................................................................ -static void dispatch(QP::QSignal sig) { - Q_REQUIRE((APP::A_SIG <= sig) && (sig <= APP::I_SIG)); - FPRINTF_S(l_outFile, "\n%c:", 'A' + sig - APP::A_SIG); - QP::QEvt e(sig); - APP::the_sm->dispatch(&e, 0U); // dispatch the event -} - -namespace APP { -//............................................................................ -void BSP_display(char const *msg) { - FPRINTF_S(l_outFile, "%s", msg); -} -//............................................................................ -void BSP_terminate(int16_t const result) { - PRINTF_S("%s", "Bye, Bye!"); - exit(result); -} - -} // namespace APP diff --git a/examples/posix-win32/qhsmtst/qhsmtst.cpp b/examples/posix-win32/qhsmtst/qhsmtst.cpp deleted file mode 100644 index 8fb48f49a..000000000 --- a/examples/posix-win32/qhsmtst/qhsmtst.cpp +++ /dev/null @@ -1,429 +0,0 @@ -//$file${.::qhsmtst.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qhsmtst.qm -// File: ${.::qhsmtst.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qhsmtst.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ framework -#include "qhsmtst.hpp" // QHsmTst state machine - -//$declare${SMs::QHsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${SMs::QHsmTst} ............................................................ -class QHsmTst : public QP::QHsm { -private: - bool m_foo; - -public: - static QHsmTst inst; - -public: - QHsmTst() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(s); - Q_STATE_DECL(s1); - Q_STATE_DECL(s11); - Q_STATE_DECL(s2); - Q_STATE_DECL(s21); - Q_STATE_DECL(s211); -}; // class QHsmTst - -} // namespace APP -//$enddecl${SMs::QHsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::the_sm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::the_sm} .......................................................... -QP::QAsm * const the_sm = &QHsmTst::inst; - -} // namespace APP -//$enddef${Shared::the_sm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${SMs::QHsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${SMs::QHsmTst} ............................................................ -QHsmTst QHsmTst::inst; - -//${SMs::QHsmTst::SM} ........................................................ -Q_STATE_DEF(QHsmTst, initial) { - //${SMs::QHsmTst::SM::initial} - Q_UNUSED_PAR(e); - m_foo = 0U; - BSP_display("top-INIT;"); - - QS_SIG_DICTIONARY(A_SIG, nullptr); - QS_SIG_DICTIONARY(B_SIG, nullptr); - QS_SIG_DICTIONARY(C_SIG, nullptr); - QS_SIG_DICTIONARY(D_SIG, nullptr); - QS_SIG_DICTIONARY(E_SIG, nullptr); - QS_SIG_DICTIONARY(F_SIG, nullptr); - QS_SIG_DICTIONARY(G_SIG, nullptr); - QS_SIG_DICTIONARY(H_SIG, nullptr); - QS_SIG_DICTIONARY(I_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - QS_FUN_DICTIONARY(&QHsmTst::s); - QS_FUN_DICTIONARY(&QHsmTst::s1); - QS_FUN_DICTIONARY(&QHsmTst::s11); - QS_FUN_DICTIONARY(&QHsmTst::s2); - QS_FUN_DICTIONARY(&QHsmTst::s21); - QS_FUN_DICTIONARY(&QHsmTst::s211); - - return tran(&s2); -} - -//${SMs::QHsmTst::SM::s} ..................................................... -Q_STATE_DEF(QHsmTst, s) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s} - case Q_ENTRY_SIG: { - BSP_display("s-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s} - case Q_EXIT_SIG: { - BSP_display("s-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::initial} - case Q_INIT_SIG: { - BSP_display("s-INIT;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::I} - case I_SIG: { - //${SMs::QHsmTst::SM::s::I::[m_foo]} - if (m_foo) { - m_foo = 0U; - BSP_display("s-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::E} - case E_SIG: { - BSP_display("s-E;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::TERMINATE} - case TERMINATE_SIG: { - BSP_terminate(0); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s1} ................................................. -Q_STATE_DEF(QHsmTst, s1) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s1} - case Q_ENTRY_SIG: { - BSP_display("s1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1} - case Q_EXIT_SIG: { - BSP_display("s1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::initial} - case Q_INIT_SIG: { - BSP_display("s1-INIT;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s1::I} - case I_SIG: { - BSP_display("s1-I;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::D} - case D_SIG: { - //${SMs::QHsmTst::SM::s::s1::D::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s1-D;"); - status_ = tran(&s); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s1::A} - case A_SIG: { - BSP_display("s1-A;"); - status_ = tran(&s1); - break; - } - //${SMs::QHsmTst::SM::s::s1::B} - case B_SIG: { - BSP_display("s1-B;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s1::F} - case F_SIG: { - BSP_display("s1-F;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s1::C} - case C_SIG: { - BSP_display("s1-C;"); - status_ = tran(&s2); - break; - } - default: { - status_ = super(&s); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s1::s11} ............................................ -Q_STATE_DEF(QHsmTst, s11) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s1::s11} - case Q_ENTRY_SIG: { - BSP_display("s11-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::s11} - case Q_EXIT_SIG: { - BSP_display("s11-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::H} - case H_SIG: { - BSP_display("s11-H;"); - status_ = tran(&s); - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::D} - case D_SIG: { - //${SMs::QHsmTst::SM::s::s1::s11::D::[m_foo]} - if (m_foo) { - m_foo = false; - BSP_display("s11-D;"); - status_ = tran(&s1); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::G} - case G_SIG: { - BSP_display("s11-G;"); - status_ = tran(&s211); - break; - } - default: { - status_ = super(&s1); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2} ................................................. -Q_STATE_DEF(QHsmTst, s2) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2} - case Q_ENTRY_SIG: { - BSP_display("s2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2} - case Q_EXIT_SIG: { - BSP_display("s2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::initial} - case Q_INIT_SIG: { - BSP_display("s2-INIT;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s2::I} - case I_SIG: { - //${SMs::QHsmTst::SM::s::s2::I::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s2-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s2::F} - case F_SIG: { - BSP_display("s2-F;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s2::C} - case C_SIG: { - BSP_display("s2-C;"); - status_ = tran(&s1); - break; - } - default: { - status_ = super(&s); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2::s21} ............................................ -Q_STATE_DEF(QHsmTst, s21) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2::s21} - case Q_ENTRY_SIG: { - BSP_display("s21-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21} - case Q_EXIT_SIG: { - BSP_display("s21-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::initial} - case Q_INIT_SIG: { - BSP_display("s21-INIT;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::G} - case G_SIG: { - BSP_display("s21-G;"); - status_ = tran(&s1); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::A} - case A_SIG: { - BSP_display("s21-A;"); - status_ = tran(&s21); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::B} - case B_SIG: { - BSP_display("s21-B;"); - status_ = tran(&s211); - break; - } - default: { - status_ = super(&s2); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2::s21::s211} ...................................... -Q_STATE_DEF(QHsmTst, s211) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2::s21::s211} - case Q_ENTRY_SIG: { - BSP_display("s211-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211} - case Q_EXIT_SIG: { - BSP_display("s211-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211::H} - case H_SIG: { - BSP_display("s211-H;"); - status_ = tran(&s); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211::D} - case D_SIG: { - BSP_display("s211-D;"); - status_ = tran(&s21); - break; - } - default: { - status_ = super(&s21); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${SMs::QHsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/qhsmtst/qhsmtst.hpp b/examples/posix-win32/qhsmtst/qhsmtst.hpp deleted file mode 100644 index c794ca99c..000000000 --- a/examples/posix-win32/qhsmtst/qhsmtst.hpp +++ /dev/null @@ -1,65 +0,0 @@ -//$file${.::qhsmtst.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qhsmtst.qm -// File: ${.::qhsmtst.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qhsmtst.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef QHSMTST_HPP_ -#define QHSMTST_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::QHsmTstSignals} .................................................. -enum QHsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -//${Shared::the_sm} .......................................................... -extern QP::QAsm * const the_sm; - -//${Shared::BSP_display} ..................................................... -void BSP_display(char const * msg); - -//${Shared::BSP_terminate} ................................................... -void BSP_terminate(std::int16_t const result); - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // QHSMTST_HPP_ diff --git a/examples/posix-win32/qhsmtst/qhsmtst.qm b/examples/posix-win32/qhsmtst/qhsmtst.qm deleted file mode 100644 index c4ba10750..000000000 --- a/examples/posix-win32/qhsmtst/qhsmtst.qm +++ /dev/null @@ -1,358 +0,0 @@ - - - QHsmTst is a contrived state machine from Chapter 2 of the PSiCC2 book for testing all possible transition topologies with up to 4-levels of state nesting. - -NOTE: This example uses only the "QEP" component of the QP/C++ framework. - - - - - - - { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - - - - opaque pointer to the test SM - = &QHsmTst::inst; - - - - - - - - - - - - - - - - - Test active object - - - - - - - : QHsm(&initial) - - - - - - Q_UNUSED_PAR(e); -m_foo = 0U; -BSP_display("top-INIT;"); - -QS_SIG_DICTIONARY(A_SIG, nullptr); -QS_SIG_DICTIONARY(B_SIG, nullptr); -QS_SIG_DICTIONARY(C_SIG, nullptr); -QS_SIG_DICTIONARY(D_SIG, nullptr); -QS_SIG_DICTIONARY(E_SIG, nullptr); -QS_SIG_DICTIONARY(F_SIG, nullptr); -QS_SIG_DICTIONARY(G_SIG, nullptr); -QS_SIG_DICTIONARY(H_SIG, nullptr); -QS_SIG_DICTIONARY(I_SIG, nullptr); -QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); -QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - - - - - - BSP_display("s-ENTRY;"); - BSP_display("s-EXIT;"); - - - BSP_display("s-INIT;"); - - - - - - - - - m_foo - m_foo = 0U; -BSP_display("s-I;"); - - - - - - - - - - - BSP_display("s-E;"); - - - - - - - BSP_terminate(0); - - - - - - - BSP_display("s1-ENTRY;"); - BSP_display("s1-EXIT;"); - - - BSP_display("s1-INIT;"); - - - - - - - BSP_display("s1-I;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s1-D;"); - - - - - - - - - - - BSP_display("s1-A;"); - - - - - - - BSP_display("s1-B;"); - - - - - - - BSP_display("s1-F;"); - - - - - - - BSP_display("s1-C;"); - - - - - - - BSP_display("s11-ENTRY;"); - BSP_display("s11-EXIT;"); - - - BSP_display("s11-H;"); - - - - - - - - - m_foo - m_foo = false; -BSP_display("s11-D;"); - - - - - - - - - - - BSP_display("s11-G;"); - - - - - - - - - - - - - - - - - BSP_display("s2-ENTRY;"); - BSP_display("s2-EXIT;"); - - - BSP_display("s2-INIT;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s2-I;"); - - - - - - - - - - - BSP_display("s2-F;"); - - - - - - - BSP_display("s2-C;"); - - - - - - - BSP_display("s21-ENTRY;"); - BSP_display("s21-EXIT;"); - - - BSP_display("s21-INIT;"); - - - - - - - BSP_display("s21-G;"); - - - - - - - BSP_display("s21-A;"); - - - - - - - BSP_display("s21-B;"); - - - - - - - BSP_display("s211-ENTRY;"); - BSP_display("s211-EXIT;"); - - - BSP_display("s211-H;"); - - - - - - - BSP_display("s211-D;"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef QHSMTST_HPP_ -#define QHSMTST_HPP_ - -$declare ${Shared} - -#endif // QHSMTST_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ framework -#include "qhsmtst.hpp" // QHsmTst state machine - -$declare ${SMs::QHsmTst} -$define ${Shared::the_sm} -$define ${SMs::QHsmTst} - - - diff --git a/examples/posix-win32/qmsmtst/Makefile b/examples/posix-win32/qmsmtst/Makefile deleted file mode 100644 index f89a670b8..000000000 --- a/examples/posix-win32/qmsmtst/Makefile +++ /dev/null @@ -1,233 +0,0 @@ -############################################################################## -# Product: Makefile for QEP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.0 -# Last updated on 2023-09-02 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make clean # cleanup the build -# make CONF=rel clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := qmsmtst - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . - -# list of all include directories needed by this project -INCLUDES := -I. - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -QP_PORT_DIR := $(QPCPP)/ports/qep-only - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - main.cpp \ - qmsmtst.cpp \ - qep_msm.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# It is assumed that $(QTOOLS)/bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/qmsmtst/log.txt b/examples/posix-win32/qmsmtst/log.txt deleted file mode 100644 index 2a735af7f..000000000 --- a/examples/posix-win32/qmsmtst/log.txt +++ /dev/null @@ -1,23 +0,0 @@ -QMsmTst example, QP 7.3.0 -top-INIT;s-ENTRY;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -A:s21-A;s211-EXIT;s21-EXIT;s21-ENTRY;s21-INIT;s211-ENTRY; -B:s21-B;s211-EXIT;s211-ENTRY; -D:s211-D;s211-EXIT;s21-INIT;s211-ENTRY; -E:s-E;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY; -I:s1-I; -F:s1-F;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY; -I:s2-I; -I:s-I; -F:s2-F;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY; -A:s1-A;s11-EXIT;s1-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; -B:s1-B;s11-EXIT;s11-ENTRY; -D:s1-D;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -D:s11-D;s11-EXIT;s1-INIT;s11-ENTRY; -E:s-E;s11-EXIT;s1-EXIT;s1-ENTRY;s11-ENTRY; -G:s11-G;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY; -H:s211-H;s211-EXIT;s21-EXIT;s2-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -H:s11-H;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY; -C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -G:s21-G;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; -C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY; -C:s2-C;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY; \ No newline at end of file diff --git a/examples/posix-win32/qmsmtst/main.cpp b/examples/posix-win32/qmsmtst/main.cpp deleted file mode 100644 index c8b5134b8..000000000 --- a/examples/posix-win32/qmsmtst/main.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//============================================================================ -// Product: QMsmTst Example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-09-06 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ - -#include "qpcpp.hpp" // QP/C++ framework -#include "qmsmtst.hpp" // QMsmTst state machine - -#include "safe_std.h" // portable "safe" / facilities -#include // for exit() - -Q_DEFINE_THIS_FILE - -// Local objects ------------------------------------------------------------- -static FILE *l_outFile = (FILE *)0; -static void dispatch(QP::QSignal sig); - -//............................................................................ -int main(int argc, char *argv[ ]) { - - if (argc > 1) { // file name provided? - FOPEN_S(l_outFile, argv[1], "w"); - } - - if (l_outFile == (FILE *)0) { // interactive version? - l_outFile = stdout; - - PRINTF_S("QMsmTst example, built on %s at %s\n" - "QEP: %s.\nEnter x or X quit...\n", - __DATE__, __TIME__, QP_VERSION_STR); - - APP::the_sm->init(0U); // trigger the initial tran. in the test SM - - for (;;) { // event loop - PRINTF_S("\n%s", ">>>"); - char inp[4]; - scanf("%1s", inp); // input the event - - QP::QSignal sig = 0U; - if ('a' <= inp[0] && inp[0] <= 'i') { // in range? - sig = (QP::QSignal)(inp[0] - 'a' + APP::A_SIG); - } - else if ('A' <= inp[0] && inp[0] <= 'I') { // in range? - sig = (QP::QSignal)(inp[0] - 'A' + APP::A_SIG); - } - else if ((inp[0] == 'x') || (inp[0] == 'X')) { // x or X? - sig = APP::TERMINATE_SIG; // terminate the interactive test - } - else { - sig = APP::IGNORE_SIG; - } - - QP::QEvt const e(sig); - APP::the_sm->dispatch(&e, 0U); // dispatch the event - } - } - else { // batch version - PRINTF_S("QMsmTst, output saved to %s\n", argv[1]); - FPRINTF_S(l_outFile, - "QMsmTst example, QP %s\n", QP_VERSION_STR); - - APP::the_sm->init(0U); // trigger the initial tran. in the test SM - - // dynamic transitions - dispatch(APP::A_SIG); - dispatch(APP::B_SIG); - dispatch(APP::D_SIG); - dispatch(APP::E_SIG); - dispatch(APP::I_SIG); - dispatch(APP::F_SIG); - dispatch(APP::I_SIG); - dispatch(APP::I_SIG); - dispatch(APP::F_SIG); - dispatch(APP::A_SIG); - dispatch(APP::B_SIG); - dispatch(APP::D_SIG); - dispatch(APP::D_SIG); - dispatch(APP::E_SIG); - dispatch(APP::G_SIG); - dispatch(APP::H_SIG); - dispatch(APP::H_SIG); - dispatch(APP::C_SIG); - dispatch(APP::G_SIG); - dispatch(APP::C_SIG); - dispatch(APP::C_SIG); - - fclose(l_outFile); - } - - return 0; -} -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - FPRINTF_S(stderr, "Assertion failed in %s, line %d", file, line); - exit(-1); -} -//............................................................................ -static void dispatch(QP::QSignal sig) { - Q_REQUIRE((APP::A_SIG <= sig) && (sig <= APP::I_SIG)); - FPRINTF_S(l_outFile, "\n%c:", 'A' + sig - APP::A_SIG); - QP::QEvt e(sig); - APP::the_sm->dispatch(&e, 0U); // dispatch the event -} - -namespace APP { -//............................................................................ -void BSP_display(char const *msg) { - FPRINTF_S(l_outFile, "%s", msg); -} -//............................................................................ -void BSP_terminate(int16_t const result) { - PRINTF_S("%s", "Bye, Bye!"); - exit(result); -} - -} // namespace APP diff --git a/examples/posix-win32/qmsmtst/qmsmtst.cpp b/examples/posix-win32/qmsmtst/qmsmtst.cpp deleted file mode 100644 index 193c73aa0..000000000 --- a/examples/posix-win32/qmsmtst/qmsmtst.cpp +++ /dev/null @@ -1,744 +0,0 @@ -//$file${.::qmsmtst.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qmsmtst.qm -// File: ${.::qmsmtst.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qmsmtst.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ framework -#include "qmsmtst.hpp" // QMsmTst state machine - -//$declare${SMs::QMsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${SMs::QMsmTst} ............................................................ -class QMsmTst : public QP::QMsm { -private: - bool m_foo; - -public: - static QMsmTst inst; - -public: - QMsmTst() - : QMsm(&initial) - {} - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( s); - QM_ACTION_DECL(s_e); - QM_ACTION_DECL(s_x); - QM_ACTION_DECL(s_i); - QM_STATE_DECL( s1); - QM_ACTION_DECL(s1_e); - QM_ACTION_DECL(s1_x); - QM_ACTION_DECL(s1_i); - QM_STATE_DECL( s11); - QM_ACTION_DECL(s11_e); - QM_ACTION_DECL(s11_x); - QM_STATE_DECL( s2); - QM_ACTION_DECL(s2_e); - QM_ACTION_DECL(s2_x); - QM_ACTION_DECL(s2_i); - QM_STATE_DECL( s21); - QM_ACTION_DECL(s21_e); - QM_ACTION_DECL(s21_x); - QM_ACTION_DECL(s21_i); - QM_STATE_DECL( s211); - QM_ACTION_DECL(s211_e); - QM_ACTION_DECL(s211_x); -}; // class QMsmTst - -} // namespace APP -//$enddecl${SMs::QMsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::the_sm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::the_sm} .......................................................... -QP::QAsm * const the_sm = &QMsmTst::inst; - -} // namespace APP -//$enddef${Shared::the_sm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${SMs::QMsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${SMs::QMsmTst} ............................................................ -QMsmTst QMsmTst::inst; - -//${SMs::QMsmTst::SM} ........................................................ -QM_STATE_DEF(QMsmTst, initial) { - //${SMs::QMsmTst::SM::initial} - Q_UNUSED_PAR(e); - m_foo = 0U; - BSP_display("top-INIT;"); - - QS_SIG_DICTIONARY(A_SIG, nullptr); - QS_SIG_DICTIONARY(B_SIG, nullptr); - QS_SIG_DICTIONARY(C_SIG, nullptr); - QS_SIG_DICTIONARY(D_SIG, nullptr); - QS_SIG_DICTIONARY(E_SIG, nullptr); - QS_SIG_DICTIONARY(F_SIG, nullptr); - QS_SIG_DICTIONARY(G_SIG, nullptr); - QS_SIG_DICTIONARY(H_SIG, nullptr); - QS_SIG_DICTIONARY(I_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - QS_FUN_DICTIONARY(&QMsmTst::s); - QS_FUN_DICTIONARY(&QMsmTst::s1); - QS_FUN_DICTIONARY(&QMsmTst::s11); - QS_FUN_DICTIONARY(&QMsmTst::s2); - QS_FUN_DICTIONARY(&QMsmTst::s21); - QS_FUN_DICTIONARY(&QMsmTst::s211); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s2_s, // target state - { - &s_e, // entry - &s2_e, // entry - &s2_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${SMs::QMsmTst::SM::s} ..................................................... -QP::QMState const QMsmTst::s_s = { - QM_STATE_NULL, // superstate (top) - &QMsmTst::s, - &QMsmTst::s_e, - &QMsmTst::s_x, - &QMsmTst::s_i -}; -//${SMs::QMsmTst::SM::s} -QM_ACTION_DEF(QMsmTst, s_e) { - BSP_display("s-ENTRY;"); - return qm_entry(&s_s); -} -//${SMs::QMsmTst::SM::s} -QM_ACTION_DEF(QMsmTst, s_x) { - BSP_display("s-EXIT;"); - return qm_exit(&s_s); -} -//${SMs::QMsmTst::SM::s::initial} -QM_ACTION_DEF(QMsmTst, s_i) { - //${SMs::QMsmTst::SM::s::initial} - BSP_display("s-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s} -QM_STATE_DEF(QMsmTst, s) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::I} - case I_SIG: { - //${SMs::QMsmTst::SM::s::I::[m_foo]} - if (m_foo) { - m_foo = 0U; - BSP_display("s-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::E} - case E_SIG: { - BSP_display("s-E;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::TERMINATE} - case TERMINATE_SIG: { - BSP_terminate(0); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s1} ................................................. -QP::QMState const QMsmTst::s1_s = { - &QMsmTst::s_s, // superstate - &QMsmTst::s1, - &QMsmTst::s1_e, - &QMsmTst::s1_x, - &QMsmTst::s1_i -}; -//${SMs::QMsmTst::SM::s::s1} -QM_ACTION_DEF(QMsmTst, s1_e) { - BSP_display("s1-ENTRY;"); - return qm_entry(&s1_s); -} -//${SMs::QMsmTst::SM::s::s1} -QM_ACTION_DEF(QMsmTst, s1_x) { - BSP_display("s1-EXIT;"); - return qm_exit(&s1_s); -} -//${SMs::QMsmTst::SM::s::s1::initial} -QM_ACTION_DEF(QMsmTst, s1_i) { - //${SMs::QMsmTst::SM::s::s1::initial} - BSP_display("s1-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s1} -QM_STATE_DEF(QMsmTst, s1) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s1::I} - case I_SIG: { - BSP_display("s1-I;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QMsmTst::SM::s::s1::D} - case D_SIG: { - //${SMs::QMsmTst::SM::s::s1::D::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s1-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s1_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s1::A} - case A_SIG: { - BSP_display("s1-A;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s1_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::B} - case B_SIG: { - BSP_display("s1-B;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::F} - case F_SIG: { - BSP_display("s1-F;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s1_x, // exit - &s2_e, // entry - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::C} - case C_SIG: { - BSP_display("s1-C;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s2_s, // target state - { - &s1_x, // exit - &s2_e, // entry - &s2_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s1::s11} ............................................ -QP::QMState const QMsmTst::s11_s = { - &QMsmTst::s1_s, // superstate - &QMsmTst::s11, - &QMsmTst::s11_e, - &QMsmTst::s11_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::QMsmTst::SM::s::s1::s11} -QM_ACTION_DEF(QMsmTst, s11_e) { - BSP_display("s11-ENTRY;"); - return qm_entry(&s11_s); -} -//${SMs::QMsmTst::SM::s::s1::s11} -QM_ACTION_DEF(QMsmTst, s11_x) { - BSP_display("s11-EXIT;"); - return qm_exit(&s11_s); -} -//${SMs::QMsmTst::SM::s::s1::s11} -QM_STATE_DEF(QMsmTst, s11) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s1::s11::H} - case H_SIG: { - BSP_display("s11-H;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s11_x, // exit - &s1_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::s11::D} - case D_SIG: { - //${SMs::QMsmTst::SM::s::s1::s11::D::[m_foo]} - if (m_foo) { - m_foo = false; - BSP_display("s11-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s11_x, // exit - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s1::s11::G} - case G_SIG: { - BSP_display("s11-G;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[6]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s11_x, // exit - &s1_x, // exit - &s2_e, // entry - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2} ................................................. -QP::QMState const QMsmTst::s2_s = { - &QMsmTst::s_s, // superstate - &QMsmTst::s2, - &QMsmTst::s2_e, - &QMsmTst::s2_x, - &QMsmTst::s2_i -}; -//${SMs::QMsmTst::SM::s::s2} -QM_ACTION_DEF(QMsmTst, s2_e) { - BSP_display("s2-ENTRY;"); - return qm_entry(&s2_s); -} -//${SMs::QMsmTst::SM::s::s2} -QM_ACTION_DEF(QMsmTst, s2_x) { - BSP_display("s2-EXIT;"); - return qm_exit(&s2_s); -} -//${SMs::QMsmTst::SM::s::s2::initial} -QM_ACTION_DEF(QMsmTst, s2_i) { - //${SMs::QMsmTst::SM::s::s2::initial} - BSP_display("s2-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s2} -QM_STATE_DEF(QMsmTst, s2) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::I} - case I_SIG: { - //${SMs::QMsmTst::SM::s::s2::I::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s2-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s2::F} - case F_SIG: { - BSP_display("s2-F;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s2_x, // exit - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::C} - case C_SIG: { - BSP_display("s2-C;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s2_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2::s21} ............................................ -QP::QMState const QMsmTst::s21_s = { - &QMsmTst::s2_s, // superstate - &QMsmTst::s21, - &QMsmTst::s21_e, - &QMsmTst::s21_x, - &QMsmTst::s21_i -}; -//${SMs::QMsmTst::SM::s::s2::s21} -QM_ACTION_DEF(QMsmTst, s21_e) { - BSP_display("s21-ENTRY;"); - return qm_entry(&s21_s); -} -//${SMs::QMsmTst::SM::s::s2::s21} -QM_ACTION_DEF(QMsmTst, s21_x) { - BSP_display("s21-EXIT;"); - return qm_exit(&s21_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::initial} -QM_ACTION_DEF(QMsmTst, s21_i) { - //${SMs::QMsmTst::SM::s::s2::s21::initial} - BSP_display("s21-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s2::s21} -QM_STATE_DEF(QMsmTst, s21) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::s21::G} - case G_SIG: { - BSP_display("s21-G;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s21_x, // exit - &s2_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::A} - case A_SIG: { - BSP_display("s21-A;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s21_s, // target state - { - &s21_x, // exit - &s21_e, // entry - &s21_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::B} - case B_SIG: { - BSP_display("s21-B;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2::s21::s211} ...................................... -QP::QMState const QMsmTst::s211_s = { - &QMsmTst::s21_s, // superstate - &QMsmTst::s211, - &QMsmTst::s211_e, - &QMsmTst::s211_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_ACTION_DEF(QMsmTst, s211_e) { - BSP_display("s211-ENTRY;"); - return qm_entry(&s211_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_ACTION_DEF(QMsmTst, s211_x) { - BSP_display("s211-EXIT;"); - return qm_exit(&s211_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_STATE_DEF(QMsmTst, s211) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::s21::s211::H} - case H_SIG: { - BSP_display("s211-H;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s211_x, // exit - &s21_x, // exit - &s2_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::s211::D} - case D_SIG: { - BSP_display("s211-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s21_s, // target state - { - &s211_x, // exit - &s21_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${SMs::QMsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/posix-win32/qmsmtst/qmsmtst.hpp b/examples/posix-win32/qmsmtst/qmsmtst.hpp deleted file mode 100644 index b1a1229ea..000000000 --- a/examples/posix-win32/qmsmtst/qmsmtst.hpp +++ /dev/null @@ -1,65 +0,0 @@ -//$file${.::qmsmtst.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qmsmtst.qm -// File: ${.::qmsmtst.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qmsmtst.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef QMSMTST_HPP_ -#define QMSMTST_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::QMsmTstSignals} .................................................. -enum QMsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -//${Shared::the_sm} .......................................................... -extern QP::QAsm * const the_sm; - -//${Shared::BSP_display} ..................................................... -void BSP_display(char const * msg); - -//${Shared::BSP_terminate} ................................................... -void BSP_terminate(std::int16_t const result); - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // QMSMTST_HPP_ diff --git a/examples/posix-win32/qmsmtst/qmsmtst.qm b/examples/posix-win32/qmsmtst/qmsmtst.qm deleted file mode 100644 index 6581b8bb1..000000000 --- a/examples/posix-win32/qmsmtst/qmsmtst.qm +++ /dev/null @@ -1,358 +0,0 @@ - - - QMsmTst is a contrived state machine from Chapter 2 of the PSiCC2 book for testing all possible transition topologies with up to 4-levels of state nesting. - -NOTE: This example uses only the "QEP" component of the QP/C++ framework. - - - - - - - { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - - - - opaque pointer to the test SM - = &QMsmTst::inst; - - - - - - - - - - - - - - - - - Test active object - - - - - - - : QMsm(&initial) - - - - - - Q_UNUSED_PAR(e); -m_foo = 0U; -BSP_display("top-INIT;"); - -QS_SIG_DICTIONARY(A_SIG, nullptr); -QS_SIG_DICTIONARY(B_SIG, nullptr); -QS_SIG_DICTIONARY(C_SIG, nullptr); -QS_SIG_DICTIONARY(D_SIG, nullptr); -QS_SIG_DICTIONARY(E_SIG, nullptr); -QS_SIG_DICTIONARY(F_SIG, nullptr); -QS_SIG_DICTIONARY(G_SIG, nullptr); -QS_SIG_DICTIONARY(H_SIG, nullptr); -QS_SIG_DICTIONARY(I_SIG, nullptr); -QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); -QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - - - - - - BSP_display("s-ENTRY;"); - BSP_display("s-EXIT;"); - - - BSP_display("s-INIT;"); - - - - - - - - - m_foo - m_foo = 0U; -BSP_display("s-I;"); - - - - - - - - - - - BSP_display("s-E;"); - - - - - - - BSP_terminate(0); - - - - - - - BSP_display("s1-ENTRY;"); - BSP_display("s1-EXIT;"); - - - BSP_display("s1-INIT;"); - - - - - - - BSP_display("s1-I;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s1-D;"); - - - - - - - - - - - BSP_display("s1-A;"); - - - - - - - BSP_display("s1-B;"); - - - - - - - BSP_display("s1-F;"); - - - - - - - BSP_display("s1-C;"); - - - - - - - BSP_display("s11-ENTRY;"); - BSP_display("s11-EXIT;"); - - - BSP_display("s11-H;"); - - - - - - - - - m_foo - m_foo = false; -BSP_display("s11-D;"); - - - - - - - - - - - BSP_display("s11-G;"); - - - - - - - - - - - - - - - - - BSP_display("s2-ENTRY;"); - BSP_display("s2-EXIT;"); - - - BSP_display("s2-INIT;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s2-I;"); - - - - - - - - - - - BSP_display("s2-F;"); - - - - - - - BSP_display("s2-C;"); - - - - - - - BSP_display("s21-ENTRY;"); - BSP_display("s21-EXIT;"); - - - BSP_display("s21-INIT;"); - - - - - - - BSP_display("s21-G;"); - - - - - - - BSP_display("s21-A;"); - - - - - - - BSP_display("s21-B;"); - - - - - - - BSP_display("s211-ENTRY;"); - BSP_display("s211-EXIT;"); - - - BSP_display("s211-H;"); - - - - - - - BSP_display("s211-D;"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef QMSMTST_HPP_ -#define QMSMTST_HPP_ - -$declare ${Shared} - -#endif // QMSMTST_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ framework -#include "qmsmtst.hpp" // QMsmTst state machine - -$declare ${SMs::QMsmTst} -$define ${Shared::the_sm} -$define ${SMs::QMsmTst} - - - diff --git a/examples/posix-win32/reminder/Makefile b/examples/posix-win32/reminder/Makefile deleted file mode 100644 index 18c88135c..000000000 --- a/examples/posix-win32/reminder/Makefile +++ /dev/null @@ -1,290 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.2.0 -# Last updated on 2022-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := reminder - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - reminder.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/reminder/bsp.cpp b/examples/posix-win32/reminder/bsp.cpp deleted file mode 100644 index 0a94ca32b..000000000 --- a/examples/posix-win32/reminder/bsp.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// Product: Console-based BSP -// Last Updated for Version: 6.3.6 -// Date of the Last Update: 2018-10-14 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2002-2018 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include -#include // for exit() - -using namespace std; -using namespace QP; - -//............................................................................ -void BSP_init(int /*argc*/, char * /*argv*/[]) { -} -//............................................................................ -void QF::onStartup(void) { - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate - QF::consoleSetup(); -} -//............................................................................ -void QF::onCleanup(void) { - cout << "\nBye!Bye!\n"; - QF::consoleCleanup(); -} -//............................................................................ -void QP::QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, &l_clock_tick); // perform the QF clock tick processing - int key = QF::consoleGetKey(); - if (key != 0) { /* any key pressed? */ - BSP_onKeyboardInput((uint8_t)key); - } -} -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - cerr << "Assertion failed in " << file << " line " << line << endl; - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/reminder/bsp.hpp b/examples/posix-win32/reminder/bsp.hpp deleted file mode 100644 index 5bef6609c..000000000 --- a/examples/posix-win32/reminder/bsp.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//============================================================================ -// Product: Console-based BSP, MinGW -// Last Updated for Version: 5.4.2 -// Date of the Last Update: 2015-06-05 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -#define BSP_TICKS_PER_SEC 100U - -void BSP_init(int argc, char *argv[]); -void BSP_onKeyboardInput(uint8_t ch); // process the keyboard character - -#endif // BSP_HPP diff --git a/examples/posix-win32/reminder/reminder.cpp b/examples/posix-win32/reminder/reminder.cpp deleted file mode 100644 index ff07ed9cb..000000000 --- a/examples/posix-win32/reminder/reminder.cpp +++ /dev/null @@ -1,207 +0,0 @@ -//============================================================================ -// Product: Reminder state pattern example -// Last Updated for Version: 6.5.0 -// Date of the Last Update: 2019-03-25 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities - -Q_DEFINE_THIS_FILE - -using namespace QP; - -//............................................................................ -enum SensorSignals { - TERMINATE_SIG = Q_USER_SIG, // terminate the application - TIMEOUT_SIG, // the periodic timeout signal - DATA_READY_SIG, // the invented reminder signal - - MAX_SIG // keep always last -}; -//............................................................................ -class Sensor : public QActive { // the Sensor active object -private: - QTimeEvt m_timeEvt; // private time event generator - uint16_t m_pollCtr; - uint16_t m_procCtr; - -public: - Sensor() - : QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) - {} - -private: - // hierarchical state machine ... - Q_STATE_DECL(initial); - Q_STATE_DECL(polling); - Q_STATE_DECL(processing); - Q_STATE_DECL(idle); - Q_STATE_DECL(busy); - Q_STATE_DECL(final); -}; - -// HSM definition ------------------------------------------------------------ -Q_STATE_DEF(Sensor, initial) { - m_pollCtr = 0; - m_procCtr = 0; - - // NOTE: don't forget to subscribe to any signals of interest, - // if you're using publish-subscribe... - // - // subscribe(...); - (void)e; // unused parameter - return tran(&polling); -} -//............................................................................ -Q_STATE_DEF(Sensor, final) { - switch (e->sig) { - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "-> final"); - QF::stop(); // stop QF and cleanup - return Q_RET_HANDLED; - } - } - return super(&QHsm::top); -} -//............................................................................ -Q_STATE_DEF(Sensor, polling) { - switch (e->sig) { - case Q_ENTRY_SIG: { - // periodic timeout in 1/2 second and every 1/2 second - m_timeEvt.armX(BSP_TICKS_PER_SEC/2, BSP_TICKS_PER_SEC/2); - return Q_RET_HANDLED; - } - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - return Q_RET_HANDLED; - } - case Q_INIT_SIG: { - return tran(&processing); - } - case TIMEOUT_SIG: { - // NOTE: this constant event is statically pre-allocated. - // It can be posted/published as any other event. - static const QEvt dataReadyEvt(DATA_READY_SIG); - - ++m_pollCtr; - PRINTF_S("poll %3d\n", m_pollCtr); - if ((m_pollCtr & 0x3U) == 0U) { // modulo 4 - POST(&dataReadyEvt, me); - } - return Q_RET_HANDLED; - } - case TERMINATE_SIG: { - return tran(&final); - } - } - return super(&QHsm::top); -} -//............................................................................ -Q_STATE_DEF(Sensor, processing) { - switch (e->sig) { - case Q_INIT_SIG: { - return tran(&idle); - } - } - return super(&polling); -} -//............................................................................ -Q_STATE_DEF(Sensor, idle) { - switch (e->sig) { - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "-> idle"); - return Q_RET_HANDLED; - } - case DATA_READY_SIG: { - return tran(&busy); - } - } - return super(&processing); -} -//............................................................................ -Q_STATE_DEF(Sensor, busy) { - switch (e->sig) { - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "-> busy"); - return Q_RET_HANDLED; - } - case TIMEOUT_SIG: { - ++m_procCtr; - PRINTF_S("process %3d\n", m_procCtr); - if ((m_procCtr & 0x1U) == 0U) { // modulo 2 - return tran(&idle); - } - return Q_RET_HANDLED; - } - } - return super(&processing); -} - -// test harness ============================================================== - -// Local-scope objects ------------------------------------------------------- -static Sensor l_sensor; // the Sensor active object -static QEvt const *l_sensorQSto[10]; // storage for event queue for Sensor -static void *l_regPoolSto[100/sizeof(void *)]; // storage for the event pool - -//............................................................................ -int main(int argc, char *argv[]) { - PRINTF_S("Reminder state pattern\nQP version: %s\n" - "Press ESC to quit...\n", - QP::versionStr); - - BSP_init(argc, argv); // initialize the BSP - - QF::init(); // initialize the framework and the underlying RT kernel - - // publish-subscribe not used, no call to QActive::psInit() - - // initialize event pools... - QF::poolInit(l_regPoolSto, sizeof(l_regPoolSto), sizeof(QEvt)); - - // start the active objects... - l_sensor.start(1U, l_sensorQSto, Q_DIM(l_sensorQSto), - nullptr, 0, (QEvt *)0); - - return QF::run(); // run the QF application -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case '\33': { // ESC pressed? - l_sensor.POST(Q_NEW(QEvt, TERMINATE_SIG), nullptr); - break; - } - } -} diff --git a/examples/posix-win32/reminder2/Makefile b/examples/posix-win32/reminder2/Makefile deleted file mode 100644 index cf79094ad..000000000 --- a/examples/posix-win32/reminder2/Makefile +++ /dev/null @@ -1,291 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ for Windows and POSIX *HOSTS* -# Last updated for version 7.3.1 -# Last updated on 2023-09-25 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# make clean # cleanup the build -# make CONF=spy clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# http://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := reminder2 - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - -# list of all include directories needed by this project -INCLUDES := -I. \ - -# location of the QP/C framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../.. -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - reminder2.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 \ - $(DEF) - -ifeq (,$(CONF)) - CONF := dbg -endif - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -QS_SRCS := \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qs_port.cpp - -ifeq ($(OS),Windows_NT) - -# NOTE: -# For Windows hosts, you can choose: -# - the single-threaded QP/C++ port (win32-qv) or -# - the multithreaded QP/C++ port (win32). -# -QP_PORT_DIR := $(QPCPP)/ports/win32-qv -#QP_PORT_DIR := $(QPCPP)/ports/win32 -LIBS += -lws2_32 - -else - -# NOTE: -# For POSIX hosts (Linux, MacOS), you can choose: -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix -# -QP_PORT_DIR := $(QPCPP)/ports/posix-qv -#QP_PORT_DIR := $(QPCPP)/ports/posix - -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build configurations... - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := build_rel -# gcc options: -CFLAGS = -c -O3 -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c -O3 -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := build_spy - -CPP_SRCS += $(QS_SRCS) -VPATH += $(QPCPP)/src/qs - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration ......................................... - -BIN_DIR := build - -# gcc options: -CFLAGS = -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) - -endif # ..................................................................... - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY: clean show - -all: $(TARGET_EXE) - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - diff --git a/examples/posix-win32/reminder2/bsp.cpp b/examples/posix-win32/reminder2/bsp.cpp deleted file mode 100644 index fbbb152d0..000000000 --- a/examples/posix-win32/reminder2/bsp.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// Product: Console-based BSP -// Last Updated for Version: 6.3.6 -// Date of the Last Update: 2018-10-14 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2002-2018 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include -#include // for exit() - -using namespace std; -using namespace QP; - -//............................................................................ -void BSP_init(int /*argc*/, char * /*argv*/[]) { -} -//............................................................................ -void QF::onStartup(void) { - QF::setTickRate(BSP_TICKS_PER_SEC, 30); // set the desired tick rate - QF::consoleSetup(); -} -//............................................................................ -void QF::onCleanup(void) { - cout << "\nBye!Bye!\n"; - QF::consoleCleanup(); -} -//............................................................................ -void QP::QF::onClockTick(void) { - QTimeEvt::TICK_X(0U, &l_clock_tick); // perform the QF clock tick processing - int key = QF::consoleGetKey(); - if (key != 0U) { /* any key pressed? */ - BSP_onKeyboardInput((uint8_t)key); - } -} -//............................................................................ -extern "C" Q_NORETURN Q_onError(char const * const file, int_t const line) { - cerr << "Assertion failed in " << file << " line " << line << endl; - QF::onCleanup(); - exit(-1); -} diff --git a/examples/posix-win32/reminder2/bsp.hpp b/examples/posix-win32/reminder2/bsp.hpp deleted file mode 100644 index 5bef6609c..000000000 --- a/examples/posix-win32/reminder2/bsp.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//============================================================================ -// Product: Console-based BSP, MinGW -// Last Updated for Version: 5.4.2 -// Date of the Last Update: 2015-06-05 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -#define BSP_TICKS_PER_SEC 100U - -void BSP_init(int argc, char *argv[]); -void BSP_onKeyboardInput(uint8_t ch); // process the keyboard character - -#endif // BSP_HPP diff --git a/examples/posix-win32/reminder2/reminder2.cpp b/examples/posix-win32/reminder2/reminder2.cpp deleted file mode 100644 index ce618fdbb..000000000 --- a/examples/posix-win32/reminder2/reminder2.cpp +++ /dev/null @@ -1,256 +0,0 @@ -//$file${.::reminder2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: reminder2.qm -// File: ${.::reminder2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::reminder2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" / facilities - -Q_DEFINE_THIS_FILE - -using namespace QP; - -//............................................................................ -enum ReminderSignals { - CRUNCH_SIG = Q_USER_SIG, // the invented reminder signal - ECHO_SIG, // check the responsiveness of the system - TERMINATE_SIG // terminate the application -}; - -//............................................................................ -//$declare${Events::ReminderEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Events::ReminderEvt} ..................................................... -class ReminderEvt : public QP::QEvt { -public: - std::uint32_t iter; - -public: - -#ifdef QEVT_DYN_CTOR - explicit ReminderEvt(std::uint32_t i) noexcept - : QEvt(QP::QEvt::DYNAMIC), - iter(i) - {} -#endif // def QEVT_DYN_CTOR -}; // class ReminderEvt -//$enddecl${Events::ReminderEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object class ------------------------------------------------------- -//$declare${Components::Cruncher} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::Cruncher} .................................................... -class Cruncher : public QP::QActive { -private: - - // internal variable - double m_sum; - -public: - explicit Cruncher() noexcept - : QActive(Q_STATE_CAST(&initial)) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(processing); - Q_STATE_DECL(final); -}; // class Cruncher -//$enddecl${Components::Cruncher} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Components::Cruncher} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${Components::Cruncher} .................................................... - -//${Components::Cruncher::SM} ................................................ -Q_STATE_DEF(Cruncher, initial) { - //${Components::Cruncher::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Cruncher::processing); - QS_FUN_DICTIONARY(&Cruncher::final); - - return tran(&processing); -} - -//${Components::Cruncher::SM::processing} .................................... -Q_STATE_DEF(Cruncher, processing) { - QP::QState status_; - switch (e->sig) { - //${Components::Cruncher::SM::processing} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG, 0U); - #else - ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG); - reminder->iter = 0U; - #endif - - POST(reminder, this); - m_sum = 0.0; - status_ = Q_RET_HANDLED; - break; - } - //${Components::Cruncher::SM::processing::CRUNCH} - case CRUNCH_SIG: { - std::uint32_t i = Q_EVT_CAST(ReminderEvt)->iter; - std::uint32_t n = i; - i += 100U; - for (; n < i; ++n) { - if ((n & 1) == 0) { - m_sum += 1.0/(2U*n + 1U); - } - else { - m_sum -= 1.0/(2U*n + 1U); - } - } - //${Components::Cruncher::SM::processing::CRUNCH::[i<0x07000000U]} - if (i < 0x07000000U) { - #ifdef QEVT_DYN_CTOR - ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG, i); - #else - ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG); - reminder->iter = i; - #endif - - POST(reminder, this); - status_ = Q_RET_HANDLED; - } - //${Components::Cruncher::SM::processing::CRUNCH::[else]} - else { - PRINTF_S("pi=%16.14f\n", 4.0*m_sum); - status_ = tran(&processing); - } - break; - } - //${Components::Cruncher::SM::processing::ECHO} - case ECHO_SIG: { - PRINTF_S("Echo! pi=%16.14f\n", 4.0*m_sum); - status_ = Q_RET_HANDLED; - break; - } - //${Components::Cruncher::SM::processing::TERMINATE} - case TERMINATE_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Components::Cruncher::SM::final} ......................................... -Q_STATE_DEF(Cruncher, final) { - QP::QState status_; - switch (e->sig) { - //${Components::Cruncher::SM::final} - case Q_ENTRY_SIG: { - PRINTF_S("%s\n", "final-ENTRY;"); - QP::QF::stop(); // terminate the application - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${Components::Cruncher} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// test harness ============================================================== - -// Local-scope objects ------------------------------------------------------- -static Cruncher l_cruncher; // the Cruncher active object -QEvt const *l_cruncherQSto[10]; // Event queue storage for Cruncher AO -static QF_MPOOL_EL(ReminderEvt) l_smlPoolSto[20]; // storage for small pool - -//............................................................................ -int main(int argc, char *argv[]) { - PRINTF_S("Reminder state pattern\nQP version: %s\n" - "Press 'e' to echo the current value...\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP_init(argc, argv); // initialize the BSP - QF::init(); // initialize the framework and the underlying RT kernel - - // pools for dynamic (mutable) events - QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // publish-subscribe not used, no call to QActive::psInit() - - // instantiate and start the active objects... - l_cruncher.start(1U, - l_cruncherQSto, Q_DIM(l_cruncherQSto), - nullptr, 0U, nullptr); - - return QF::run(); // run the QF application -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case 'e': { - // NOTE: - // The following Q_NEW_X() allocation might potentially fail - // but this is acceptable because the "ECHO" event is not - // considered critical. This code illustrates the Q_NEW_X() - // API and its use. - #ifdef QEVT_DYN_CTOR - QEvt const *echoEvt = Q_NEW_X(QEvt, 2U, ECHO_SIG, QEvt::DYNAMIC); - #else - QEvt const *echoEvt = Q_NEW_X(QEvt, 2U, ECHO_SIG); - #endif - if (echoEvt != nullptr) { // event allocated successfully? - l_cruncher.POST(echoEvt, nullptr); - } - break; - } - case '\033': { // ESC pressed? - // NOTE: this constant event is statically pre-allocated. - // It can be posted/published as any other event. - static QEvt const terminateEvt(TERMINATE_SIG); - l_cruncher.POST(&terminateEvt, nullptr); - break; - } - } -} - diff --git a/examples/posix-win32/reminder2/reminder2.qm b/examples/posix-win32/reminder2/reminder2.qm deleted file mode 100644 index 511620126..000000000 --- a/examples/posix-win32/reminder2/reminder2.qm +++ /dev/null @@ -1,216 +0,0 @@ - - - Reminder state pattern - - - - - - - - - the next iteration to perform - - - - noexcept - - - : QEvt(QP::QEvt::DYNAMIC), - iter(i) - - - - - - - - "Number Cruncher" AO - - - // internal variable - - - - noexcept - ctor - : QActive(Q_STATE_CAST(&initial)) - - - - - - Q_UNUSED_PAR(e); - - - - - - - #ifdef QEVT_DYN_CTOR -ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG, 0U); -#else -ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG); -reminder->iter = 0U; -#endif - -POST(reminder, this); -m_sum = 0.0; - - - std::uint32_t i = Q_EVT_CAST(ReminderEvt)->iter; -std::uint32_t n = i; -i += 100U; -for (; n < i; ++n) { - if ((n & 1) == 0) { - m_sum += 1.0/(2U*n + 1U); - } - else { - m_sum -= 1.0/(2U*n + 1U); - } -} - - - - PRINTF_S("pi=%16.14f\n", 4.0*m_sum); - - - - - - - i < 0x07000000U - #ifdef QEVT_DYN_CTOR -ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG, i); -#else -ReminderEvt *reminder = Q_NEW(ReminderEvt, CRUNCH_SIG); -reminder->iter = i; -#endif - -POST(reminder, this); - - - - - - - - - - - PRINTF_S("Echo! pi=%16.14f\n", 4.0*m_sum); - - - - - - - - - - - - - - - - - PRINTF_S("%s\n", "final-ENTRY;"); - QP::QF::stop(); // terminate the application - - - - - - - - - - - - - #include "qpcpp.hpp" -#include "bsp.hpp" - -#include "safe_std.h" // portable "safe" <stdio.h>/<string.h> facilities - -Q_DEFINE_THIS_FILE - -using namespace QP; - -//............................................................................ -enum ReminderSignals { - CRUNCH_SIG = Q_USER_SIG, // the invented reminder signal - ECHO_SIG, // check the responsiveness of the system - TERMINATE_SIG // terminate the application -}; - -//............................................................................ -$declare${Events::ReminderEvt} - -// Active object class ------------------------------------------------------- -$declare${Components::Cruncher} - -$define${Components::Cruncher} - -// test harness ============================================================== - -// Local-scope objects ------------------------------------------------------- -static Cruncher l_cruncher; // the Cruncher active object -QEvt const *l_cruncherQSto[10]; // Event queue storage for Cruncher AO -static QF_MPOOL_EL(ReminderEvt) l_smlPoolSto[20]; // storage for small pool - -//............................................................................ -int main(int argc, char *argv[]) { - PRINTF_S("Reminder state pattern\nQP version: %s\n" - "Press 'e' to echo the current value...\n" - "Press ESC to quit...\n", - QP_VERSION_STR); - - BSP_init(argc, argv); // initialize the BSP - QF::init(); // initialize the framework and the underlying RT kernel - - // pools for dynamic (mutable) events - QF::poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); - - // publish-subscribe not used, no call to QActive::psInit() - - // instantiate and start the active objects... - l_cruncher.start(1U, - l_cruncherQSto, Q_DIM(l_cruncherQSto), - nullptr, 0U, nullptr); - - return QF::run(); // run the QF application -} -//............................................................................ -void BSP_onKeyboardInput(uint8_t key) { - switch (key) { - case 'e': { - // NOTE: - // The following Q_NEW_X() allocation might potentially fail - // but this is acceptable because the "ECHO" event is not - // considered critical. This code illustrates the Q_NEW_X() - // API and its use. - #ifdef QEVT_DYN_CTOR - QEvt const *echoEvt = Q_NEW_X(QEvt, 2U, ECHO_SIG, QEvt::DYNAMIC); - #else - QEvt const *echoEvt = Q_NEW_X(QEvt, 2U, ECHO_SIG); - #endif - if (echoEvt != nullptr) { // event allocated successfully? - l_cruncher.POST(echoEvt, nullptr); - } - break; - } - case '\033': { // ESC pressed? - // NOTE: this constant event is statically pre-allocated. - // It can be posted/published as any other event. - static QEvt const terminateEvt(TERMINATE_SIG); - l_cruncher.POST(&terminateEvt, nullptr); - break; - } - } -} - - - - diff --git a/examples/qutest/blinky/src/blinky.cpp b/examples/qutest/blinky/src/blinky.cpp deleted file mode 100644 index e8a092c87..000000000 --- a/examples/qutest/blinky/src/blinky.cpp +++ /dev/null @@ -1,148 +0,0 @@ -//$file${.::blinky.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: blinky.qm -// File: ${.::blinky.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::blinky.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ framework API -#include "blinky.hpp" // Blinky application -#include "bsp.hpp" // Board Support Package interface - -//using namespace QP; - -// ask QM to declare the Blinky class ---------------------------------------- -//$declare${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky} ............................................................. -class Blinky : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - static Blinky inst; - -public: - Blinky(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; // class Blinky -//$enddecl${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// define the global opaque pointer to Blinky AO ----------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::AO_Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky} .......................................................... -QP::QActive * const AO_Blinky = &Blinky::inst; -//$enddef${AOs::AO_Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// ask QM to define the Blinky class (including the state machine) ----------- -//$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Blinky} ............................................................. -Blinky Blinky::inst; - -//${AOs::Blinky::Blinky} ..................................................... -Blinky::Blinky() - : QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{} - -//${AOs::Blinky::SM} ......................................................... -Q_STATE_DEF(Blinky, initial) { - //${AOs::Blinky::SM::initial} - QS_OBJ_DICTIONARY(&Blinky::inst); - QS_OBJ_DICTIONARY(&Blinky::inst.m_timeEvt); - - // arm the private time event to expire in 1/2s - // and periodically every 1/2 second - m_timeEvt.armX(BSP::TICKS_PER_SEC/2, - BSP::TICKS_PER_SEC/2); - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Blinky::off); - QS_FUN_DICTIONARY(&Blinky::on); - - return tran(&off); -} - -//${AOs::Blinky::SM::off} .................................................... -Q_STATE_DEF(Blinky, off) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky::SM::off} - case Q_ENTRY_SIG: { - BSP::ledOff(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky::SM::off::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&on); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Blinky::SM::on} ..................................................... -Q_STATE_DEF(Blinky, on) { - QP::QState status_; - switch (e->sig) { - //${AOs::Blinky::SM::on} - case Q_ENTRY_SIG: { - BSP::ledOn(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Blinky::SM::on::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&off); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - diff --git a/examples/qutest/blinky/src/blinky.hpp b/examples/qutest/blinky/src/blinky.hpp deleted file mode 100644 index 6855bfaa2..000000000 --- a/examples/qutest/blinky/src/blinky.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//$file${.::blinky.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: blinky.qm -// File: ${.::blinky.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::blinky.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef BLINKY_HPP -#define BLINKY_HPP - -enum BlinkySignals { - DUMMY_SIG = QP::Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -//$declare${AOs::AO_Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Blinky} .......................................................... -// global "opaque" pointer to the Blinky AO -extern QP::QActive * const AO_Blinky; -//$enddecl${AOs::AO_Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // BLINKY_HPP - diff --git a/examples/qutest/blinky/src/blinky.qm b/examples/qutest/blinky/src/blinky.qm deleted file mode 100644 index 28273594a..000000000 --- a/examples/qutest/blinky/src/blinky.qm +++ /dev/null @@ -1,117 +0,0 @@ - - - Simple Blinky example for QP/C++, which demonstrates: -- Active object (Blinky) with state machine -- Board Support Package abstraction for portability -- BSP implementation for desktop OS (Windows, Linux, Mac) -- Platform-independent main() function -- make.bat batch file for Windows - - - - - - - - - - - the single instance of Blinky (Singleton) - - - - Blinky constructor - : QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) - - - - - - QS_OBJ_DICTIONARY(&Blinky::inst); -QS_OBJ_DICTIONARY(&Blinky::inst.m_timeEvt); - -// arm the private time event to expire in 1/2s -// and periodically every 1/2 second -m_timeEvt.armX(BSP::TICKS_PER_SEC/2, - BSP::TICKS_PER_SEC/2); -(void)e; // unused parameter - - - - - - - BSP::ledOff(); - - - - - - - - - - - - - BSP::ledOn(); - - - - - - - - - - - - - - - - // global "opaque" pointer to the Blinky AO - = &Blinky::inst; - - - - - - - #ifndef BLINKY_HPP -#define BLINKY_HPP - -enum BlinkySignals { - DUMMY_SIG = QP::Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -$declare${AOs::AO_Blinky} - -#endif // BLINKY_HPP - - - - - #include "qpcpp.hpp" // QP/C++ framework API -#include "blinky.hpp" // Blinky application -#include "bsp.hpp" // Board Support Package interface - -//using namespace QP; - -// ask QM to declare the Blinky class ---------------------------------------- -$declare${AOs::Blinky} - -// define the global opaque pointer to Blinky AO ----------------------------- -$define${AOs::AO_Blinky} - -// ask QM to define the Blinky class (including the state machine) ----------- -$define${AOs::Blinky} - - - - diff --git a/examples/qutest/blinky/src/bsp.cpp b/examples/qutest/blinky/src/bsp.cpp deleted file mode 100644 index a22a79cc7..000000000 --- a/examples/qutest/blinky/src/bsp.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//*************************************************************************** -// Product: BSP for "Blinky" example -// Last updated for version 6.9.1 -// Last updated on 2020-09-21 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ framework API -#include "blinky.hpp" // Blinky application -#include "bsp.hpp" // Board Support Package interface - -using namespace QP; - -//Q_DEFINE_THIS_FILE - -enum { - LED = QS_USER -}; - -//............................................................................ -void BSP::init() { - QS_FUN_DICTIONARY(&QHsm::top); - QS_USR_DICTIONARY(LED); -} -//............................................................................ -void BSP::ledOff(void) { - QS_BEGIN_ID(LED, AO_Blinky->getPrio()) - QS_U8(1, 0); - QS_END() -} -//............................................................................ -void BSP::ledOn(void) { - QS_BEGIN_ID(LED, AO_Blinky->getPrio()) - QS_U8(1, 1); - QS_END() -} - diff --git a/examples/qutest/blinky/src/bsp.hpp b/examples/qutest/blinky/src/bsp.hpp deleted file mode 100644 index 37fa507f0..000000000 --- a/examples/qutest/blinky/src/bsp.hpp +++ /dev/null @@ -1,49 +0,0 @@ -//*************************************************************************** -// Product: BSP for "Blinky" example -// Last updated for version 6.3.1 -// Last updated on 2018-05-21 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -// a very simple Board Support Package (BSP) -----========-------------------- -class BSP { -public: - enum { TICKS_PER_SEC = 100 }; // number of clock ticks in a second - static void init(void); - static void ledOff(void); - static void ledOn(void); -}; - -// active object(s) used in this application ------------------------------- -extern QP::QActive * const AO_Blinky; // opaque pointer to the Blinky AO - -#endif // BSP_HPP diff --git a/examples/qutest/blinky/test/Makefile b/examples/qutest/blinky/test/Makefile deleted file mode 100644 index 9ca82bb7f..000000000 --- a/examples/qutest/blinky/test/Makefile +++ /dev/null @@ -1,273 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_blinky - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - blinky.cpp \ - test_blinky.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/blinky/test/make_efm32 b/examples/qutest/blinky/test/make_efm32 deleted file mode 100644 index 3d3d34268..000000000 --- a/examples/qutest/blinky/test/make_efm32 +++ /dev/null @@ -1,320 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_efm32 # make and run the tests in the current directory -# make -f make_efm32 TESTS=philo*.py # make and run the selected tests -# make -f make_efm32 HOST=localhost:7705 # connect to host:port -# make -f make_efm32 norun # only make but not run the tests -# make -f make_efm32 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_blinky -TARGET := efm32 -TARGET_DIR := ..\..\..\..\3rd_party\efm32pg1b\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - blinky.cpp \ - test_blinky.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# FLASH tool (NOTE: Requires the JLINK utility) -# see $(TARGET_DIR)\flash.bat -# - -FLASH := $(TARGET_DIR)\flash.bat - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo MAKECMDGOALS = $(MAKECMDGOALS) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/blinky/test/make_nucleo-h743zi b/examples/qutest/blinky/test/make_nucleo-h743zi deleted file mode 100644 index 1f5576094..000000000 --- a/examples/qutest/blinky/test/make_nucleo-h743zi +++ /dev/null @@ -1,334 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-H743ZI board, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_blinky -TARGET := nucleo-h743zi -TARGET_DIR := ..\..\..\..\3rd_party\STM32CubeH7\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/STM32CubeH7/nucleo-h743zi/gnu \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP\STM32H7xx_Nucleo_144 \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Src \ - $(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/CMSIS/Device/ST/STM32H7xx/Include \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/BSP/STM32H7xx_Nucleo_144 \ - -I$(QPCPP)/3rd_party/STM32CubeH7/Drivers/STM32H7xx_HAL_Driver/Inc - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_stm32h743xx.c \ - system_stm32h7xx.c \ - stm32h7xx_nucleo_144.c \ - stm32h7xx_hal.c \ - stm32h7xx_hal_cortex.c \ - stm32h7xx_hal_gpio.c \ - stm32h7xx_hal_pwr_ex.c \ - stm32h7xx_hal_rcc.c \ - stm32h7xx_hal_rcc_ex.c \ - stm32h7xx_hal_msp.c \ - stm32h7xx_hal_uart.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - blinky.cpp \ - test_blinky.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)/qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DQP_API_VERSION=9999 \ - -DSTM32H743xx -DUSE_HAL_DRIVER -DUSE_STM32H7XX_NUCLEO_144 \ - -DQF_ON_CONTEXT_SW - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m7 -ARM_FPU := -mfpu=fpv5-d16 -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/blinky/test/make_nucleo-l053r8 b/examples/qutest/blinky/test/make_nucleo-l053r8 deleted file mode 100644 index 437e23a0a..000000000 --- a/examples/qutest/blinky/test/make_nucleo-l053r8 +++ /dev/null @@ -1,319 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_blinky -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - blinky.cpp \ - test_blinky.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)/qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/blinky/test/make_tm4c123 b/examples/qutest/blinky/test/make_tm4c123 deleted file mode 100644 index fc6574d28..000000000 --- a/examples/qutest/blinky/test/make_tm4c123 +++ /dev/null @@ -1,322 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_blinky -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - blinky.cpp \ - test_blinky.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/blinky/test/test_blinky.cpp b/examples/qutest/blinky/test/test_blinky.cpp deleted file mode 100644 index 8d8cfc734..000000000 --- a/examples/qutest/blinky/test/test_blinky.cpp +++ /dev/null @@ -1,108 +0,0 @@ -//*************************************************************************** -// Product: Fixture for QUTEST -// Last updated for version 7.3.0 -// Last updated on 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ framework API -#include "blinky.hpp" // Blinky application -#include "bsp.hpp" // Board Support Package interface - -using namespace QP; - -Q_DEFINE_THIS_FILE - -//............................................................................ -int main(int argc, char *argv[]) { - - QF::init(); // initialize the framework - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - BSP::init(); // initialize the BSP - - // dictionaries... - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // publish-subscribe not used, no call to QF::psInit() - - // initialize event pools... - static QF_MPOOL_EL(QEvt) smlPoolSto[10]; // storage for small pool - QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - static QEvt const *blinkyQSto[10]; // event queue storage for Blinky - AO_Blinky->start(1U, - blinkyQSto, Q_DIM(blinkyQSto), - nullptr, 0U, (QEvt *)0); - - return QF::run(); -} - -//---------------------------------------------------------------------------- -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -//............................................................................ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - (void)e; -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(recipient); - Q_UNUSED_PAR(e); - Q_UNUSED_PAR(status); -} diff --git a/examples/qutest/blinky/test/test_blinky.py b/examples/qutest/blinky/test/test_blinky.py deleted file mode 100644 index d66b7a60e..000000000 --- a/examples/qutest/blinky/test/test_blinky.py +++ /dev/null @@ -1,64 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("@timestamp TE0-Arm Obj=Blinky::inst.m_timeEvt,AO=Blinky::inst,*") - expect("===RTC===> St-Init Obj=Blinky::inst,State=QP::QHsm::top->Blinky::off") - expect("@timestamp LED 0") - expect("===RTC===> St-Entry Obj=Blinky::inst,State=Blinky::off") - expect("@timestamp Init===> Obj=Blinky::inst,State=Blinky::off") - expect_run() - current_obj(OBJ_SM_AO,"Blinky::inst") - current_obj(OBJ_TE,"Blinky::inst.m_timeEvt") - - -test("TIMEOUT_SIG->Blinky::inst") -query_curr(OBJ_SM) -expect("@timestamp Query-SM Obj=Blinky::inst,State=Blinky::off") -query_curr(OBJ_AO) -expect("@timestamp Query-AO Obj=Blinky::inst,State=Blinky::off") -query_curr(OBJ_TE) -expect("@timestamp Query-TE Obj=Blinky::inst.m_timeEvt,Rate=0,Sig=TIMEOUT_SIG,*") -current_obj(OBJ_MP,"EvtPool1") -query_curr(OBJ_MP) -expect("@timestamp Query-MP Obj=EvtPool1,*") -post("TIMEOUT_SIG") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=TIMEOUT_SIG,*") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Blinky::inst,Evt Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::off") -expect("@timestamp LED 1") -expect("===RTC===> St-Entry Obj=Blinky::inst,State=Blinky::on") -expect("@timestamp ===>Tran Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::off->Blinky::on") -expect("@timestamp QF-gc Evtoff (tick)") -current_obj(OBJ_TE,"Blinky::inst.m_timeEvt") -tick() -expect(" Tick<0> Ctr=*") -expect("@timestamp TE0-Post Obj=Blinky::inst.m_timeEvt,Sig=TIMEOUT_SIG,AO=Blinky::inst") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Blinky::inst,Evt Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::off") -expect("@timestamp LED 1") -expect("===RTC===> St-Entry Obj=Blinky::inst,State=Blinky::on") -expect("@timestamp ===>Tran Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::off->Blinky::on") -expect("@timestamp Trg-Done QS_RX_TICK") - -test("timeEvt->on (tick)", NORESET) -tick() -expect(" Tick<0> Ctr=*") -expect("@timestamp TE0-Post Obj=Blinky::inst.m_timeEvt,Sig=TIMEOUT_SIG,AO=Blinky::inst") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Blinky::inst,Evt Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::on") -expect("@timestamp LED 0") -expect("===RTC===> St-Entry Obj=Blinky::inst,State=Blinky::off") -expect("@timestamp ===>Tran Obj=Blinky::inst,Sig=TIMEOUT_SIG,State=Blinky::on->Blinky::off") -expect("@timestamp Trg-Done QS_RX_TICK") diff --git a/examples/qutest/blinky/test/test_vc.sln b/examples/qutest/blinky/test/test_vc.sln deleted file mode 100644 index fc1e7c191..000000000 --- a/examples/qutest/blinky/test/test_vc.sln +++ /dev/null @@ -1,18 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_vc", "test_vc.vcxproj", "{8CC465F7-872E-4D03-B93C-1B64858B4E11}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.ActiveCfg = Debug|Win32 - {8CC465F7-872E-4D03-B93C-1B64858B4E11}.Debug|Win32.Build.0 = Debug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/qutest/blinky/test/test_vc.vcxproj b/examples/qutest/blinky/test/test_vc.vcxproj deleted file mode 100644 index e644fe41e..000000000 --- a/examples/qutest/blinky/test/test_vc.vcxproj +++ /dev/null @@ -1,186 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - QSpy - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {8CC465F7-872E-4D03-B93C-1B64858B4E11} - test_vc - Win32Proj - 10.0 - - - - Application - NotSet - v142 - - - Application - NotSet - true - v142 - - - Application - NotSet - v142 - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - - - - Disabled - ../src;../../../../include;../../../../ports/win32-qutest;%(AdditionalIncludeDirectories) - Q_SPY;Q_UTEST;Q_HOST;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - Default - - - ws2_32.lib;%(AdditionalDependencies) - %(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - MaxSpeed - true - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;snprintf=_snprintf;WIN32;_CONSOLE;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - true - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - true - true - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - Disabled - .;../../../include;../../../ports/win32-qv;$(QTOOLS)/qspy/include;%(AdditionalIncludeDirectories) - Q_SPY;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - NotUsing - Level4 - ProgramDatabase - 4127 - - - qp.lib;ws2_32.lib;%(AdditionalDependencies) - ../../../ports/win32-qv/$(Configuration);%(AdditionalLibraryDirectories) - true - Console - MachineX86 - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - - \ No newline at end of file diff --git a/examples/qutest/blinky/test/test_vc.vcxproj.filters b/examples/qutest/blinky/test/test_vc.vcxproj.filters deleted file mode 100644 index 91d59b5fe..000000000 --- a/examples/qutest/blinky/test/test_vc.vcxproj.filters +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP_port - - - QS - - - QS - - - QS - - - QS - - - QS - - - QS - - - - - - - QP_port - - - QP_port - - - QP_port - - - QP_port - - - - - {6f4a93f8-9c12-4382-bcaf-7990fc017806} - - - {ac007963-eaca-4059-a0e8-c1540f39b04c} - - - {00254ee7-7214-4063-b202-f6cedf2784eb} - - - - - QP_port - - - \ No newline at end of file diff --git a/examples/qutest/dpp-comp/src/bsp.cpp b/examples/qutest/dpp-comp/src/bsp.cpp deleted file mode 100644 index ffb3be886..000000000 --- a/examples/qutest/dpp-comp/src/bsp.cpp +++ /dev/null @@ -1,126 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example (console) -// Last updated for version 7.3.0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_MODULE("bsp") - -// Local objects ------------------------------------------------------------- -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - enum AppRecords { // application-specific trace records - BSP_CALL = QP::QS_USER, - }; - -#endif - -} // unnamed namespace - - -//============================================================================ -namespace BSP { - -void init() { - // initialize the QS software tracing - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - QS_FUN_DICTIONARY(&BSP::displayPaused); - QS_FUN_DICTIONARY(&BSP::displayPhilStat); - QS_FUN_DICTIONARY(&BSP::random); - QS_FUN_DICTIONARY(&BSP::randomSeed); - - QS_ONLY(APP::produce_sig_dict()); - - QS_USR_DICTIONARY(BSP_CALL); - - BSP::randomSeed(1234U); -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::displayPhilStat); - QS_U8(0, n); - QS_STR(stat); - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - QS_TEST_PROBE_DEF(&BSP::displayPaused) - - QS_TEST_PROBE( - Q_ASSERT_ID(100, 0); - ) - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::displayPaused); - QS_U8(0, paused); - QS_END() -} -//............................................................................ -std::uint32_t random() { - QS_TEST_PROBE_DEF(&BSP::random) - uint32_t rnd = 123U; - - QS_TEST_PROBE( - rnd = qs_tp_; - ) - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::random); - QS_U32(0, rnd); - QS_END() - return rnd; -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - QS_TEST_PROBE_DEF(&BSP::randomSeed) - - QS_TEST_PROBE( - seed = qs_tp_; - ) - l_rnd = seed; - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::randomSeed); - QS_U32(0, seed); - QS_END() -} - -} // namespace BSP - diff --git a/examples/qutest/dpp-comp/src/bsp.hpp b/examples/qutest/dpp-comp/src/bsp.hpp deleted file mode 100644 index 2cea8b8b0..000000000 --- a/examples/qutest/dpp-comp/src/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100U}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/qutest/dpp-comp/src/dpp-comp.qm b/examples/qutest/dpp-comp/src/dpp-comp.qm deleted file mode 100644 index 488fb7520..000000000 --- a/examples/qutest/dpp-comp/src/dpp-comp.qm +++ /dev/null @@ -1,532 +0,0 @@ - - - Dining Philosopher Problem example with the "Orthogonal Component" state pattern (see https://www.state-machine.com/doc/Pattern_Orthogonal.pdf) - -The model demonstrates the following features: - -1. Partitioning the application into Container and Components -2. Packages for Container (cont) and Components (comp) -3. External packages with separate QM-package model files -4. CompTimeEvt class for private time evnents of Components -5. Container to Component communication via synchronous event dispatching -6. Component to Container communication via asynchronous event posting using the LIFO policy. - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = &Table::inst; - - - - - - - - - The only static instance of the Table class (Singleton pattern) - - - - - - - - : QActive(Q_STATE_CAST(&Table::initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - - // take top-most initial tran. in the Philo SM - SM_Philo[n]->INIT(QP::QS_AP_ID + n); - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - Q_ERROR(); - - - - - - - - - - - - - std::uint16_t n = Q_EVT_CAST(CompTimeEvt)->compNum; -SM_Philo[n]->DISPATCH(e, QP::QS_AP_ID + n); - - - - - - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = LEFT(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; - -// synchronoulsy dispatch EAT event to the Philo component -TableEvt const evt(EAT_SIG, n); -SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = RIGHT(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); -} -m = LEFT(n); // check the left neighbor -n = LEFT(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - // find the index of the Philo from the event -std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); - -std::uint8_t m = LEFT(n); -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - Specialized time event for components. The time event can be owned by a component and can dispatch itself to the component. - - - - - The constructor to initialize a Component Time Event. - -When creating a Time-Event, you must commit it to a specific active object 'act', event signal 'sig', and tick rate 'tickRate'. You cannot change these attributes later. - - - - - - - - - : QTimeEvt(act, sig, tickRate), - compNum(num) - - - - - - - - - - - - - : QHsm(&initial), - m_timeEvt(AO_Table, getId(), TIMEOUT_SIG, 0U) - - - - return static_cast<std::uint8_t>(this - &APP::Philo::inst[0]); - - - - - - static_cast<void>(e); // unused parameter - -#ifdef Q_SPY -std::uint8_t n = getId(); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[n], n); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[n].m_timeEvt, n); -#endif - -static bool registered = false; -if (!registered) { - registered = true; - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); -} - - - - - - - m_timeEvt.armX(think_time(), 0U); - (void)m_timeEvt.disarm(); - - - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, getId()); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = getId(); -#endif -AO_Table->postLIFO(pe); - - - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -// asynchronously post event to the Container -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, getId()); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = getId(); -#endif -AO_Table->postLIFO(pe); - - - - - - - - - - - - - - - - - = { // opaque pointers to Philo instances - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -$declare ${Comp::CompTimeEvt} -$declare ${Comp::SM_Philo[N_PHILO]} - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${Comp::Philo} - -// definition of the whole "Comp" package -$define ${Comp} - - - - #include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -namespace { - -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t RIGHT(std::uint8_t const n) { - return static_cast<std::uint8_t>( - (n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t LEFT(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static std::uint8_t const FREE = static_cast<std::uint8_t>(0); -static std::uint8_t const USED = static_cast<std::uint8_t>(1); - -static char const * const THINKING = "thinking"; -static char const * const HUNGRY = "hungry "; -static char const * const EATING = "eating "; - -} // unnamed namespace - -$declare ${Cont::Table} - -$define ${Shared::AO_Table} -$define ${Cont} - - - diff --git a/examples/qutest/dpp-comp/src/dpp.hpp b/examples/qutest/dpp-comp/src/dpp.hpp deleted file mode 100644 index 1ac4e5f47..000000000 --- a/examples/qutest/dpp-comp/src/dpp.hpp +++ /dev/null @@ -1,122 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$declare${Comp::CompTimeEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::CompTimeEvt} ....................................................... -class CompTimeEvt : public QP::QTimeEvt { -public: - std::uint16_t compNum; - -public: - CompTimeEvt( - QP::QActive * act, - std::uint16_t num, - enum_t const sig, - std::uint_fast8_t const tickRate); -}; // class CompTimeEvt - -} // namespace APP -//$enddecl${Comp::CompTimeEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$declare${Comp::SM_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::SM_Philo[N_PHILO]} ................................................. -extern QP::QAsm * const SM_Philo[N_PHILO]; - -} // namespace APP -//$enddecl${Comp::SM_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // DPP_HPP_ diff --git a/examples/qutest/dpp-comp/src/philo.cpp b/examples/qutest/dpp-comp/src/philo.cpp deleted file mode 100644 index e41d1de17..000000000 --- a/examples/qutest/dpp-comp/src/philo.cpp +++ /dev/null @@ -1,248 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${Comp::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::Philo} ............................................................. -class Philo : public QP::QHsm { -public: - static Philo inst[N_PHILO]; - -private: - CompTimeEvt m_timeEvt; - friend class Table; - -public: - Philo(); - std::uint8_t getId() { - return static_cast(this - &APP::Philo::inst[0]); - } - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${Comp::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// definition of the whole "Comp" package -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Comp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Comp::CompTimeEvt} ....................................................... - -//${Comp::CompTimeEvt::CompTimeEvt} .......................................... -CompTimeEvt::CompTimeEvt( - QP::QActive * act, - std::uint16_t num, - enum_t const sig, - std::uint_fast8_t const tickRate) - : QTimeEvt(act, sig, tickRate), - compNum(num) -{} - -//${Comp::Philo} ............................................................. -Philo Philo::inst[N_PHILO]; - -//${Comp::Philo::Philo} ...................................................... -Philo::Philo() - : QHsm(&initial), - m_timeEvt(AO_Table, getId(), TIMEOUT_SIG, 0U) -{} - -//${Comp::Philo::SM} ......................................................... -Q_STATE_DEF(Philo, initial) { - //${Comp::Philo::SM::initial} - static_cast(e); // unused parameter - - #ifdef Q_SPY - std::uint8_t n = getId(); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[n], n); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[n].m_timeEvt, n); - #endif - - static bool registered = false; - if (!registered) { - registered = true; - QS_FUN_DICTIONARY(&Philo::initial); - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - } - return tran(&thinking); -} - -//${Comp::Philo::SM::thinking} ............................................... -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::thinking} - case Q_EXIT_SIG: { - (void)m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${Comp::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::Philo::SM::hungry} ................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, getId()); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = getId(); - #endif - AO_Table->postLIFO(pe); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::hungry::EAT} - case EAT_SIG: { - status_ = tran(&eating); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::Philo::SM::eating} ................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${Comp::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - // asynchronously post event to the Container - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, getId()); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = getId(); - #endif - AO_Table->postLIFO(pe); - status_ = Q_RET_HANDLED; - break; - } - //${Comp::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Comp::SM_Philo[N_PHILO]} ................................................. -QP::QAsm * const SM_Philo[N_PHILO] = { // opaque pointers to Philo instances - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Comp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qutest/dpp-comp/src/table.cpp b/examples/qutest/dpp-comp/src/table.cpp deleted file mode 100644 index 71bac9166..000000000 --- a/examples/qutest/dpp-comp/src/table.cpp +++ /dev/null @@ -1,346 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp-comp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -namespace { - -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t RIGHT(std::uint8_t const n) { - return static_cast( - (n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t LEFT(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static std::uint8_t const FREE = static_cast(0); -static std::uint8_t const USED = static_cast(1); - -static char const * const THINKING = "thinking"; -static char const * const HUNGRY = "hungry "; -static char const * const EATING = "eating "; - -} // unnamed namespace - -//$declare${Cont::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Cont::Table} ............................................................. -class Table : public QP::QActive { -public: - static Table inst; - -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${Cont::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${Cont} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Cont::Table} ............................................................. -Table Table::inst; - -//${Cont::Table::Table} ...................................................... -Table::Table() - : QActive(Q_STATE_CAST(&Table::initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${Cont::Table::SM} ......................................................... -Q_STATE_DEF(Table, initial) { - //${Cont::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - - // take top-most initial tran. in the Philo SM - SM_Philo[n]->INIT(QP::QS_AP_ID + n); - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${Cont::Table::SM::active} ................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::TIMEOUT} - case TIMEOUT_SIG: { - std::uint16_t n = Q_EVT_CAST(CompTimeEvt)->compNum; - SM_Philo[n]->DISPATCH(e, QP::QS_AP_ID + n); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${Cont::Table::SM::active::serving} ........................................ -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::serving} - case Q_ENTRY_SIG: { - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { // give permissions to eat... - if (m_isHungry[n] - && (m_fork[LEFT(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[LEFT(n)] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = LEFT(n); - //${Cont::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, n); - SM_Philo[n]->DISPATCH(&evt, QP::QS_AP_ID + n); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${Cont::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${Cont::Table::SM::active::serving::DONE} - case DONE_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = RIGHT(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); - } - m = LEFT(n); // check the left neighbor - n = LEFT(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - - // synchronoulsy dispatch EAT event to the Philo component - TableEvt const evt(EAT_SIG, m); - SM_Philo[m]->DISPATCH(&evt, QP::QS_AP_ID + n); - - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${Cont::Table::SM::active::paused} ......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${Cont::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${Cont::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${Cont::Table::SM::active::paused::DONE} - case DONE_SIG: { - // find the index of the Philo from the event - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - - std::uint8_t m = LEFT(n); - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${Cont} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qutest/dpp-comp/test_dpp/Makefile b/examples/qutest/dpp-comp/test_dpp/Makefile deleted file mode 100644 index bcaba8f97..000000000 --- a/examples/qutest/dpp-comp/test_dpp/Makefile +++ /dev/null @@ -1,274 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - philo.cpp \ - table.cpp \ - test_dpp.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := $(DEF) - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_dpp/README.txt b/examples/qutest/dpp-comp/test_dpp/README.txt deleted file mode 100644 index 8db05aff4..000000000 --- a/examples/qutest/dpp-comp/test_dpp/README.txt +++ /dev/null @@ -1,141 +0,0 @@ -QUTest Integration Testing of the DPP Application -================================================= -The tests included in the qutest/dpp/test_dpp directory perform integration -testing of the DPP application. The difference from pure unit testing is -that multiple active objects (AOs) are started and the tests exercise -interactions among these active objects. - -The Test Fixture ----------------- -The QUTest test fixture in this case is built from the same components as -the final application (except that it is linked with the "QUTest stub" of -the QP framework, instead of the fully-functional version). - -Specifically, the test fixture in this case uses the same main() function -(the same main.c module, even) as the final DPP application. - -The Test Scripts ----------------- -The test scripts (*.py files for testing with Python and *.tcl files for -testing with Tcl) demonstrate injecting events and clock ticks to drive -the application. - - -The Test Targets -================ -The makefiles provided with this test support several targets. Each -supported target system requires building a separate QUTest fixture, -but all targets can be tested with the *same* test scripts. - -The following sub-sections describe how to build the code and run -the tests. - -Host Executable ---------------- -The provided Makefile builds the test fixture for the host executable, -which can be Windows, Linux or MacOSX. - -Before running the Makefile, the QSPY host utility needs to be stated -from command-prompt/terminal as follows: - -qspy -u -t - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make - -The provided Makefile both builds the fixture and run the test -scripts. By default, the Python test scripts are used. If you wish -to run Tcl test scripts instead, please type: - -make SCRIPT=tcl - -Embedded Target: EFM32 ----------------------- -The provided makefile make_efm32 builds the test fixture for the -EFM32-SLSTK3401A board (ARM Cortex-M4). The makefile works on Windows hosts -only. - -Before running make -f make_efm32, the QSPY host utility needs to -be stated from command-prompt/terminal as follows: - -qspy -u -c COM2 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the EFM32-SLSTK3401A board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make -f make_efm32 - -The provided Makefile both builds the fixture and run the test -scripts. By default, the Python test scripts are used. If you wish -to run Tcl test scripts instead, please type: - -make -f make_efm32 SCRIPT=tcl - - -Embedded Target: TM4C123 ------------------------- -The provided makefile make_tm4c123 builds the test fixture for the -EK-TM4C123GXL board (ARM Cortex-M4). The makefile works on Windows hosts -only. - -Before running make -f make_efm32, the QSPY host utility needs to -be stated from command-prompt/terminal as follows: - -qspy -u -c COM3 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the EK-TM4C123GXL TivaC LaunchPad board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make -f make_efm32 - -The provided Makefile both builds the fixture and run the test scripts. -By default, the Python test scripts are used. Alternatively, if you wish -to run Tcl test scripts instead, please type: - -make -f make_efm32 SCRIPT=tcl - - -Embedded Target: MSP430 ------------------------- -The provided CCS (Code Composer Studio) project files -.project/.csproject/.ccsproject build the test fixture for the -MSP-EXP430F5529LP LauchPad board (MSP430X CPU). - -NOTE: Currently testing on the MSP430 target is NOT fully automated, -because it is based on the CCS IDE. This requires building and loading -the test fixture *manually* from CCS, and only then by a separate step -of running the test scripts. - -After building the fixture and loading it into the flash memory -of the MSP-EXP430F5529LP LauchPad board, you need to open the QSPY host -utility from command-prompt/terminal as follows: - -qspy -u -c COM4 -b9600 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the MSP-EXP430F5529LP LauchPad board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -python %QTOOLS%\qspy\py\qutest.py - -This will run the test scripts in Python. Alternatively, if you wish -to run Tcl test scripts instead, please type: - -tclsh %QTOOLS%\qspy\tcl\qutest.tcl - - -Contact Information -=================== -https://www.state-machine.com -mailto:info@state-machine.com - \ No newline at end of file diff --git a/examples/qutest/dpp-comp/test_dpp/lnk_msp430f5529.cmd b/examples/qutest/dpp-comp/test_dpp/lnk_msp430f5529.cmd deleted file mode 100644 index e97355885..000000000 --- a/examples/qutest/dpp-comp/test_dpp/lnk_msp430f5529.cmd +++ /dev/null @@ -1,251 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2017, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.203 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_CODE_MODEL__ - .text : {} > FLASH /* Code */ -#else - .text : {} >> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} >> FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .binit : {} > FLASH /* Boot-time Initialization tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ -#ifdef __TI_COMPILER_VERSION__ - #if __TI_COMPILER_VERSION__ >= 15009000 - #ifndef __LARGE_CODE_MODEL__ - .TI.ramfunc : {} load=FLASH, run=RAM, table(BINIT) - #else - .TI.ramfunc : {} load=FLASH | FLASH2, run=RAM, table(BINIT) - #endif - #endif -#endif - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/qutest/dpp-comp/test_dpp/make_efm32 b/examples/qutest/dpp-comp/test_dpp/make_efm32 deleted file mode 100644 index 5ecf764d1..000000000 --- a/examples/qutest/dpp-comp/test_dpp/make_efm32 +++ /dev/null @@ -1,322 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_efm32 # make and run the tests in the current directory -# make -f make_efm32 TESTS=philo*.py # make and run the selected tests -# make -f make_efm32 HOST=localhost:7705 # connect to host:port -# make -f make_efm32 norun # only make but not run the tests -# make -f make_efm32 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := efm32 -TARGET_DIR := ..\..\..\..\3rd_party\efm32pg1b\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# FLASH tool (NOTE: Requires the JLINK utility) -# see $(TARGET_DIR)\flash.bat -# - -FLASH := $(TARGET_DIR)\flash.bat - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo MAKECMDGOALS = $(MAKECMDGOALS) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_dpp/make_nucleo-l053r8 b/examples/qutest/dpp-comp/test_dpp/make_nucleo-l053r8 deleted file mode 100644 index b13d58870..000000000 --- a/examples/qutest/dpp-comp/test_dpp/make_nucleo-l053r8 +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_dpp/make_posix b/examples/qutest/dpp-comp/test_dpp/make_posix deleted file mode 100644 index d59255fb2..000000000 --- a/examples/qutest/dpp-comp/test_dpp/make_posix +++ /dev/null @@ -1,250 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST; QP/C++ on POSIX *Target* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_posix # make and run the tests in the current directory -# make -f make_posix HOST=192.168.1.65:6601 # make and run the executable -# make -f make_posix norun # only make but not run the tests -# make -f make_posix clean # cleanup the build -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH = . \ - ../src - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - - -ifeq ($(MAKECMDGOALS),test) - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - test_dpp.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest - -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -LIBS += -lpthread - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities: - -MKDIR := mkdir -p -RM := rm -f - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build_posix - -CFLAGS = -c -g -O -Wall -Wstrict-prototypes -W $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS = -c -g -O -Wall -W -fno-rtti -fno-exceptions $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun test clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -# run the test fixture on a POSIX target in a loop, so that it is re-started -# after every test. The loop is terminated by pressing Ctrl-C on the keyboard. -# -run : $(TARGET_EXE) - set -e; while true; do \ - echo "restarting $(TARGET_EXE)"; \ - $(TARGET_EXE) "" $(HOST); \ - done - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),test) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -test : - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo HOST = $(HOST) - diff --git a/examples/qutest/dpp-comp/test_dpp/make_tm4c123 b/examples/qutest/dpp-comp/test_dpp/make_tm4c123 deleted file mode 100644 index c5ad17993..000000000 --- a/examples/qutest/dpp-comp/test_dpp/make_tm4c123 +++ /dev/null @@ -1,324 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_dpp/test_dpp.cpp b/examples/qutest/dpp-comp/test_dpp/test_dpp.cpp deleted file mode 100644 index 789d9fb1c..000000000 --- a/examples/qutest/dpp-comp/test_dpp/test_dpp.cpp +++ /dev/null @@ -1,135 +0,0 @@ -//============================================================================ -// Product: QUTEST fixture for the DPP components -// Last updated for version 7.3.0 -// Last updated on 2023-08-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -//#include "safe_std.h" // portable "safe" / facilities - -//============================================================================ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; // small pool - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start the active objects... - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( // AO to start - APP::N_PHILO + 1U, // QF-priority - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, // stack storage (not used) - 0U); // size of the stack [bytes] - - return QP::QF::run(); // run the QF application -} - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - (void)e; -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // embedded Target -#endif // embedded Target -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(status); - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // application-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp-comp/test_dpp/test_init.py b/examples/qutest/dpp-comp/test_dpp/test_init.py deleted file mode 100644 index 623c3d5cb..000000000 --- a/examples/qutest/dpp-comp/test_dpp/test_init.py +++ /dev/null @@ -1,47 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest_script.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=PAUSE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=SERVE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[0],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[0].m_timeEvt,AO=Table::inst,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[0],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[0],State=Philo::thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 0 thinking") - expect("===RTC===> St-Init Obj=Philo::inst[1],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[1].m_timeEvt,AO=Table::inst,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[1],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[1],State=Philo::thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 1 thinking") - expect("===RTC===> St-Init Obj=Philo::inst[2],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Table::inst,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 2 thinking") - expect("===RTC===> St-Init Obj=Philo::inst[3],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[3].m_timeEvt,AO=Table::inst,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[3],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[3],State=Philo::thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 3 thinking") - expect("===RTC===> St-Init Obj=Philo::inst[4],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[4].m_timeEvt,AO=Table::inst,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[4],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[4],State=Philo::thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 4 thinking") - expect("===RTC===> St-Init Obj=Table::inst,State=QP::QHsm::top->Table::serving") - expect("===RTC===> St-Entry Obj=Table::inst,State=Table::serving") - expect("@timestamp Init===> Obj=Table::inst,State=Table::serving") - expect_run() - -test("DPP init") diff --git a/examples/qutest/dpp-comp/test_dpp/test_tick.py b/examples/qutest/dpp-comp/test_dpp/test_tick.py deleted file mode 100644 index bfd8d978d..000000000 --- a/examples/qutest/dpp-comp/test_dpp/test_tick.py +++ /dev/null @@ -1,44 +0,0 @@ -# test script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - -# tests... -test("tick") -glb_filter(GRP_ALL) -current_obj(OBJ_TE, "Philo::inst[2].m_timeEvt") -tick() -expect(" Tick<0> Ctr=*") -expect(" TE0-ADis Obj=Philo::inst[2].m_timeEvt,AO=Table::inst") -expect("@timestamp TE0-Post Obj=Philo::inst[2].m_timeEvt,Sig=TIMEOUT_SIG,AO=Table::inst") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Table::inst,Evt,*") -expect("@timestamp AO-GetL Obj=Table::inst,Evt") -expect("@timestamp Disp===> Obj=Table::inst,Sig=TIMEOUT_SIG,State=Table::serving") -expect("@timestamp Disp===> Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-DisA Obj=Philo::inst[2].m_timeEvt,AO=Table::inst") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp AO-LIFO Obj=Table::inst,Evt St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp =>Intern Obj=Table::inst,Sig=TIMEOUT_SIG,State=Table::active") -expect("@timestamp AO-GetL Obj=Table::inst,Evt Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 hungry ") -expect("@timestamp Disp===> Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Table::inst,Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry->Philo::eating") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 eating ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt. -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_philo - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - philo.cpp \ - test_philo.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_philo/test_init.py b/examples/qutest/dpp-comp/test_philo/test_init.py deleted file mode 100644 index 393454b7d..000000000 --- a/examples/qutest/dpp-comp/test_philo/test_init.py +++ /dev/null @@ -1,38 +0,0 @@ -# test script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("===RTC===> St-Init Obj=Philo::inst[0],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[0].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[0],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[0],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Philo::inst[1],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[1].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[1],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[1],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Philo::inst[2],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[2],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Philo::inst[3],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[3].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[3],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[3],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Philo::inst[4],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[4].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[4],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[4],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Table_dummy,State=QP::QHsm::top->NULL") - expect_run() - -# tests... -test("init") diff --git a/examples/qutest/dpp-comp/test_philo/test_philo.cpp b/examples/qutest/dpp-comp/test_philo/test_philo.cpp deleted file mode 100644 index 7062d4886..000000000 --- a/examples/qutest/dpp-comp/test_philo/test_philo.cpp +++ /dev/null @@ -1,137 +0,0 @@ -//============================================================================ -// Test fixture for DPP example -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -namespace { // unnamed namespace - -// instantiate dummy collaborator AOs... -static QP::QActiveDummy Table_dummy; - -} // unnamed namespace - -QP::QActive * const APP::AO_Table = &Table_dummy; - -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - // object dictionaries... - QS_OBJ_DICTIONARY(&Table_dummy); - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // construct and initialize Philo HSM components - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::SM_Philo[n]->init(nullptr, QP::QS_AP_ID + n); - } - - // start the active objects... - Table_dummy.start( - APP::N_PHILO + 1U, // QP priority of the dummy - nullptr, 0U, nullptr, 0U); - - return QP::QF::run(); // run the QF application -} - - -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QP::QEvt *e) { - (void)e; -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QP::QActive *recipient, - QP::QEvt const *e, bool status) -{ - (void)sender; - (void)status; - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // app-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp-comp/test_philo/test_philo.py b/examples/qutest/dpp-comp/test_philo/test_philo.py deleted file mode 100644 index 7019f726b..000000000 --- a/examples/qutest/dpp-comp/test_philo/test_philo.py +++ /dev/null @@ -1,85 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - glb_filter(GRP_ALL) - loc_filter(IDS_ALL) - current_obj(OBJ_SM, "Philo::inst[2]") - current_obj(OBJ_TE, "Philo::inst[2].m_timeEvt") - -# tests... -test("Philo-thinking TIMEOUT") -dispatch("TIMEOUT_SIG") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=TIMEOUT_SIG,*") -expect("@timestamp Disp===> Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-Dis Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp AO-LIFO Obj=Table_dummy,Evt St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp QF-gc Evt Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry->Philo::eating") -expect("@timestamp QF-gc Evt Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::eating") -expect("@timestamp TE0-Dis Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=DONE_SIG,*") -expect("@timestamp AO-LIFO Obj=Table_dummy,Evt St-Exit Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::eating->Philo::thinking") -expect("@timestamp QF-gc Evt Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-Dis Obj=Philo::inst[2].m_timeEvt,AO=Table_dummy,Tim=*,Int=0") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp AO-LIFO Obj=Table_dummy,Evt St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp QF-gc Evt. -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_table - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - table.cpp \ - test_table.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp-comp/test_table/test_init.py b/examples/qutest/dpp-comp/test_table/test_init.py deleted file mode 100644 index 7585972b4..000000000 --- a/examples/qutest/dpp-comp/test_table/test_init.py +++ /dev/null @@ -1,25 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - loc_filter(IDS_ALL, -IDS_AP) # disable records from Philo components - continue_test() - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=PAUSE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=SERVE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=TEST_SIG") - expect("@timestamp BSP_CALL BSP::displayPhilStat 0 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 1 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 2 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 3 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 4 thinking") - expect("===RTC===> St-Init Obj=Table::inst,State=QP::QHsm::top->Table::serving") - expect("===RTC===> St-Entry Obj=Table::inst,State=Table::serving") - expect("@timestamp Init===> Obj=Table::inst,State=Table::serving") - expect_run() - -# tests... -test("init") - diff --git a/examples/qutest/dpp-comp/test_table/test_table.cpp b/examples/qutest/dpp-comp/test_table/test_table.cpp deleted file mode 100644 index 0d0d7e07a..000000000 --- a/examples/qutest/dpp-comp/test_table/test_table.cpp +++ /dev/null @@ -1,141 +0,0 @@ -//============================================================================ -// Test fixture for DPP example -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -namespace { // unnamed namespace - -//Q_DEFINE_THIS_FILE - -// instantiate dummy collaborator HSM components... -static QP::QHsmDummy Philo_dummy[APP::N_PHILO]; - -} // unnamed namespace - -QP::QAsm * const APP::SM_Philo[APP::N_PHILO] = { - &Philo_dummy[0], - &Philo_dummy[1], - &Philo_dummy[2], - &Philo_dummy[3], - &Philo_dummy[4] -}; - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start and setup AOs... - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - 1U, // QP priority - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup() { -} -//............................................................................ -void QS::onTestTeardown() { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(status); - - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // application-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp-comp/test_table/test_table.py b/examples/qutest/dpp-comp/test_table/test_table.py deleted file mode 100644 index e4136733c..000000000 --- a/examples/qutest/dpp-comp/test_table/test_table.py +++ /dev/null @@ -1,58 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - glb_filter(GRP_ALL) - loc_filter(IDS_ALL, -IDS_AP) # disable records from Philo components - ao_filter("Table::inst") - current_obj(OBJ_SM_AO, "Table::inst") - -def on_setup(): - print("on_setup") - -def on_teardown(): - print("on_teardown") - -# tests... -test("post HUNGRY[2]") -post("HUNGRY_SIG", pack(" Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 hungry ") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 eating ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 1 hungry ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt. -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_MODULE("bsp") - -// Local objects ------------------------------------------------------------- -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - enum AppRecords { // application-specific trace records - BSP_CALL = QP::QS_USER, - }; - -#endif - -} // unnamed namespace - - -//============================================================================ -namespace BSP { - -void init() { - BSP::randomSeed(1234U); - - // initialize the QS software tracing - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - QS_FUN_DICTIONARY(&BSP::displayPaused); - QS_FUN_DICTIONARY(&BSP::displayPhilStat); - QS_FUN_DICTIONARY(&BSP::random); - QS_FUN_DICTIONARY(&BSP::randomSeed); - - QS_ONLY(APP::produce_sig_dict()); - - QS_USR_DICTIONARY(BSP_CALL); -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::displayPhilStat); - QS_U8(0, n); - QS_STR(stat); - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - QS_TEST_PROBE_DEF(&BSP::displayPaused) - - QS_TEST_PROBE( - Q_ASSERT_ID(100, 0); - ) - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::displayPaused); - QS_U8(0, paused); - QS_END() -} -//............................................................................ -std::uint32_t random() { - QS_TEST_PROBE_DEF(&BSP::random) - uint32_t rnd = 123U; - - QS_TEST_PROBE( - rnd = qs_tp_; - ) - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::random); - QS_U32(0, rnd); - QS_END() - return rnd; -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - QS_TEST_PROBE_DEF(&BSP::randomSeed) - - QS_TEST_PROBE( - seed = qs_tp_; - ) - l_rnd = seed; - QS_BEGIN_ID(BSP_CALL, 0U) // app-specific record - QS_FUN(&BSP::randomSeed); - QS_U32(0, seed); - QS_END() -} - -} // namespace BSP - diff --git a/examples/qutest/dpp/src/bsp.hpp b/examples/qutest/dpp/src/bsp.hpp deleted file mode 100644 index 2cea8b8b0..000000000 --- a/examples/qutest/dpp/src/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100U}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/qutest/dpp/src/dpp.hpp b/examples/qutest/dpp/src/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/qutest/dpp/src/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/qutest/dpp/src/dpp.qm b/examples/qutest/dpp/src/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/qutest/dpp/src/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/qutest/dpp/src/philo.cpp b/examples/qutest/dpp/src/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/qutest/dpp/src/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qutest/dpp/src/table.cpp b/examples/qutest/dpp/src/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/qutest/dpp/src/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qutest/dpp/test_dpp/Makefile b/examples/qutest/dpp/test_dpp/Makefile deleted file mode 100644 index bcaba8f97..000000000 --- a/examples/qutest/dpp/test_dpp/Makefile +++ /dev/null @@ -1,274 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - philo.cpp \ - table.cpp \ - test_dpp.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := $(DEF) - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_dpp/README.txt b/examples/qutest/dpp/test_dpp/README.txt deleted file mode 100644 index 8db05aff4..000000000 --- a/examples/qutest/dpp/test_dpp/README.txt +++ /dev/null @@ -1,141 +0,0 @@ -QUTest Integration Testing of the DPP Application -================================================= -The tests included in the qutest/dpp/test_dpp directory perform integration -testing of the DPP application. The difference from pure unit testing is -that multiple active objects (AOs) are started and the tests exercise -interactions among these active objects. - -The Test Fixture ----------------- -The QUTest test fixture in this case is built from the same components as -the final application (except that it is linked with the "QUTest stub" of -the QP framework, instead of the fully-functional version). - -Specifically, the test fixture in this case uses the same main() function -(the same main.c module, even) as the final DPP application. - -The Test Scripts ----------------- -The test scripts (*.py files for testing with Python and *.tcl files for -testing with Tcl) demonstrate injecting events and clock ticks to drive -the application. - - -The Test Targets -================ -The makefiles provided with this test support several targets. Each -supported target system requires building a separate QUTest fixture, -but all targets can be tested with the *same* test scripts. - -The following sub-sections describe how to build the code and run -the tests. - -Host Executable ---------------- -The provided Makefile builds the test fixture for the host executable, -which can be Windows, Linux or MacOSX. - -Before running the Makefile, the QSPY host utility needs to be stated -from command-prompt/terminal as follows: - -qspy -u -t - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make - -The provided Makefile both builds the fixture and run the test -scripts. By default, the Python test scripts are used. If you wish -to run Tcl test scripts instead, please type: - -make SCRIPT=tcl - -Embedded Target: EFM32 ----------------------- -The provided makefile make_efm32 builds the test fixture for the -EFM32-SLSTK3401A board (ARM Cortex-M4). The makefile works on Windows hosts -only. - -Before running make -f make_efm32, the QSPY host utility needs to -be stated from command-prompt/terminal as follows: - -qspy -u -c COM2 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the EFM32-SLSTK3401A board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make -f make_efm32 - -The provided Makefile both builds the fixture and run the test -scripts. By default, the Python test scripts are used. If you wish -to run Tcl test scripts instead, please type: - -make -f make_efm32 SCRIPT=tcl - - -Embedded Target: TM4C123 ------------------------- -The provided makefile make_tm4c123 builds the test fixture for the -EK-TM4C123GXL board (ARM Cortex-M4). The makefile works on Windows hosts -only. - -Before running make -f make_efm32, the QSPY host utility needs to -be stated from command-prompt/terminal as follows: - -qspy -u -c COM3 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the EK-TM4C123GXL TivaC LaunchPad board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -make -f make_efm32 - -The provided Makefile both builds the fixture and run the test scripts. -By default, the Python test scripts are used. Alternatively, if you wish -to run Tcl test scripts instead, please type: - -make -f make_efm32 SCRIPT=tcl - - -Embedded Target: MSP430 ------------------------- -The provided CCS (Code Composer Studio) project files -.project/.csproject/.ccsproject build the test fixture for the -MSP-EXP430F5529LP LauchPad board (MSP430X CPU). - -NOTE: Currently testing on the MSP430 target is NOT fully automated, -because it is based on the CCS IDE. This requires building and loading -the test fixture *manually* from CCS, and only then by a separate step -of running the test scripts. - -After building the fixture and loading it into the flash memory -of the MSP-EXP430F5529LP LauchPad board, you need to open the QSPY host -utility from command-prompt/terminal as follows: - -qspy -u -c COM4 -b9600 - -where you need to adjust the COM port number to the virtual COM port -number assigned to the MSP-EXP430F5529LP LauchPad board on your system. - -Next, you need to open another command-prompt/terminal, change to this -directory (qutest/dpp/test_dpp), and run: - -python %QTOOLS%\qspy\py\qutest.py - -This will run the test scripts in Python. Alternatively, if you wish -to run Tcl test scripts instead, please type: - -tclsh %QTOOLS%\qspy\tcl\qutest.tcl - - -Contact Information -=================== -https://www.state-machine.com -mailto:info@state-machine.com - \ No newline at end of file diff --git a/examples/qutest/dpp/test_dpp/lnk_msp430f5529.cmd b/examples/qutest/dpp/test_dpp/lnk_msp430f5529.cmd deleted file mode 100644 index e97355885..000000000 --- a/examples/qutest/dpp/test_dpp/lnk_msp430f5529.cmd +++ /dev/null @@ -1,251 +0,0 @@ -/* ============================================================================ */ -/* Copyright (c) 2017, Texas Instruments Incorporated */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following conditions */ -/* are met: */ -/* */ -/* * Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* */ -/* * Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in the */ -/* documentation and/or other materials provided with the distribution. */ -/* */ -/* * Neither the name of Texas Instruments Incorporated nor the names of */ -/* its contributors may be used to endorse or promote products derived */ -/* from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" */ -/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, */ -/* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR */ -/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ -/* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ -/* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; */ -/* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, */ -/* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ -/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ============================================================================ */ - -/******************************************************************************/ -/* lnk_msp430f5529.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5529 PROGRAMS */ -/* */ -/* Usage: lnk430 -o -m lnk.cmd */ -/* cl430 -z -o -m lnk.cmd */ -/* */ -/*----------------------------------------------------------------------------*/ -/* These linker options are for command line linking only. For IDE linking, */ -/* you should set your linker options in Project Properties */ -/* -c LINK USING C CONVENTIONS */ -/* -stack 0x0100 SOFTWARE STACK SIZE */ -/* -heap 0x0100 HEAP AREA SIZE */ -/* */ -/*----------------------------------------------------------------------------*/ -/* Version: 1.203 */ -/*----------------------------------------------------------------------------*/ - -/****************************************************************************/ -/* Specify the system memory map */ -/****************************************************************************/ - -MEMORY -{ - SFR : origin = 0x0000, length = 0x0010 - PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0 - PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100 - RAM : origin = 0x2400, length = 0x2000 - USBRAM : origin = 0x1C00, length = 0x0800 - INFOA : origin = 0x1980, length = 0x0080 - INFOB : origin = 0x1900, length = 0x0080 - INFOC : origin = 0x1880, length = 0x0080 - INFOD : origin = 0x1800, length = 0x0080 - FLASH : origin = 0x4400, length = 0xBB80 - FLASH2 : origin = 0x10000,length = 0x14400 - INT00 : origin = 0xFF80, length = 0x0002 - INT01 : origin = 0xFF82, length = 0x0002 - INT02 : origin = 0xFF84, length = 0x0002 - INT03 : origin = 0xFF86, length = 0x0002 - INT04 : origin = 0xFF88, length = 0x0002 - INT05 : origin = 0xFF8A, length = 0x0002 - INT06 : origin = 0xFF8C, length = 0x0002 - INT07 : origin = 0xFF8E, length = 0x0002 - INT08 : origin = 0xFF90, length = 0x0002 - INT09 : origin = 0xFF92, length = 0x0002 - INT10 : origin = 0xFF94, length = 0x0002 - INT11 : origin = 0xFF96, length = 0x0002 - INT12 : origin = 0xFF98, length = 0x0002 - INT13 : origin = 0xFF9A, length = 0x0002 - INT14 : origin = 0xFF9C, length = 0x0002 - INT15 : origin = 0xFF9E, length = 0x0002 - INT16 : origin = 0xFFA0, length = 0x0002 - INT17 : origin = 0xFFA2, length = 0x0002 - INT18 : origin = 0xFFA4, length = 0x0002 - INT19 : origin = 0xFFA6, length = 0x0002 - INT20 : origin = 0xFFA8, length = 0x0002 - INT21 : origin = 0xFFAA, length = 0x0002 - INT22 : origin = 0xFFAC, length = 0x0002 - INT23 : origin = 0xFFAE, length = 0x0002 - INT24 : origin = 0xFFB0, length = 0x0002 - INT25 : origin = 0xFFB2, length = 0x0002 - INT26 : origin = 0xFFB4, length = 0x0002 - INT27 : origin = 0xFFB6, length = 0x0002 - INT28 : origin = 0xFFB8, length = 0x0002 - INT29 : origin = 0xFFBA, length = 0x0002 - INT30 : origin = 0xFFBC, length = 0x0002 - INT31 : origin = 0xFFBE, length = 0x0002 - INT32 : origin = 0xFFC0, length = 0x0002 - INT33 : origin = 0xFFC2, length = 0x0002 - INT34 : origin = 0xFFC4, length = 0x0002 - INT35 : origin = 0xFFC6, length = 0x0002 - INT36 : origin = 0xFFC8, length = 0x0002 - INT37 : origin = 0xFFCA, length = 0x0002 - INT38 : origin = 0xFFCC, length = 0x0002 - INT39 : origin = 0xFFCE, length = 0x0002 - INT40 : origin = 0xFFD0, length = 0x0002 - INT41 : origin = 0xFFD2, length = 0x0002 - INT42 : origin = 0xFFD4, length = 0x0002 - INT43 : origin = 0xFFD6, length = 0x0002 - INT44 : origin = 0xFFD8, length = 0x0002 - INT45 : origin = 0xFFDA, length = 0x0002 - INT46 : origin = 0xFFDC, length = 0x0002 - INT47 : origin = 0xFFDE, length = 0x0002 - INT48 : origin = 0xFFE0, length = 0x0002 - INT49 : origin = 0xFFE2, length = 0x0002 - INT50 : origin = 0xFFE4, length = 0x0002 - INT51 : origin = 0xFFE6, length = 0x0002 - INT52 : origin = 0xFFE8, length = 0x0002 - INT53 : origin = 0xFFEA, length = 0x0002 - INT54 : origin = 0xFFEC, length = 0x0002 - INT55 : origin = 0xFFEE, length = 0x0002 - INT56 : origin = 0xFFF0, length = 0x0002 - INT57 : origin = 0xFFF2, length = 0x0002 - INT58 : origin = 0xFFF4, length = 0x0002 - INT59 : origin = 0xFFF6, length = 0x0002 - INT60 : origin = 0xFFF8, length = 0x0002 - INT61 : origin = 0xFFFA, length = 0x0002 - INT62 : origin = 0xFFFC, length = 0x0002 - RESET : origin = 0xFFFE, length = 0x0002 -} - -/****************************************************************************/ -/* Specify the sections allocation into memory */ -/****************************************************************************/ - -SECTIONS -{ - .bss : {} > RAM /* Global & static vars */ - .data : {} > RAM /* Global & static vars */ - .TI.noinit : {} > RAM /* For #pragma noinit */ - .sysmem : {} > RAM /* Dynamic memory allocation area */ - .stack : {} > RAM (HIGH) /* Software system stack */ - -#ifndef __LARGE_CODE_MODEL__ - .text : {} > FLASH /* Code */ -#else - .text : {} >> FLASH2 | FLASH /* Code */ -#endif - .text:_isr : {} > FLASH /* ISR Code space */ - .cinit : {} > FLASH /* Initialization tables */ -#ifndef __LARGE_DATA_MODEL__ - .const : {} > FLASH /* Constant data */ -#else - .const : {} >> FLASH | FLASH2 /* Constant data */ -#endif - .cio : {} > RAM /* C I/O Buffer */ - - .pinit : {} > FLASH /* C++ Constructor tables */ - .binit : {} > FLASH /* Boot-time Initialization tables */ - .init_array : {} > FLASH /* C++ Constructor tables */ - .mspabi.exidx : {} > FLASH /* C++ Constructor tables */ - .mspabi.extab : {} > FLASH /* C++ Constructor tables */ -#ifdef __TI_COMPILER_VERSION__ - #if __TI_COMPILER_VERSION__ >= 15009000 - #ifndef __LARGE_CODE_MODEL__ - .TI.ramfunc : {} load=FLASH, run=RAM, table(BINIT) - #else - .TI.ramfunc : {} load=FLASH | FLASH2, run=RAM, table(BINIT) - #endif - #endif -#endif - - .infoA : {} > INFOA /* MSP430 INFO FLASH Memory segments */ - .infoB : {} > INFOB - .infoC : {} > INFOC - .infoD : {} > INFOD - - /* MSP430 Interrupt vectors */ - .int00 : {} > INT00 - .int01 : {} > INT01 - .int02 : {} > INT02 - .int03 : {} > INT03 - .int04 : {} > INT04 - .int05 : {} > INT05 - .int06 : {} > INT06 - .int07 : {} > INT07 - .int08 : {} > INT08 - .int09 : {} > INT09 - .int10 : {} > INT10 - .int11 : {} > INT11 - .int12 : {} > INT12 - .int13 : {} > INT13 - .int14 : {} > INT14 - .int15 : {} > INT15 - .int16 : {} > INT16 - .int17 : {} > INT17 - .int18 : {} > INT18 - .int19 : {} > INT19 - .int20 : {} > INT20 - .int21 : {} > INT21 - .int22 : {} > INT22 - .int23 : {} > INT23 - .int24 : {} > INT24 - .int25 : {} > INT25 - .int26 : {} > INT26 - .int27 : {} > INT27 - .int28 : {} > INT28 - .int29 : {} > INT29 - .int30 : {} > INT30 - .int31 : {} > INT31 - .int32 : {} > INT32 - .int33 : {} > INT33 - .int34 : {} > INT34 - .int35 : {} > INT35 - .int36 : {} > INT36 - .int37 : {} > INT37 - .int38 : {} > INT38 - .int39 : {} > INT39 - .int40 : {} > INT40 - RTC : { * ( .int41 ) } > INT41 type = VECT_INIT - PORT2 : { * ( .int42 ) } > INT42 type = VECT_INIT - TIMER2_A1 : { * ( .int43 ) } > INT43 type = VECT_INIT - TIMER2_A0 : { * ( .int44 ) } > INT44 type = VECT_INIT - USCI_B1 : { * ( .int45 ) } > INT45 type = VECT_INIT - USCI_A1 : { * ( .int46 ) } > INT46 type = VECT_INIT - PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT - TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT - TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT - DMA : { * ( .int50 ) } > INT50 type = VECT_INIT - USB_UBM : { * ( .int51 ) } > INT51 type = VECT_INIT - TIMER0_A1 : { * ( .int52 ) } > INT52 type = VECT_INIT - TIMER0_A0 : { * ( .int53 ) } > INT53 type = VECT_INIT - ADC12 : { * ( .int54 ) } > INT54 type = VECT_INIT - USCI_B0 : { * ( .int55 ) } > INT55 type = VECT_INIT - USCI_A0 : { * ( .int56 ) } > INT56 type = VECT_INIT - WDT : { * ( .int57 ) } > INT57 type = VECT_INIT - TIMER0_B1 : { * ( .int58 ) } > INT58 type = VECT_INIT - TIMER0_B0 : { * ( .int59 ) } > INT59 type = VECT_INIT - COMP_B : { * ( .int60 ) } > INT60 type = VECT_INIT - UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT - SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT - .reset : {} > RESET /* MSP430 Reset vector */ -} - -/****************************************************************************/ -/* Include peripherals memory map */ -/****************************************************************************/ - --l msp430f5529.cmd - diff --git a/examples/qutest/dpp/test_dpp/make_efm32 b/examples/qutest/dpp/test_dpp/make_efm32 deleted file mode 100644 index 67684e2aa..000000000 --- a/examples/qutest/dpp/test_dpp/make_efm32 +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_efm32 # make and run the tests in the current directory -# make -f make_efm32 TESTS=philo*.py # make and run the selected tests -# make -f make_efm32 HOST=localhost:7705 # connect to host:port -# make -f make_efm32 norun # only make but not run the tests -# make -f make_efm32 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := efm32 -TARGET_DIR := ..\..\..\..\3rd_party\efm32pg1b\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# FLASH tool (NOTE: Requires the JLINK utility) -# see $(TARGET_DIR)\flash.bat -# - -FLASH := $(TARGET_DIR)\flash.bat - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo MAKECMDGOALS = $(MAKECMDGOALS) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_dpp/make_nucleo-l053r8 b/examples/qutest/dpp/test_dpp/make_nucleo-l053r8 deleted file mode 100644 index 25cb1cd62..000000000 --- a/examples/qutest/dpp/test_dpp/make_nucleo-l053r8 +++ /dev/null @@ -1,320 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_dpp/make_posix b/examples/qutest/dpp/test_dpp/make_posix deleted file mode 100644 index d7d7cc4c0..000000000 --- a/examples/qutest/dpp/test_dpp/make_posix +++ /dev/null @@ -1,249 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST; QP/C++ on POSIX *Target* -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_posix # make and run the tests in the current directory -# make -f make_posix HOST=192.168.1.65:6601 # make and run the executable -# make -f make_posix norun # only make but not run the tests -# make -f make_posix clean # cleanup the build -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_dpp - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH = . \ - ../src - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - - -ifeq ($(MAKECMDGOALS),test) - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - philo.cpp \ - table.cpp \ - test_dpp.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest - -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -LIBS += -lpthread - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities: - -MKDIR := mkdir -p -RM := rm -f - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build_posix - -CFLAGS = -c -g -O -Wall -Wstrict-prototypes -W $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS = -c -g -O -Wall -W -fno-rtti -fno-exceptions $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun test clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -# run the test fixture on a POSIX target in a loop, so that it is re-started -# after every test. The loop is terminated by pressing Ctrl-C on the keyboard. -# -run : $(TARGET_EXE) - set -e; while true; do \ - echo "restarting $(TARGET_EXE)"; \ - $(TARGET_EXE) "" $(HOST); \ - done - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),test) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -test : - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo HOST = $(HOST) - diff --git a/examples/qutest/dpp/test_dpp/make_tm4c123 b/examples/qutest/dpp/test_dpp/make_tm4c123 deleted file mode 100644 index 50e57e58f..000000000 --- a/examples/qutest/dpp/test_dpp/make_tm4c123 +++ /dev/null @@ -1,323 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.0 -# Date of the Last Update: 2023-09-04 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_dpp -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - test_dpp.cpp \ - philo.cpp \ - table.cpp \ - bsp.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_dpp/test_dpp.cpp b/examples/qutest/dpp/test_dpp/test_dpp.cpp deleted file mode 100644 index 886a960f2..000000000 --- a/examples/qutest/dpp/test_dpp/test_dpp.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//============================================================================ -// Product: QUTEST fixture for the DPP components -// Last updated for version 7.3.0 -// Last updated on 2023-08-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -//#include "safe_std.h" // portable "safe" / facilities - -//============================================================================ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; // small pool - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start the active objects... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( // AO to start - n + 1U, // QF-priority - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - nullptr, // stack storage (not used) - 0U); // size of the stack [bytes] - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( // AO to start - APP::N_PHILO + 1U, // QF-priority - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - nullptr, // stack storage (not used) - 0U); // size of the stack [bytes] - - return QP::QF::run(); // run the QF application -} - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - (void)e; -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // embedded Target -#endif // embedded Target -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(status); - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // application-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp/test_dpp/test_init.py b/examples/qutest/dpp/test_dpp/test_init.py deleted file mode 100644 index 37c4422eb..000000000 --- a/examples/qutest/dpp/test_dpp/test_init.py +++ /dev/null @@ -1,58 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("@timestamp AO-Subsc Obj=Philo::inst[0],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[0],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[0],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[0].m_timeEvt,AO=Philo::inst[0],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[0],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[0],State=Philo::thinking") - expect("@timestamp AO-Subsc Obj=Philo::inst[1],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[1],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[1],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[1].m_timeEvt,AO=Philo::inst[1],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[1],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[1],State=Philo::thinking") - expect("@timestamp AO-Subsc Obj=Philo::inst[2],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[2],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[2],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp AO-Subsc Obj=Philo::inst[3],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[3],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[3],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[3].m_timeEvt,AO=Philo::inst[3],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[3],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[3],State=Philo::thinking") - expect("@timestamp AO-Subsc Obj=Philo::inst[4],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[4],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[4],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[4].m_timeEvt,AO=Philo::inst[4],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[4],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[4],State=Philo::thinking") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=DONE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=PAUSE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=SERVE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=TEST_SIG") - expect("@timestamp BSP_CALL BSP::displayPhilStat 0 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 1 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 2 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 3 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 4 thinking") - expect("===RTC===> St-Init Obj=Table::inst,State=QP::QHsm::top->Table::serving") - expect("===RTC===> St-Entry Obj=Table::inst,State=Table::serving") - expect("@timestamp Init===> Obj=Table::inst,State=Table::serving") - expect_run() - -test("DPP init") diff --git a/examples/qutest/dpp/test_dpp/test_tick.py b/examples/qutest/dpp/test_dpp/test_tick.py deleted file mode 100644 index 6595407dc..000000000 --- a/examples/qutest/dpp/test_dpp/test_tick.py +++ /dev/null @@ -1,75 +0,0 @@ -# test script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - -# tests... -test("tick") -glb_filter(GRP_ALL) -current_obj(OBJ_TE, "Philo::inst[2].m_timeEvt") -tick() -expect(" Tick<0> Ctr=*") -expect(" TE0-ADis Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("@timestamp TE0-Post Obj=Philo::inst[2].m_timeEvt,Sig=TIMEOUT_SIG,AO=Philo::inst[2]") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Philo::inst[2],Evt,*") -expect("@timestamp AO-GetL Obj=Philo::inst[2],Evt") -expect("@timestamp Disp===> Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-DisA Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp AO-Post Sdr=Philo::inst[2],Obj=Table::inst,Evt,*") -expect("@timestamp QUTEST_ON_POST HUNGRY_SIG,Obj=Table::inst 2") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp AO-GetL Obj=Table::inst,Evt") -expect("@timestamp Disp===> Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 hungry ") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=EAT_SIG,*") -expect("@timestamp QF-Pub Sdr=Table::inst,Evt") -expect("@timestamp AO-Post Sdr=Table::inst,Obj=Philo::inst[4],Evt,*") -expect("@timestamp QUTEST_ON_POST EAT_SIG,Obj=Philo::inst[4] 2") -expect("@timestamp AO-Post Sdr=Table::inst,Obj=Philo::inst[3],Evt,*") -expect("@timestamp QUTEST_ON_POST EAT_SIG,Obj=Philo::inst[3] 2") -expect("@timestamp AO-Post Sdr=Table::inst,Obj=Philo::inst[2],Evt,*") -expect("@timestamp QUTEST_ON_POST EAT_SIG,Obj=Philo::inst[2] 2") -expect("@timestamp AO-Post Sdr=Table::inst,Obj=Philo::inst[1],Evt,*") -expect("@timestamp QUTEST_ON_POST EAT_SIG,Obj=Philo::inst[1] 2") -expect("@timestamp AO-Post Sdr=Table::inst,Obj=Philo::inst[0],Evt,*") -expect("@timestamp QUTEST_ON_POST EAT_SIG,Obj=Philo::inst[0] 2") -expect("@timestamp QF-gcA EvtIntern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt") -expect("@timestamp MP-Put Obj=EvtPool1,*") -expect("@timestamp AO-GetL Obj=Philo::inst[4],Evt Obj=Philo::inst[4],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp =>Intern Obj=Philo::inst[4],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp QF-gcA Evt Obj=Philo::inst[3],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp =>Intern Obj=Philo::inst[3],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp QF-gcA Evt Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2],Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry->Philo::eating") -expect("@timestamp QF-gcA Evt Obj=Philo::inst[1],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp =>Intern Obj=Philo::inst[1],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp QF-gcA Evt Obj=Philo::inst[0],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp =>Intern Obj=Philo::inst[0],Sig=EAT_SIG,State=Philo::thinking") -expect("@timestamp QF-gc Evt. -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_philo - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - philo.cpp \ - test_philo.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_philo/test_init.py b/examples/qutest/dpp/test_philo/test_init.py deleted file mode 100644 index e64ad90c6..000000000 --- a/examples/qutest/dpp/test_philo/test_init.py +++ /dev/null @@ -1,20 +0,0 @@ -# test script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("@timestamp AO-Subsc Obj=Philo::inst[2],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Philo::inst[2],Sig=TEST_SIG") - expect("===RTC===> St-Init Obj=Philo::inst[2],State=QP::QHsm::top->Philo::thinking") - expect("@timestamp BSP_CALL BSP::random *") - expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2],Tim=*,Int=0") - expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") - expect("@timestamp Init===> Obj=Philo::inst[2],State=Philo::thinking") - expect("===RTC===> St-Init Obj=Table_dummy,State=QP::QHsm::top->NULL") - expect_run() - -# tests... -test("init") diff --git a/examples/qutest/dpp/test_philo/test_philo.cpp b/examples/qutest/dpp/test_philo/test_philo.cpp deleted file mode 100644 index bb69e3d8a..000000000 --- a/examples/qutest/dpp/test_philo/test_philo.cpp +++ /dev/null @@ -1,139 +0,0 @@ -//============================================================================ -// Test fixture for DPP example -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -namespace { // unnamed namespace - -// instantiate dummy collaborator AOs... -static QP::QActiveDummy Table_dummy; - -} // unnamed namespace - -QP::QActive * const APP::AO_Table = &Table_dummy; - -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - // object dictionaries... - QS_OBJ_DICTIONARY(&Table_dummy); - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start the active objects... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - std::uint8_t n = 2; - APP::AO_Philo[n]->start( - n + 1U, // QP priority - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - nullptr, 0U); - - APP::AO_Table->start( - APP::N_PHILO + 1U, // QP priority of the dummy - nullptr, 0U, nullptr, 0U); - - return QP::QF::run(); // run the QF application -} - - -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - (void)cmdId; - (void)param1; - (void)param2; - (void)param3; - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QP::QEvt *e) { - (void)e; -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QP::QActive *recipient, - QP::QEvt const *e, bool status) -{ - (void)sender; - (void)status; - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // app-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp/test_philo/test_philo.py b/examples/qutest/dpp/test_philo/test_philo.py deleted file mode 100644 index 4039dd8c9..000000000 --- a/examples/qutest/dpp/test_philo/test_philo.py +++ /dev/null @@ -1,89 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - glb_filter(GRP_ALL) - loc_filter(IDS_ALL, -IDS_AO) - ao_filter("Philo::inst[2]") - current_obj(OBJ_SM_AO, "Philo::inst[2]") - current_obj(OBJ_TE, "Philo::inst[2].m_timeEvt") - -# tests... -test("Philo-thinking tick") -tick() -expect(" Tick<0> Ctr=*") -expect(" TE0-ADis Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("@timestamp TE0-Post Obj=Philo::inst[2].m_timeEvt,Sig=TIMEOUT_SIG,AO=Philo::inst[2]") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Philo::inst[2],Evt Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-DisA Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp QF-gc Evt St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp Trg-Done QS_RX_TICK") - -test("Philo-hungry publish EAT", NORESET) -publish("EAT_SIG", pack(" Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2],Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=EAT_SIG,State=Philo::hungry->Philo::eating") -expect("@timestamp QF-gc Evt Ctr=*") -expect(" TE0-ADis Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("@timestamp TE0-Post Obj=Philo::inst[2].m_timeEvt,Sig=TIMEOUT_SIG,AO=Philo::inst[2]") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Philo::inst[2],Evt,*") -expect("@timestamp AO-GetL Obj=Philo::inst[2],Evt") -expect("@timestamp Disp===> Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::eating") -expect("@timestamp TE0-DisA Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=DONE_SIG,*") -expect("@timestamp QF-Pub Sdr=Philo::inst[2],Evt") -expect("@timestamp QF-gc Evt") -expect("@timestamp MP-Put Obj=EvtPool1,*") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::eating") -expect("@timestamp BSP_CALL BSP::random *") -expect("@timestamp TE0-Arm Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2],Tim=*,Int=0") -expect("===RTC===> St-Entry Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::eating->Philo::thinking") -expect("@timestamp Trg-Done QS_RX_TICK") - -test("Philo-thinking tick(2)", NORESET) -tick() -expect(" Tick<0> Ctr=*") -expect(" TE0-ADis Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("@timestamp TE0-Post Obj=Philo::inst[2].m_timeEvt,Sig=TIMEOUT_SIG,AO=Philo::inst[2]") -expect("@timestamp AO-Post Sdr=QS_RX,Obj=Philo::inst[2],Evt Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking") -expect("@timestamp TE0-DisA Obj=Philo::inst[2].m_timeEvt,AO=Philo::inst[2]") -expect("===RTC===> St-Exit Obj=Philo::inst[2],State=Philo::thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=HUNGRY_SIG,*") -expect("@timestamp QF-gc Evt St-Entry Obj=Philo::inst[2],State=Philo::hungry") -expect("@timestamp ===>Tran Obj=Philo::inst[2],Sig=TIMEOUT_SIG,State=Philo::thinking->Philo::hungry") -expect("@timestamp Trg-Done QS_RX_TICK") diff --git a/examples/qutest/dpp/test_table/Makefile b/examples/qutest/dpp/test_table/Makefile deleted file mode 100644 index 4a11cd895..000000000 --- a/examples/qutest/dpp/test_table/Makefile +++ /dev/null @@ -1,273 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_table - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - table.cpp \ - test_table.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/dpp/test_table/test_init.py b/examples/qutest/dpp/test_table/test_init.py deleted file mode 100644 index 3290f9b3f..000000000 --- a/examples/qutest/dpp/test_table/test_init.py +++ /dev/null @@ -1,35 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_ALL) - continue_test() - expect("===RTC===> St-Init Obj=Philo_dummy[0],State=QP::QHsm::top->NULL") - expect("@timestamp AO-Subsc Obj=Philo_dummy[0],Sig=EAT_SIG") - expect("===RTC===> St-Init Obj=Philo_dummy[1],State=QP::QHsm::top->NULL") - expect("@timestamp AO-Subsc Obj=Philo_dummy[1],Sig=EAT_SIG") - expect("===RTC===> St-Init Obj=Philo_dummy[2],State=QP::QHsm::top->NULL") - expect("@timestamp AO-Subsc Obj=Philo_dummy[2],Sig=EAT_SIG") - expect("===RTC===> St-Init Obj=Philo_dummy[3],State=QP::QHsm::top->NULL") - expect("@timestamp AO-Subsc Obj=Philo_dummy[3],Sig=EAT_SIG") - expect("===RTC===> St-Init Obj=Philo_dummy[4],State=QP::QHsm::top->NULL") - expect("@timestamp AO-Subsc Obj=Philo_dummy[4],Sig=EAT_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=DONE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=PAUSE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=SERVE_SIG") - expect("@timestamp AO-Subsc Obj=Table::inst,Sig=TEST_SIG") - expect("@timestamp BSP_CALL BSP::displayPhilStat 0 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 1 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 2 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 3 thinking") - expect("@timestamp BSP_CALL BSP::displayPhilStat 4 thinking") - expect("===RTC===> St-Init Obj=Table::inst,State=QP::QHsm::top->Table::serving") - expect("===RTC===> St-Entry Obj=Table::inst,State=Table::serving") - expect("@timestamp Init===> Obj=Table::inst,State=Table::serving") - expect_run() - -# tests... -test("init") - diff --git a/examples/qutest/dpp/test_table/test_table.cpp b/examples/qutest/dpp/test_table/test_table.cpp deleted file mode 100644 index cf1dce8f9..000000000 --- a/examples/qutest/dpp/test_table/test_table.cpp +++ /dev/null @@ -1,156 +0,0 @@ -//============================================================================ -// Test fixture for DPP example -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "dpp.hpp" - -namespace { // unnamed namespace - -//Q_DEFINE_THIS_FILE - -// instantiate dummy collaborator AOs... -static QP::QActiveDummy Philo_dummy[APP::N_PHILO]; - -} // unnamed namespace - -QP::QActive * const APP::AO_Philo[APP::N_PHILO] = { - &Philo_dummy[0], - &Philo_dummy[1], - &Philo_dummy[2], - &Philo_dummy[3], - &Philo_dummy[4] -}; - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - QS_OBJ_ARR_DICTIONARY(&Philo_dummy[n], n); - } - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize publish-subscribe... - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start and setup dummy AOs... - // NOTE: You need to start dummy AOs, if you wish to subscribe - // them to events. - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - Philo_dummy[n].start( - n + 1U, // QP priority - nullptr, 0U, - nullptr, 0U); - Philo_dummy[n].subscribe(APP::EAT_SIG); - } - - // start the active object under test (AOUT)... - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - APP::AO_Table->start( - APP::N_PHILO + 1U, // QP priority - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup() { -} -//............................................................................ -void QS::onTestTeardown() { -} - -//............................................................................ -// callback function to execute user commands -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - switch (cmdId) { - case 0U: { - QEvt const e_pause(APP::PAUSE_SIG); - APP::AO_Table->dispatch(&e_pause, - static_cast(param1)); - break; - } - case 1U: { - QEvt const e_serve(APP::SERVE_SIG); - APP::AO_Table->dispatch(&e_serve, - static_cast(param1)); - break; - } - default: - break; - } -} - -//============================================================================ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(status); - - switch (e->sig) { - case APP::EAT_SIG: - case APP::DONE_SIG: - case APP::HUNGRY_SIG: - QS_BEGIN_ID(QUTEST_ON_POST, 0U) // application-specific record - QS_SIG(e->sig, recipient); - QS_U8(0, Q_EVT_CAST(APP::TableEvt)->philoId); - QS_END() - break; - default: - break; - } -} - -} // namespace QP diff --git a/examples/qutest/dpp/test_table/test_table.py b/examples/qutest/dpp/test_table/test_table.py deleted file mode 100644 index b54b33e7c..000000000 --- a/examples/qutest/dpp/test_table/test_table.py +++ /dev/null @@ -1,85 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - continue_test() - expect_run() - glb_filter(GRP_ALL) - loc_filter(IDS_ALL, -IDS_AO) - ao_filter("Table::inst") - current_obj(OBJ_SM_AO, "Table::inst") - -def on_setup(): - print("on_setup") - -def on_teardown(): - print("on_teardown") - -# tests... -test("post HUNGRY") -post("HUNGRY_SIG", pack(" Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 hungry ") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=EAT_SIG,*") -expect("@timestamp QF-Pub Sdr=Table::inst,Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gc Evt") -expect("@timestamp MP-Put Obj=EvtPool1,*") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 eating ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 1 hungry ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=HUNGRY_SIG,State=Table::serving") -expect("@timestamp QF-gc Evt") -expect("@timestamp AO-GetL Obj=Table::inst,Evt Obj=Table::inst,Sig=DONE_SIG,State=Table::serving") -expect("@timestamp BSP_CALL BSP::displayPhilStat 2 thinking") -expect("@timestamp MP-Get Obj=EvtPool1,*") -expect("@timestamp QF-New Sig=EAT_SIG,*") -expect("@timestamp QF-Pub Sdr=Table::inst,Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gcA Evt") -expect("@timestamp QF-gc Evt") -expect("@timestamp MP-Put Obj=EvtPool1,*") -expect("@timestamp BSP_CALL BSP::displayPhilStat 1 eating ") -expect("@timestamp =>Intern Obj=Table::inst,Sig=DONE_SIG,State=Table::serving") -expect("@timestamp QF-gc Evtsig) { - case MY_EVT0_SIG: { - status_ = Q_HANDLED(); - break; - } - case MY_EVT1_SIG: { - status_ = Q_HANDLED(); - break; - } - case MY_EVT2_SIG: { - status_ = Q_HANDLED(); - break; - } - case MY_EVT3_SIG: { - status_ = Q_HANDLED(); - break; - } - default: { - status_ = Q_SUPER(&QHsm::top); - break; - } - } - return status_; -} - diff --git a/examples/qutest/evt_par/src/my_app.hpp b/examples/qutest/evt_par/src/my_app.hpp deleted file mode 100644 index 178df2a7e..000000000 --- a/examples/qutest/evt_par/src/my_app.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef MY_APP_HPP -#define MY_APP_HPP - -using namespace QP; - -enum MySignals { - MY_EVT0_SIG = Q_USER_SIG, - MY_EVT1_SIG, - MAX_PUB_SIG, // the last published signal - - MY_EVT2_SIG, - MY_EVT3_SIG, - MAX_SIG // the last signal -}; - -struct MyEvt1 : public QEvt { - uint32_t u32; -}; - -struct MyEvt2 : public QEvt { - uint32_t u32; - uint16_t u16; -}; - -struct MyEvt3 : public QEvt { - uint32_t u32; - uint16_t u16; - uint8_t u8; -}; - -extern QActive * const AO_MyAO; - -#endif // MY_APP_HPP diff --git a/examples/qutest/evt_par/test/Makefile b/examples/qutest/evt_par/test/Makefile deleted file mode 100644 index e3bfe838b..000000000 --- a/examples/qutest/evt_par/test/Makefile +++ /dev/null @@ -1,272 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_evt_par - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - my_ao.cpp \ - test_evt_par.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/evt_par/test/make_tm4c123 b/examples/qutest/evt_par/test/make_tm4c123 deleted file mode 100644 index 7847e31cb..000000000 --- a/examples/qutest/evt_par/test/make_tm4c123 +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_evt_par -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - my_ao.cpp \ - test_evt_par.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/evt_par/test/test_evt_par.cpp b/examples/qutest/evt_par/test/test_evt_par.cpp deleted file mode 100644 index aa9d4582b..000000000 --- a/examples/qutest/evt_par/test/test_evt_par.cpp +++ /dev/null @@ -1,151 +0,0 @@ -//============================================================================ -// Purpose: Fixture for QUTEST -// Last updated for version 7.3.0 -// Last updated on 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "my_app.hpp" // My Application - -Q_DEFINE_THIS_FILE - -//............................................................................ -int main(int argc, char *argv[]) { - static QSubscrList subscrSto[MAX_PUB_SIG]; - static QF_MPOOL_EL(MyEvt3) smlPoolSto[10]; - static QEvt const *myAoQueueSto[10]; - - QF::init(); // initialize the framework and the underlying RT kernel - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - // object dictionaries... - QS_OBJ_DICTIONARY(AO_MyAO); - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // initialize publish-subscribe.. - QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // initialize event pools... - QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - AO_MyAO->start(1U, // QP priority of the AO - myAoQueueSto, // event queue storage - Q_DIM(myAoQueueSto), // queue length [events] - nullptr, 0U); // stack storage and size (not used) - - return QF::run(); // run the QF application -} - -//---------------------------------------------------------------------------- -enum AppSpecRecords { - MY_EVT0 = QS_USER, - MY_EVT1, - MY_EVT2, - MY_EVT3 -}; - -//---------------------------------------------------------------------------- -void QS::onTestSetup(void) { - QS_USR_DICTIONARY(MY_EVT0); - QS_USR_DICTIONARY(MY_EVT1); - QS_USR_DICTIONARY(MY_EVT2); - QS_USR_DICTIONARY(MY_EVT3); -} -//............................................................................ -void QS::onTestTeardown(void) { -} - -//............................................................................ -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - (void)param1; // unused parameter - (void)param2; // unused parameter - (void)param3; // unused parameter - - switch (cmdId) { - case 0: { - break; - } - default: - break; - } -} -//............................................................................ -//! callback function to "massage" the injected QP events (not used here) -void QS::onTestEvt(QEvt *e) { - - switch (e->sig) { - case MY_EVT0_SIG: - QS_BEGIN_ID(MY_EVT0, 0U) // application-specific record - QS_END() - break; - case MY_EVT1_SIG: - QS_BEGIN_ID(MY_EVT1, 0U) // application-specific record - QS_U32(0, Q_EVT_CAST(MyEvt1)->u32); - QS_END() - break; - case MY_EVT2_SIG: - QS_BEGIN_ID(MY_EVT2, 0U) // application-specific record - QS_U32(0, Q_EVT_CAST(MyEvt2)->u32); - QS_U32(0, Q_EVT_CAST(MyEvt2)->u16); - QS_END() - break; - case MY_EVT3_SIG: - QS_BEGIN_ID(MY_EVT3, 0U) // application-specific record - QS_U32(0, Q_EVT_CAST(MyEvt3)->u32); - QS_U32(0, Q_EVT_CAST(MyEvt3)->u16); - QS_U32(0, Q_EVT_CAST(MyEvt3)->u8); - QS_END() - break; - } - -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // embedded Target -#endif // embedded Target - -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - (void)sender; - (void)recipient; - (void)e; - (void)status; -} - diff --git a/examples/qutest/evt_par/test/test_evt_par.py b/examples/qutest/evt_par/test/test_evt_par.py deleted file mode 100644 index 863a9c46e..000000000 --- a/examples/qutest/evt_par/test/test_evt_par.py +++ /dev/null @@ -1,32 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_pause() - glb_filter(GRP_UA) - current_obj(OBJ_SM_AO, "AO_MyAO") - continue_test() - expect_run() - -# tests... -test("EVT0") -dispatch("MY_EVT0_SIG") -expect("@timestamp MY_EVT0") -expect("@timestamp Trg-Done QS_RX_EVENT") - -test("EVT1") -dispatch("MY_EVT1_SIG", pack('. -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qhsmtst.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "qhsmtst.hpp" - -namespace { -Q_DEFINE_THIS_FILE -} - -namespace APP { - -//$declare${SMs::QHsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::QHsmTst} ............................................................ -class QHsmTst : public QP::QHsm { -private: - bool m_foo; - -public: - friend bool QHsmTst_isIn(std::uint32_t const state_num); - -public: - QHsmTst() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(s); - Q_STATE_DECL(s1); - Q_STATE_DECL(s11); - Q_STATE_DECL(s2); - Q_STATE_DECL(s21); - Q_STATE_DECL(s211); -}; // class QHsmTst -//$enddecl${SMs::QHsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -static QHsmTst l_hsmtst; // the only instance of the QHsmTst class - -// global-scope definitions ----------------------------------------- -QP::QAsm * const the_sm = &l_hsmtst; // the opaque pointer - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::QHsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::QHsmTst} ............................................................ - -//${SMs::QHsmTst::SM} ........................................................ -Q_STATE_DEF(QHsmTst, initial) { - //${SMs::QHsmTst::SM::initial} - Q_UNUSED_PAR(e); - m_foo = 0U; - BSP_display("top-INIT;"); - - QS_SIG_DICTIONARY(A_SIG, nullptr); - QS_SIG_DICTIONARY(B_SIG, nullptr); - QS_SIG_DICTIONARY(C_SIG, nullptr); - QS_SIG_DICTIONARY(D_SIG, nullptr); - QS_SIG_DICTIONARY(E_SIG, nullptr); - QS_SIG_DICTIONARY(F_SIG, nullptr); - QS_SIG_DICTIONARY(G_SIG, nullptr); - QS_SIG_DICTIONARY(H_SIG, nullptr); - QS_SIG_DICTIONARY(I_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - QS_FUN_DICTIONARY(&QHsmTst::s); - QS_FUN_DICTIONARY(&QHsmTst::s1); - QS_FUN_DICTIONARY(&QHsmTst::s11); - QS_FUN_DICTIONARY(&QHsmTst::s2); - QS_FUN_DICTIONARY(&QHsmTst::s21); - QS_FUN_DICTIONARY(&QHsmTst::s211); - - return tran(&s2); -} - -//${SMs::QHsmTst::SM::s} ..................................................... -Q_STATE_DEF(QHsmTst, s) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s} - case Q_ENTRY_SIG: { - BSP_display("s-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s} - case Q_EXIT_SIG: { - BSP_display("s-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::initial} - case Q_INIT_SIG: { - BSP_display("s-INIT;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::I} - case I_SIG: { - //${SMs::QHsmTst::SM::s::I::[m_foo]} - if (m_foo) { - m_foo = 0U; - BSP_display("s-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::E} - case E_SIG: { - BSP_display("s-E;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::TERMINATE} - case TERMINATE_SIG: { - BSP_terminate(0); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s1} ................................................. -Q_STATE_DEF(QHsmTst, s1) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s1} - case Q_ENTRY_SIG: { - BSP_display("s1-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1} - case Q_EXIT_SIG: { - BSP_display("s1-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::initial} - case Q_INIT_SIG: { - BSP_display("s1-INIT;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s1::I} - case I_SIG: { - BSP_display("s1-I;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::D} - case D_SIG: { - //${SMs::QHsmTst::SM::s::s1::D::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s1-D;"); - status_ = tran(&s); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s1::A} - case A_SIG: { - BSP_display("s1-A;"); - status_ = tran(&s1); - break; - } - //${SMs::QHsmTst::SM::s::s1::B} - case B_SIG: { - BSP_display("s1-B;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s1::F} - case F_SIG: { - BSP_display("s1-F;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s1::C} - case C_SIG: { - BSP_display("s1-C;"); - status_ = tran(&s2); - break; - } - default: { - status_ = super(&s); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s1::s11} ............................................ -Q_STATE_DEF(QHsmTst, s11) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s1::s11} - case Q_ENTRY_SIG: { - BSP_display("s11-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::s11} - case Q_EXIT_SIG: { - BSP_display("s11-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::H} - case H_SIG: { - BSP_display("s11-H;"); - status_ = tran(&s); - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::D} - case D_SIG: { - //${SMs::QHsmTst::SM::s::s1::s11::D::[m_foo]} - if (m_foo) { - m_foo = false; - BSP_display("s11-D;"); - status_ = tran(&s1); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s1::s11::G} - case G_SIG: { - BSP_display("s11-G;"); - status_ = tran(&s211); - break; - } - default: { - status_ = super(&s1); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2} ................................................. -Q_STATE_DEF(QHsmTst, s2) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2} - case Q_ENTRY_SIG: { - BSP_display("s2-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2} - case Q_EXIT_SIG: { - BSP_display("s2-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::initial} - case Q_INIT_SIG: { - BSP_display("s2-INIT;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s2::I} - case I_SIG: { - //${SMs::QHsmTst::SM::s::s2::I::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s2-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QHsmTst::SM::s::s2::F} - case F_SIG: { - BSP_display("s2-F;"); - status_ = tran(&s11); - break; - } - //${SMs::QHsmTst::SM::s::s2::C} - case C_SIG: { - BSP_display("s2-C;"); - status_ = tran(&s1); - break; - } - default: { - status_ = super(&s); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2::s21} ............................................ -Q_STATE_DEF(QHsmTst, s21) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2::s21} - case Q_ENTRY_SIG: { - BSP_display("s21-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21} - case Q_EXIT_SIG: { - BSP_display("s21-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::initial} - case Q_INIT_SIG: { - BSP_display("s21-INIT;"); - status_ = tran(&s211); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::G} - case G_SIG: { - BSP_display("s21-G;"); - status_ = tran(&s1); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::A} - case A_SIG: { - BSP_display("s21-A;"); - status_ = tran(&s21); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::B} - case B_SIG: { - BSP_display("s21-B;"); - status_ = tran(&s211); - break; - } - default: { - status_ = super(&s2); - break; - } - } - return status_; -} - -//${SMs::QHsmTst::SM::s::s2::s21::s211} ...................................... -Q_STATE_DEF(QHsmTst, s211) { - QP::QState status_; - switch (e->sig) { - //${SMs::QHsmTst::SM::s::s2::s21::s211} - case Q_ENTRY_SIG: { - BSP_display("s211-ENTRY;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211} - case Q_EXIT_SIG: { - BSP_display("s211-EXIT;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211::H} - case H_SIG: { - BSP_display("s211-H;"); - status_ = tran(&s); - break; - } - //${SMs::QHsmTst::SM::s::s2::s21::s211::D} - case D_SIG: { - BSP_display("s211-D;"); - status_ = tran(&s21); - break; - } - default: { - status_ = super(&s21); - break; - } - } - return status_; -} -//$enddef${SMs::QHsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -bool QHsmTst_isIn(std::uint32_t const state_num) { - QP::QHsm * const me = &l_hsmtst; - bool stat = false; - switch (state_num) { - case 0: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s)); - break; - case 1: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s1)); - break; - case 11: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s11)); - break; - case 2: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s2)); - break; - case 21: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s21)); - break; - case 211: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s211)); - break; - default: - Q_ERROR(); - } - return stat; -} - -} // namespace APP diff --git a/examples/qutest/qhsmtst/src/qhsmtst.hpp b/examples/qutest/qhsmtst/src/qhsmtst.hpp deleted file mode 100644 index 4413d407c..000000000 --- a/examples/qutest/qhsmtst/src/qhsmtst.hpp +++ /dev/null @@ -1,61 +0,0 @@ -//$file${.::qhsmtst.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qhsmtst.qm -// File: ${.::qhsmtst.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qhsmtst.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef QHSMTST_HPP_ -#define QHSMTST_HPP_ - -namespace APP { - -enum QHsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -extern QP::QAsm * const the_sm; // opaque pointer to the test SM - -bool QHsmTst_isIn(std::uint32_t const state_num); - -// BSP functions to display a message and exit -void BSP_display(char const *msg); -void BSP_terminate(int16_t const result); - -} // namespace APP - -#endif // QHSMTST_HPP_ diff --git a/examples/qutest/qhsmtst/src/qhsmtst.qm b/examples/qutest/qhsmtst/src/qhsmtst.qm deleted file mode 100644 index a7e89dc07..000000000 --- a/examples/qutest/qhsmtst/src/qhsmtst.qm +++ /dev/null @@ -1,387 +0,0 @@ - - - QHsmTst is a contrived state machine from Chapter 2 of the PSiCC2 book for testing all possible transition topologies with up to 4-levels of state nesting. - - - - - - - Test active object - - - - - - - : QHsm(&initial) - - - - - - Q_UNUSED_PAR(e); -m_foo = 0U; -BSP_display("top-INIT;"); - -QS_SIG_DICTIONARY(A_SIG, nullptr); -QS_SIG_DICTIONARY(B_SIG, nullptr); -QS_SIG_DICTIONARY(C_SIG, nullptr); -QS_SIG_DICTIONARY(D_SIG, nullptr); -QS_SIG_DICTIONARY(E_SIG, nullptr); -QS_SIG_DICTIONARY(F_SIG, nullptr); -QS_SIG_DICTIONARY(G_SIG, nullptr); -QS_SIG_DICTIONARY(H_SIG, nullptr); -QS_SIG_DICTIONARY(I_SIG, nullptr); -QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); -QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - - - - - - BSP_display("s-ENTRY;"); - BSP_display("s-EXIT;"); - - - BSP_display("s-INIT;"); - - - - - - - - - m_foo - m_foo = 0U; -BSP_display("s-I;"); - - - - - - - - - - - BSP_display("s-E;"); - - - - - - - BSP_terminate(0); - - - - - - - BSP_display("s1-ENTRY;"); - BSP_display("s1-EXIT;"); - - - BSP_display("s1-INIT;"); - - - - - - - BSP_display("s1-I;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s1-D;"); - - - - - - - - - - - BSP_display("s1-A;"); - - - - - - - BSP_display("s1-B;"); - - - - - - - BSP_display("s1-F;"); - - - - - - - BSP_display("s1-C;"); - - - - - - - BSP_display("s11-ENTRY;"); - BSP_display("s11-EXIT;"); - - - BSP_display("s11-H;"); - - - - - - - - - m_foo - m_foo = false; -BSP_display("s11-D;"); - - - - - - - - - - - BSP_display("s11-G;"); - - - - - - - - - - - - - - - - - BSP_display("s2-ENTRY;"); - BSP_display("s2-EXIT;"); - - - BSP_display("s2-INIT;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s2-I;"); - - - - - - - - - - - BSP_display("s2-F;"); - - - - - - - BSP_display("s2-C;"); - - - - - - - BSP_display("s21-ENTRY;"); - BSP_display("s21-EXIT;"); - - - BSP_display("s21-INIT;"); - - - - - - - BSP_display("s21-G;"); - - - - - - - BSP_display("s21-A;"); - - - - - - - BSP_display("s21-B;"); - - - - - - - BSP_display("s211-ENTRY;"); - BSP_display("s211-EXIT;"); - - - BSP_display("s211-H;"); - - - - - - - BSP_display("s211-D;"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef QHSMTST_HPP_ -#define QHSMTST_HPP_ - -namespace APP { - -enum QHsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -extern QP::QAsm * const the_sm; // opaque pointer to the test SM - -bool QHsmTst_isIn(std::uint32_t const state_num); - -// BSP functions to display a message and exit -void BSP_display(char const *msg); -void BSP_terminate(int16_t const result); - -} // namespace APP - -#endif // QHSMTST_HPP_ - - - - #include "qpcpp.hpp" -#include "qhsmtst.hpp" - -namespace { -Q_DEFINE_THIS_FILE -} - -namespace APP { - -$declare ${SMs::QHsmTst} - -static QHsmTst l_hsmtst; // the only instance of the QHsmTst class - -// global-scope definitions ----------------------------------------- -QP::QAsm * const the_sm = &l_hsmtst; // the opaque pointer - -$define ${SMs::QHsmTst} - -bool QHsmTst_isIn(std::uint32_t const state_num) { - QP::QHsm * const me = &l_hsmtst; - bool stat = false; - switch (state_num) { - case 0: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s)); - break; - case 1: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s1)); - break; - case 11: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s11)); - break; - case 2: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s2)); - break; - case 21: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s21)); - break; - case 211: - stat = me->isIn(Q_STATE_CAST(&QHsmTst::s211)); - break; - default: - Q_ERROR(); - } - return stat; -} - -} // namespace APP - - - diff --git a/examples/qutest/qhsmtst/test/Makefile b/examples/qutest/qhsmtst/test/Makefile deleted file mode 100644 index 82320042d..000000000 --- a/examples/qutest/qhsmtst/test/Makefile +++ /dev/null @@ -1,272 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_qhsm - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - qhsmtst.cpp \ - test_qhsm.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qhsmtst/test/make_nucleo-l053r8 b/examples/qutest/qhsmtst/test/make_nucleo-l053r8 deleted file mode 100644 index b7765fbc0..000000000 --- a/examples/qutest/qhsmtst/test/make_nucleo-l053r8 +++ /dev/null @@ -1,318 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qhsm -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - qhsmtst.cpp \ - test_qhsm.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qhsmtst/test/make_tm4c123 b/examples/qutest/qhsmtst/test/make_tm4c123 deleted file mode 100644 index 1b63189cc..000000000 --- a/examples/qutest/qhsmtst/test/make_tm4c123 +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qhsm -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - qhsmtst.cpp \ - test_qhsm.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qhsmtst/test/test_qhsm-funct.py b/examples/qutest/qhsmtst/test/test_qhsm-funct.py deleted file mode 100644 index 263fd41ff..000000000 --- a/examples/qutest/qhsmtst/test/test_qhsm-funct.py +++ /dev/null @@ -1,200 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_run() - glb_filter(GRP_UA) - current_obj(OBJ_SM, "the_sm") - -# tests... -test("QHsmTst_init") -init() -expect("@timestamp BSP_DISPLAY top-INIT;") -expect("@timestamp BSP_DISPLAY s-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -test("QHsmTst isIn", NORESET) -command(1, 1) # is in state s1 -expect("@timestamp CMD 0 1"); # NOT in s1 -expect("@timestamp Trg-Done QS_RX_COMMAND") -command(1, 21) # is in state s21 -expect("@timestamp CMD 1 21"); # YES, in s21 -expect("@timestamp Trg-Done QS_RX_COMMAND") -command(1, 211) # is in state s211 -expect("@timestamp CMD 1 211"); # YES, in s211 -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("QHsmTst dispatch", NORESET) -dispatch("A_SIG") -expect("@timestamp BSP_DISPLAY s21-A;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-INIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp BSP_DISPLAY s21-B;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s211-D;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-INIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp BSP_DISPLAY s-E;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s1-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp BSP_DISPLAY s1-F;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s2-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp BSP_DISPLAY s2-F;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("A_SIG") -expect("@timestamp BSP_DISPLAY s1-A;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp BSP_DISPLAY s1-B;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s1-D;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s11-D;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp BSP_DISPLAY s-E;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp BSP_DISPLAY s11-G;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp BSP_DISPLAY s211-H;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp BSP_DISPLAY s11-H;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s1-C;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp BSP_DISPLAY s21-G;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s1-C;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s2-C;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - diff --git a/examples/qutest/qhsmtst/test/test_qhsm-struct.py b/examples/qutest/qhsmtst/test/test_qhsm-struct.py deleted file mode 100644 index 0d1aad9b2..000000000 --- a/examples/qutest/qhsmtst/test/test_qhsm-struct.py +++ /dev/null @@ -1,213 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_run() - glb_filter(GRP_SM) - current_obj(OBJ_SM, "the_sm") - -# tests... -test("QHsmTst init") -init() -expect("===RTC===> St-Init Obj=the_sm,State=QP::QHsm::top->QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s2->QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp Init===> Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -test("QHsmTst dispatch", NORESET) -dispatch("A_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=A_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s21->QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=A_SIG,State=QHsmTst::s21->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=B_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=B_SIG,State=QHsmTst::s21->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s21->QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QHsmTst::s211->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=E_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=E_SIG,State=QHsmTst::s->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QHsmTst::s11") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QHsmTst::s1") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=F_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=F_SIG,State=QHsmTst::s1->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QHsmTst::s211") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QHsmTst::s2") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Unhnd Obj=the_sm,Sig=I_SIG,State=QHsmTst::s2") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QHsmTst::s") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=F_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=F_SIG,State=QHsmTst::s2->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("A_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=A_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s1->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=A_SIG,State=QHsmTst::s1->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=B_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=B_SIG,State=QHsmTst::s1->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Unhnd Obj=the_sm,Sig=D_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QHsmTst::s1->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s1->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QHsmTst::s11->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=E_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=E_SIG,State=QHsmTst::s->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=G_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=G_SIG,State=QHsmTst::s11->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=H_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=H_SIG,State=QHsmTst::s211->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=H_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=H_SIG,State=QHsmTst::s11->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s2->QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QHsmTst::s1->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=G_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s1->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=G_SIG,State=QHsmTst::s21->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s2->QHsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QHsmTst::s1->QHsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QHsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QHsmTst::s1->QHsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QHsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QHsmTst::s2->QHsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - diff --git a/examples/qutest/qhsmtst/test/test_qhsm.cpp b/examples/qutest/qhsmtst/test/test_qhsm.cpp deleted file mode 100644 index fb54431e4..000000000 --- a/examples/qutest/qhsmtst/test/test_qhsm.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//============================================================================ -// Purpose: Fixture for QUTEST -// Last Updated for Version: 7.3.1 -// Date of the Last Update: 2023-12-11 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "qhsmtst.hpp" - -Q_DEFINE_THIS_FILE - -//============================================================================ -namespace APP { - -enum { - BSP_DISPLAY = QP::QS_USER, - CMD, -}; - -void BSP_display(char const *msg) { - QS_BEGIN_ID(BSP_DISPLAY, 0U) // app-specific record - QS_STR(msg); - QS_END() -} -//............................................................................ -void BSP_terminate(int16_t const result) { - Q_UNUSED_PAR(result); -} - -} // namespace APP - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - //PRINTF_S(" Command id=%d param=%d\n", (int)cmdId, (int)param); - switch (cmdId) { - case 0U: { - QS_BEGIN_ID(APP::CMD, 0U) // app-specific record - QS_END() - break; - } - case 1U: { - bool ret = APP::QHsmTst_isIn(param1); - QS_BEGIN_ID(APP::CMD, 0U) // app-specific record - QS_U8(0U, ret ? 1 : 0); - QS_U8(0U, (uint8_t)param1); - QS_END() - break; - } - default: - break; - } -} - -//............................................................................ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(recipient); - Q_UNUSED_PAR(e); - Q_UNUSED_PAR(status); -} - -} // namespace QP - -//============================================================================ -using namespace APP; - -int main(int argc, char *argv[]) { - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10]; // small pool - - QP::QF::init(); // initialize the framework and the underlying RT kernel - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // dictionaries... - QS_OBJ_DICTIONARY(the_sm); - QS_USR_DICTIONARY(BSP_DISPLAY); - QS_USR_DICTIONARY(CMD); - - return QP::QF::run(); -} - diff --git a/examples/qutest/qmsmtst/src/qmsmtst.cpp b/examples/qutest/qmsmtst/src/qmsmtst.cpp deleted file mode 100644 index 6af3edc0f..000000000 --- a/examples/qutest/qmsmtst/src/qmsmtst.cpp +++ /dev/null @@ -1,772 +0,0 @@ -//$file${.::qmsmtst.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qmsmtst.qm -// File: ${.::qmsmtst.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qmsmtst.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "qmsmtst.hpp" - -namespace { -Q_DEFINE_THIS_FILE -} - -namespace APP { - -//$declare${SMs::QMsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::QMsmTst} ............................................................ -class QMsmTst : public QP::QMsm { -private: - bool m_foo; - -public: - friend bool QMsmTst_isIn(std::uint32_t const state_num); - -public: - QMsmTst() - : QMsm(&initial) - {} - -protected: - QM_STATE_DECL( initial); - QM_STATE_DECL( s); - QM_ACTION_DECL(s_e); - QM_ACTION_DECL(s_x); - QM_ACTION_DECL(s_i); - QM_STATE_DECL( s1); - QM_ACTION_DECL(s1_e); - QM_ACTION_DECL(s1_x); - QM_ACTION_DECL(s1_i); - QM_STATE_DECL( s11); - QM_ACTION_DECL(s11_e); - QM_ACTION_DECL(s11_x); - QM_STATE_DECL( s2); - QM_ACTION_DECL(s2_e); - QM_ACTION_DECL(s2_x); - QM_ACTION_DECL(s2_i); - QM_STATE_DECL( s21); - QM_ACTION_DECL(s21_e); - QM_ACTION_DECL(s21_x); - QM_ACTION_DECL(s21_i); - QM_STATE_DECL( s211); - QM_ACTION_DECL(s211_e); - QM_ACTION_DECL(s211_x); -}; // class QMsmTst -//$enddecl${SMs::QMsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -static QMsmTst l_msmtst; // the only instance of the QMsmTst class - -// global-scope definitions ----------------------------------------- -QP::QAsm * const the_sm = &l_msmtst; // the opaque pointer - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${SMs::QMsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${SMs::QMsmTst} ............................................................ - -//${SMs::QMsmTst::SM} ........................................................ -QM_STATE_DEF(QMsmTst, initial) { - //${SMs::QMsmTst::SM::initial} - Q_UNUSED_PAR(e); - - m_foo = 0U; - BSP_display("top-INIT;"); - - QS_SIG_DICTIONARY(A_SIG, nullptr); - QS_SIG_DICTIONARY(B_SIG, nullptr); - QS_SIG_DICTIONARY(C_SIG, nullptr); - QS_SIG_DICTIONARY(D_SIG, nullptr); - QS_SIG_DICTIONARY(E_SIG, nullptr); - QS_SIG_DICTIONARY(F_SIG, nullptr); - QS_SIG_DICTIONARY(G_SIG, nullptr); - QS_SIG_DICTIONARY(H_SIG, nullptr); - QS_SIG_DICTIONARY(I_SIG, nullptr); - QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); - QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - QS_FUN_DICTIONARY(&QMsmTst::s); - QS_FUN_DICTIONARY(&QMsmTst::s1); - QS_FUN_DICTIONARY(&QMsmTst::s11); - QS_FUN_DICTIONARY(&QMsmTst::s2); - QS_FUN_DICTIONARY(&QMsmTst::s21); - QS_FUN_DICTIONARY(&QMsmTst::s211); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s2_s, // target state - { - &s_e, // entry - &s2_e, // entry - &s2_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} - -//${SMs::QMsmTst::SM::s} ..................................................... -QP::QMState const QMsmTst::s_s = { - QM_STATE_NULL, // superstate (top) - &QMsmTst::s, - &QMsmTst::s_e, - &QMsmTst::s_x, - &QMsmTst::s_i -}; -//${SMs::QMsmTst::SM::s} -QM_ACTION_DEF(QMsmTst, s_e) { - BSP_display("s-ENTRY;"); - return qm_entry(&s_s); -} -//${SMs::QMsmTst::SM::s} -QM_ACTION_DEF(QMsmTst, s_x) { - BSP_display("s-EXIT;"); - return qm_exit(&s_s); -} -//${SMs::QMsmTst::SM::s::initial} -QM_ACTION_DEF(QMsmTst, s_i) { - //${SMs::QMsmTst::SM::s::initial} - BSP_display("s-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s} -QM_STATE_DEF(QMsmTst, s) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::I} - case I_SIG: { - //${SMs::QMsmTst::SM::s::I::[m_foo]} - if (m_foo) { - m_foo = 0U; - BSP_display("s-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::E} - case E_SIG: { - BSP_display("s-E;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::TERMINATE} - case TERMINATE_SIG: { - BSP_terminate(0); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s1} ................................................. -QP::QMState const QMsmTst::s1_s = { - &QMsmTst::s_s, // superstate - &QMsmTst::s1, - &QMsmTst::s1_e, - &QMsmTst::s1_x, - &QMsmTst::s1_i -}; -//${SMs::QMsmTst::SM::s::s1} -QM_ACTION_DEF(QMsmTst, s1_e) { - BSP_display("s1-ENTRY;"); - return qm_entry(&s1_s); -} -//${SMs::QMsmTst::SM::s::s1} -QM_ACTION_DEF(QMsmTst, s1_x) { - BSP_display("s1-EXIT;"); - return qm_exit(&s1_s); -} -//${SMs::QMsmTst::SM::s::s1::initial} -QM_ACTION_DEF(QMsmTst, s1_i) { - //${SMs::QMsmTst::SM::s::s1::initial} - BSP_display("s1-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s1} -QM_STATE_DEF(QMsmTst, s1) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s1::I} - case I_SIG: { - BSP_display("s1-I;"); - status_ = Q_RET_HANDLED; - break; - } - //${SMs::QMsmTst::SM::s::s1::D} - case D_SIG: { - //${SMs::QMsmTst::SM::s::s1::D::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s1-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s1_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s1::A} - case A_SIG: { - BSP_display("s1-A;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s1_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::B} - case B_SIG: { - BSP_display("s1-B;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::F} - case F_SIG: { - BSP_display("s1-F;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s1_x, // exit - &s2_e, // entry - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::C} - case C_SIG: { - BSP_display("s1-C;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s2_s, // target state - { - &s1_x, // exit - &s2_e, // entry - &s2_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s1::s11} ............................................ -QP::QMState const QMsmTst::s11_s = { - &QMsmTst::s1_s, // superstate - &QMsmTst::s11, - &QMsmTst::s11_e, - &QMsmTst::s11_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::QMsmTst::SM::s::s1::s11} -QM_ACTION_DEF(QMsmTst, s11_e) { - BSP_display("s11-ENTRY;"); - return qm_entry(&s11_s); -} -//${SMs::QMsmTst::SM::s::s1::s11} -QM_ACTION_DEF(QMsmTst, s11_x) { - BSP_display("s11-EXIT;"); - return qm_exit(&s11_s); -} -//${SMs::QMsmTst::SM::s::s1::s11} -QM_STATE_DEF(QMsmTst, s11) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s1::s11::H} - case H_SIG: { - BSP_display("s11-H;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s11_x, // exit - &s1_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s1::s11::D} - case D_SIG: { - //${SMs::QMsmTst::SM::s::s1::s11::D::[m_foo]} - if (m_foo) { - m_foo = false; - BSP_display("s11-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s11_x, // exit - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s1::s11::G} - case G_SIG: { - BSP_display("s11-G;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[6]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s11_x, // exit - &s1_x, // exit - &s2_e, // entry - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2} ................................................. -QP::QMState const QMsmTst::s2_s = { - &QMsmTst::s_s, // superstate - &QMsmTst::s2, - &QMsmTst::s2_e, - &QMsmTst::s2_x, - &QMsmTst::s2_i -}; -//${SMs::QMsmTst::SM::s::s2} -QM_ACTION_DEF(QMsmTst, s2_e) { - BSP_display("s2-ENTRY;"); - return qm_entry(&s2_s); -} -//${SMs::QMsmTst::SM::s::s2} -QM_ACTION_DEF(QMsmTst, s2_x) { - BSP_display("s2-EXIT;"); - return qm_exit(&s2_s); -} -//${SMs::QMsmTst::SM::s::s2::initial} -QM_ACTION_DEF(QMsmTst, s2_i) { - //${SMs::QMsmTst::SM::s::s2::initial} - BSP_display("s2-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s21_e, // entry - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s2} -QM_STATE_DEF(QMsmTst, s2) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::I} - case I_SIG: { - //${SMs::QMsmTst::SM::s::s2::I::[!m_foo]} - if (!m_foo) { - m_foo = true; - BSP_display("s2-I;"); - status_ = Q_RET_HANDLED; - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${SMs::QMsmTst::SM::s::s2::F} - case F_SIG: { - BSP_display("s2-F;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s11_s, // target state - { - &s2_x, // exit - &s1_e, // entry - &s11_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::C} - case C_SIG: { - BSP_display("s2-C;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s2_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2::s21} ............................................ -QP::QMState const QMsmTst::s21_s = { - &QMsmTst::s2_s, // superstate - &QMsmTst::s21, - &QMsmTst::s21_e, - &QMsmTst::s21_x, - &QMsmTst::s21_i -}; -//${SMs::QMsmTst::SM::s::s2::s21} -QM_ACTION_DEF(QMsmTst, s21_e) { - BSP_display("s21-ENTRY;"); - return qm_entry(&s21_s); -} -//${SMs::QMsmTst::SM::s::s2::s21} -QM_ACTION_DEF(QMsmTst, s21_x) { - BSP_display("s21-EXIT;"); - return qm_exit(&s21_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::initial} -QM_ACTION_DEF(QMsmTst, s21_i) { - //${SMs::QMsmTst::SM::s::s2::s21::initial} - BSP_display("s21-INIT;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - return qm_tran_init(&tatbl_); -} -//${SMs::QMsmTst::SM::s::s2::s21} -QM_STATE_DEF(QMsmTst, s21) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::s21::G} - case G_SIG: { - BSP_display("s21-G;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s1_s, // target state - { - &s21_x, // exit - &s2_x, // exit - &s1_e, // entry - &s1_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::A} - case A_SIG: { - BSP_display("s21-A;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[4]; - } const tatbl_ = { // tran-action table - &s21_s, // target state - { - &s21_x, // exit - &s21_e, // entry - &s21_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::B} - case B_SIG: { - BSP_display("s21-B;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[2]; - } const tatbl_ = { // tran-action table - &s211_s, // target state - { - &s211_e, // entry - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} - -//${SMs::QMsmTst::SM::s::s2::s21::s211} ...................................... -QP::QMState const QMsmTst::s211_s = { - &QMsmTst::s21_s, // superstate - &QMsmTst::s211, - &QMsmTst::s211_e, - &QMsmTst::s211_x, - Q_ACTION_NULL // no initial tran. -}; -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_ACTION_DEF(QMsmTst, s211_e) { - BSP_display("s211-ENTRY;"); - return qm_entry(&s211_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_ACTION_DEF(QMsmTst, s211_x) { - BSP_display("s211-EXIT;"); - return qm_exit(&s211_s); -} -//${SMs::QMsmTst::SM::s::s2::s21::s211} -QM_STATE_DEF(QMsmTst, s211) { - QP::QState status_; - switch (e->sig) { - //${SMs::QMsmTst::SM::s::s2::s21::s211::H} - case H_SIG: { - BSP_display("s211-H;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[5]; - } const tatbl_ = { // tran-action table - &s_s, // target state - { - &s211_x, // exit - &s21_x, // exit - &s2_x, // exit - &s_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - //${SMs::QMsmTst::SM::s::s2::s21::s211::D} - case D_SIG: { - BSP_display("s211-D;"); - - static struct { - QP::QMState const *target; - QP::QActionHandler act[3]; - } const tatbl_ = { // tran-action table - &s21_s, // target state - { - &s211_x, // exit - &s21_i, // initial tran. - Q_ACTION_NULL // zero terminator - } - }; - status_ = qm_tran(&tatbl_); - break; - } - default: { - status_ = Q_RET_SUPER; - break; - } - } - return status_; -} -//$enddef${SMs::QMsmTst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -bool QMsmTst_isIn(std::uint32_t const state_num) { - QP::QMsm * const me = &l_msmtst; - bool stat = false; - switch (state_num) { - case 0: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s)); - break; - case 1: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s1)); - break; - case 11: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s11)); - break; - case 2: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s2)); - break; - case 21: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s21)); - break; - case 211: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s211)); - break; - default: - Q_ERROR(); - } - return stat; -} - -} // namespace APP diff --git a/examples/qutest/qmsmtst/src/qmsmtst.hpp b/examples/qutest/qmsmtst/src/qmsmtst.hpp deleted file mode 100644 index 2dccc6062..000000000 --- a/examples/qutest/qmsmtst/src/qmsmtst.hpp +++ /dev/null @@ -1,61 +0,0 @@ -//$file${.::qmsmtst.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: qmsmtst.qm -// File: ${.::qmsmtst.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::qmsmtst.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef QMSMTST_HPP_ -#define QMSMTST_HPP_ - -namespace APP { - -enum QMsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -extern QP::QAsm * const the_sm; // opaque pointer to the test SM - -bool QMsmTst_isIn(std::uint32_t const state_num); - -// BSP functions to display a message and exit -void BSP_display(char const *msg); -void BSP_terminate(int16_t const result); - -} // namespace APP - -#endif // QMSMTST_HPP_ diff --git a/examples/qutest/qmsmtst/src/qmsmtst.qm b/examples/qutest/qmsmtst/src/qmsmtst.qm deleted file mode 100644 index 33bcebe00..000000000 --- a/examples/qutest/qmsmtst/src/qmsmtst.qm +++ /dev/null @@ -1,388 +0,0 @@ - - - QMsmTst is a contrived state machine from Chapter 2 of the PSiCC2 book for testing all possible transition topologies with up to 4-levels of state nesting. - - - - - - - Test State Machine - - - - - - - : QMsm(&initial) - - - - - - Q_UNUSED_PAR(e); - -m_foo = 0U; -BSP_display("top-INIT;"); - -QS_SIG_DICTIONARY(A_SIG, nullptr); -QS_SIG_DICTIONARY(B_SIG, nullptr); -QS_SIG_DICTIONARY(C_SIG, nullptr); -QS_SIG_DICTIONARY(D_SIG, nullptr); -QS_SIG_DICTIONARY(E_SIG, nullptr); -QS_SIG_DICTIONARY(F_SIG, nullptr); -QS_SIG_DICTIONARY(G_SIG, nullptr); -QS_SIG_DICTIONARY(H_SIG, nullptr); -QS_SIG_DICTIONARY(I_SIG, nullptr); -QS_SIG_DICTIONARY(TERMINATE_SIG, nullptr); -QS_SIG_DICTIONARY(IGNORE_SIG, nullptr); - - - - - - - BSP_display("s-ENTRY;"); - BSP_display("s-EXIT;"); - - - BSP_display("s-INIT;"); - - - - - - - - - m_foo - m_foo = 0U; -BSP_display("s-I;"); - - - - - - - - - - - BSP_display("s-E;"); - - - - - - - BSP_terminate(0); - - - - - - - BSP_display("s1-ENTRY;"); - BSP_display("s1-EXIT;"); - - - BSP_display("s1-INIT;"); - - - - - - - BSP_display("s1-I;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s1-D;"); - - - - - - - - - - - BSP_display("s1-A;"); - - - - - - - BSP_display("s1-B;"); - - - - - - - BSP_display("s1-F;"); - - - - - - - BSP_display("s1-C;"); - - - - - - - BSP_display("s11-ENTRY;"); - BSP_display("s11-EXIT;"); - - - BSP_display("s11-H;"); - - - - - - - - - m_foo - m_foo = false; -BSP_display("s11-D;"); - - - - - - - - - - - BSP_display("s11-G;"); - - - - - - - - - - - - - - - - - BSP_display("s2-ENTRY;"); - BSP_display("s2-EXIT;"); - - - BSP_display("s2-INIT;"); - - - - - - - - - !m_foo - m_foo = true; -BSP_display("s2-I;"); - - - - - - - - - - - BSP_display("s2-F;"); - - - - - - - BSP_display("s2-C;"); - - - - - - - BSP_display("s21-ENTRY;"); - BSP_display("s21-EXIT;"); - - - BSP_display("s21-INIT;"); - - - - - - - BSP_display("s21-G;"); - - - - - - - BSP_display("s21-A;"); - - - - - - - BSP_display("s21-B;"); - - - - - - - BSP_display("s211-ENTRY;"); - BSP_display("s211-EXIT;"); - - - BSP_display("s211-H;"); - - - - - - - BSP_display("s211-D;"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #ifndef QMSMTST_HPP_ -#define QMSMTST_HPP_ - -namespace APP { - -enum QMsmTstSignals { - A_SIG = QP::Q_USER_SIG, - B_SIG, - C_SIG, - D_SIG, - E_SIG, - F_SIG, - G_SIG, - H_SIG, - I_SIG, - TERMINATE_SIG, - IGNORE_SIG, - MAX_SIG -}; - -extern QP::QAsm * const the_sm; // opaque pointer to the test SM - -bool QMsmTst_isIn(std::uint32_t const state_num); - -// BSP functions to display a message and exit -void BSP_display(char const *msg); -void BSP_terminate(int16_t const result); - -} // namespace APP - -#endif // QMSMTST_HPP_ - - - - #include "qpcpp.hpp" -#include "qmsmtst.hpp" - -namespace { -Q_DEFINE_THIS_FILE -} - -namespace APP { - -$declare ${SMs::QMsmTst} - -static QMsmTst l_msmtst; // the only instance of the QMsmTst class - -// global-scope definitions ----------------------------------------- -QP::QAsm * const the_sm = &l_msmtst; // the opaque pointer - -$define ${SMs::QMsmTst} - -bool QMsmTst_isIn(std::uint32_t const state_num) { - QP::QMsm * const me = &l_msmtst; - bool stat = false; - switch (state_num) { - case 0: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s)); - break; - case 1: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s1)); - break; - case 11: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s11)); - break; - case 2: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s2)); - break; - case 21: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s21)); - break; - case 211: - stat = me->isIn(Q_STATE_CAST(&QMsmTst::s211)); - break; - default: - Q_ERROR(); - } - return stat; -} - -} // namespace APP - - - diff --git a/examples/qutest/qmsmtst/test/Makefile b/examples/qutest/qmsmtst/test/Makefile deleted file mode 100644 index 303bbd58f..000000000 --- a/examples/qutest/qmsmtst/test/Makefile +++ /dev/null @@ -1,272 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_qmsm - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - qmsmtst.cpp \ - test_qmsm.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qmsmtst/test/make_nucleo-l053r8 b/examples/qutest/qmsmtst/test/make_nucleo-l053r8 deleted file mode 100644 index 707acd77a..000000000 --- a/examples/qutest/qmsmtst/test/make_nucleo-l053r8 +++ /dev/null @@ -1,318 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qmsm -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - qmsmtst.cpp \ - test_qmsm.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qmsmtst/test/make_tm4c123 b/examples/qutest/qmsmtst/test/make_tm4c123 deleted file mode 100644 index 86f97935a..000000000 --- a/examples/qutest/qmsmtst/test/make_tm4c123 +++ /dev/null @@ -1,321 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qmsm -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - qmsmtst.cpp \ - test_qmsm.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/qmsmtst/test/test_qmsm-funct.py b/examples/qutest/qmsmtst/test/test_qmsm-funct.py deleted file mode 100644 index f755c02fe..000000000 --- a/examples/qutest/qmsmtst/test/test_qmsm-funct.py +++ /dev/null @@ -1,200 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_run() - glb_filter(GRP_UA) - current_obj(OBJ_SM, "the_sm") - -# tests... -test("QMsmTst_init") -init() -expect("@timestamp BSP_DISPLAY top-INIT;") -expect("@timestamp BSP_DISPLAY s-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -test("QMsmTst isIn", NORESET) -command(1, 1) # is in state s1 -expect("@timestamp CMD 0 1"); # NOT in s1 -expect("@timestamp Trg-Done QS_RX_COMMAND") -command(1, 21) # is in state s21 -expect("@timestamp CMD 1 21"); # YES, in s21 -expect("@timestamp Trg-Done QS_RX_COMMAND") -command(1, 211) # is in state s211 -expect("@timestamp CMD 1 211"); # YES, in s211 -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("QMsmTst dispatch", NORESET) -dispatch("A_SIG") -expect("@timestamp BSP_DISPLAY s21-A;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-INIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp BSP_DISPLAY s21-B;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s211-D;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-INIT;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp BSP_DISPLAY s-E;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s1-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp BSP_DISPLAY s1-F;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s2-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp BSP_DISPLAY s-I;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp BSP_DISPLAY s2-F;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("A_SIG") -expect("@timestamp BSP_DISPLAY s1-A;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp BSP_DISPLAY s1-B;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s1-D;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp BSP_DISPLAY s11-D;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp BSP_DISPLAY s-E;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp BSP_DISPLAY s11-G;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp BSP_DISPLAY s211-H;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp BSP_DISPLAY s11-H;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s-INIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s1-C;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp BSP_DISPLAY s21-G;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s1-C;") -expect("@timestamp BSP_DISPLAY s11-EXIT;") -expect("@timestamp BSP_DISPLAY s1-EXIT;") -expect("@timestamp BSP_DISPLAY s2-ENTRY;") -expect("@timestamp BSP_DISPLAY s2-INIT;") -expect("@timestamp BSP_DISPLAY s21-ENTRY;") -expect("@timestamp BSP_DISPLAY s211-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp BSP_DISPLAY s2-C;") -expect("@timestamp BSP_DISPLAY s211-EXIT;") -expect("@timestamp BSP_DISPLAY s21-EXIT;") -expect("@timestamp BSP_DISPLAY s2-EXIT;") -expect("@timestamp BSP_DISPLAY s1-ENTRY;") -expect("@timestamp BSP_DISPLAY s1-INIT;") -expect("@timestamp BSP_DISPLAY s11-ENTRY;") -expect("@timestamp Trg-Done QS_RX_EVENT") - diff --git a/examples/qutest/qmsmtst/test/test_qmsm-struct.py b/examples/qutest/qmsmtst/test/test_qmsm-struct.py deleted file mode 100644 index fc89a318c..000000000 --- a/examples/qutest/qmsmtst/test/test_qmsm-struct.py +++ /dev/null @@ -1,213 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_reset(): - expect_run() - glb_filter(GRP_SM) - current_obj(OBJ_SM, "the_sm") - -# tests... -test("QMsmTst init") -init() -expect("===RTC===> St-Init Obj=the_sm,State=NULL->QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s2->QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp Init===> Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -test("QMsmTst dispatch", NORESET) -dispatch("A_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=A_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s21->QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=A_SIG,State=QMsmTst::s21->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=B_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=B_SIG,State=QMsmTst::s21->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s21->QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QMsmTst::s211->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=E_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=E_SIG,State=QMsmTst::s->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QMsmTst::s11") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QMsmTst::s1") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=F_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=F_SIG,State=QMsmTst::s1->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QMsmTst::s211") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QMsmTst::s2") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("I_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=I_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Unhnd Obj=the_sm,Sig=I_SIG,State=QMsmTst::s2") -expect("@timestamp =>Intern Obj=the_sm,Sig=I_SIG,State=QMsmTst::s") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("F_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=F_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=F_SIG,State=QMsmTst::s2->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("A_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=A_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s1->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=A_SIG,State=QMsmTst::s1->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("B_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=B_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=B_SIG,State=QMsmTst::s1->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Unhnd Obj=the_sm,Sig=D_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QMsmTst::s1->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("D_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=D_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s1->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=D_SIG,State=QMsmTst::s11->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("E_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=E_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=E_SIG,State=QMsmTst::s->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=G_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=G_SIG,State=QMsmTst::s11->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=H_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=H_SIG,State=QMsmTst::s211->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("H_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=H_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=H_SIG,State=QMsmTst::s11->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s2->QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QMsmTst::s1->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("G_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=G_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s1->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=G_SIG,State=QMsmTst::s21->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s11") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s2->QMsmTst::s211") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s211") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QMsmTst::s1->QMsmTst::s211") -expect("@timestamp Trg-Done QS_RX_EVENT") - -dispatch("C_SIG") -expect("@timestamp Disp===> Obj=the_sm,Sig=C_SIG,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s211") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s21") -expect("===RTC===> St-Exit Obj=the_sm,State=QMsmTst::s2") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s1") -expect("===RTC===> St-Init Obj=the_sm,State=QMsmTst::s1->QMsmTst::s11") -expect("===RTC===> St-Entry Obj=the_sm,State=QMsmTst::s11") -expect("@timestamp ===>Tran Obj=the_sm,Sig=C_SIG,State=QMsmTst::s2->QMsmTst::s11") -expect("@timestamp Trg-Done QS_RX_EVENT") - diff --git a/examples/qutest/qmsmtst/test/test_qmsm.cpp b/examples/qutest/qmsmtst/test/test_qmsm.cpp deleted file mode 100644 index ac34e69d6..000000000 --- a/examples/qutest/qmsmtst/test/test_qmsm.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//============================================================================ -// Purpose: Fixture for QUTEST -// Last Updated for Version: 7.3.1 -// Date of the Last Update: 2023-12-11 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "qmsmtst.hpp" - -Q_DEFINE_THIS_FILE - -//============================================================================ -namespace APP { - -enum { - BSP_DISPLAY = QP::QS_USER, - CMD, -}; - -void BSP_display(char const *msg) { - QS_BEGIN_ID(BSP_DISPLAY, 0U) // app-specific record - QS_STR(msg); - QS_END() -} -//............................................................................ -void BSP_terminate(int16_t const result) { - Q_UNUSED_PAR(result); -} - -} // namespace APP - -//============================================================================ -namespace QP { - -//............................................................................ -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); - - //PRINTF_S(" Command id=%d param=%d\n", (int)cmdId, (int)param); - switch (cmdId) { - case 0U: { - QS_BEGIN_ID(APP::CMD, 0U) // app-specific record - QS_END() - break; - } - case 1U: { - bool ret = APP::QMsmTst_isIn(param1); - QS_BEGIN_ID(APP::CMD, 0U) // app-specific record - QS_U8(0U, ret ? 1 : 0); - QS_U8(0U, (uint8_t)param1); - QS_END() - break; - } - default: - break; - } -} - -//............................................................................ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(recipient); - Q_UNUSED_PAR(e); - Q_UNUSED_PAR(status); -} - -} // namespace QP - -//============================================================================ -using namespace APP; - -int main(int argc, char *argv[]) { - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10]; // small pool - - QP::QF::init(); // initialize the framework and the underlying RT kernel - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - // initialize event pools... - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // dictionaries... - QS_OBJ_DICTIONARY(the_sm); - QS_USR_DICTIONARY(BSP_DISPLAY); - QS_USR_DICTIONARY(CMD); - - return QP::QF::run(); -} - diff --git a/examples/qutest/self_test/src/README.txt b/examples/qutest/self_test/src/README.txt deleted file mode 100644 index 8c2bba71a..000000000 --- a/examples/qutest/self_test/src/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -The 'self-test' does not need any source files. -All tests are performed on internal QP implementation. \ No newline at end of file diff --git a/examples/qutest/self_test/test/Makefile b/examples/qutest/self_test/test/Makefile deleted file mode 100644 index ac9c91233..000000000 --- a/examples/qutest/self_test/test/Makefile +++ /dev/null @@ -1,271 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - test_qutest.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/self_test/test/make_efm32 b/examples/qutest/self_test/test/make_efm32 deleted file mode 100644 index 14fcab240..000000000 --- a/examples/qutest/self_test/test/make_efm32 +++ /dev/null @@ -1,318 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EMF32, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_efm32 # make and run the tests in the current directory -# make -f make_efm32 TESTS=philo*.py # make and run the selected tests -# make -f make_efm32 HOST=localhost:7705 # connect to host:port -# make -f make_efm32 norun # only make but not run the tests -# make -f make_efm32 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qutest -TARGET := efm32 -TARGET_DIR := ..\..\..\..\3rd_party\efm32pg1b\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/efm32pg1b \ - $(QPCPP)/3rd_party/efm32pg1b/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/efm32pg1b - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - startup_efm32pg1b.c \ - system_efm32pg1b.c \ - em_cmu.c \ - em_emu.c \ - em_gpio.c \ - em_usart.c - -# C++ source files -CPP_SRCS := \ - test_qutest.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DEFM32PG1B200F256GM48=1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# FLASH tool (NOTE: Requires the JLINK utility) -# see $(TARGET_DIR)\flash.bat -# - -FLASH := $(TARGET_DIR)\flash.bat - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo MAKECMDGOALS = $(MAKECMDGOALS) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/self_test/test/make_nucleo-l053r8 b/examples/qutest/self_test/test/make_nucleo-l053r8 deleted file mode 100644 index 5c1f64c2d..000000000 --- a/examples/qutest/self_test/test/make_nucleo-l053r8 +++ /dev/null @@ -1,317 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on NUCLEO-L053R8 board, QUTEST, GNU-ARM -# Last Updated for Version: 7.3.1 -# Date of the Last Update: 2023-11-13 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_nucleo-l053r8 USB=e: # make, upload to USB drive, run the tests -# make -f make_nucleo-l053r8 USB=f: TESTS=philo*.py # make and run the selected tests -# make -f make_nucleo-l053r8 HOST=localhost:7705 # connect to host:port -# make -f make_nucleo-l053r8 norun # only make but not run the tests -# make -f make_nucleo-l053r8 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qutest -TARGET := nucleo-l053r8 -TARGET_DIR := ..\..\..\..\3rd_party\nucleo-l053r8\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/nucleo-l053r8 \ - $(QPCPP)/3rd_party/nucleo-l053r8/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/nucleo-l053r8 - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_stm32l0xx.c \ - startup_stm32l053xx.c - -# C++ source files -CPP_SRCS := \ - test_qutest.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DSTM32L053xx - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m0plus -ARM_FPU := -FLOAT_ABI := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The symbol USB must be provided for the NUCLEO board -# has enumerated as USB drive f: -# -ifeq ($(USB),) -$(error USB drive not provided for the NUCLEO board.) -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm -CP := cp -SLEEP := sleep - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(CP) $@ $(USB) - $(SLEEP) 2 - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(CP) $(TARGET_BIN) $(USB) - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/self_test/test/make_posix b/examples/qutest/self_test/test/make_posix deleted file mode 100644 index 31b9f8f58..000000000 --- a/examples/qutest/self_test/test/make_posix +++ /dev/null @@ -1,237 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST; QP/C++ on POSIX *Target* -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_posix # make and run the tests in the current directory -# make -f make_posix HOST=192.168.1.65:6601 # make and run the executable -# make -f make_posix norun # only make but not run the tests -# make -f make_posix clean # cleanup the build -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH = . \ - ../src - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - - -ifeq ($(MAKECMDGOALS),test) - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - test_qutest.cpp - -LIB_DIRS := -LIBS := - -# defines... -# QP_API_VERSION controls the QP API compatibility; 9999 means the latest API -DEFINES := -DQP_API_VERSION=9999 - -#----------------------------------------------------------------------------- -# add QP/C++ framework: -# -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest - -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -LIBS += -lpthread - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# basic utilities: - -MKDIR := mkdir -p -RM := rm -f - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build_posix - -CFLAGS = -c -g -O -Wall -Wstrict-prototypes -W $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS = -c -g -O -Wall -W -fno-rtti -fno-exceptions $(INCLUDES) $(DEFINES) \ - -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun test clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -# run the test fixture on a POSIX target in a loop, so that it is re-started -# after every test. The loop is terminated by pressing Ctrl-C on the keyboard. -# -run : $(TARGET_EXE) - set -e; while true; do \ - echo "restarting $(TARGET_EXE)"; \ - $(TARGET_EXE) "" $(HOST); \ - done - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),test) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(TARGET_EXE) - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo HOST = $(HOST) - diff --git a/examples/qutest/self_test/test/make_tm4c123 b/examples/qutest/self_test/test/make_tm4c123 deleted file mode 100644 index 182a21a4b..000000000 --- a/examples/qutest/self_test/test/make_tm4c123 +++ /dev/null @@ -1,320 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on TM4C123, QUTEST, GNU-ARM -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-21 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make -f make_tm4c123 # make and run the tests in the current directory -# make -f make_tm4c123 TESTS=philo*.py # make and run the selected tests -# make -f make_tm4c123 HOST=localhost:7705 # connect to host:port -# make -f make_tm4c123 norun # only make but not run the tests -# make -f make_tm4c123 clean # cleanup the build -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name, target name, target directory: -# -PROJECT := test_qutest -TARGET := tm4c123 -TARGET_DIR := ..\..\..\..\3rd_party\ek-tm4c123gxl\qutest - -#----------------------------------------------------------------------------- -# project directories: -# - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/arm-cm/qutest - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - - -# list of all source directories used by this project -VPATH := . \ - ../src \ - $(TARGET_DIR) \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = -I. \ - -I../src \ - -I$(TARGET_DIR) \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# project files: -# - -# assembler source files -ASM_SRCS := - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - test_qutest.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(TARGET_DIR)\qutest.ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_cpp.cpp - -QP_ASMS := - -LIB_DIRS := -LIBS := - -# defines -DEFINES := -DTARGET_IS_TM4C123_RB1 - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - -#----------------------------------------------------------------------------- -# NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -# be found on the PATH. You might need to adjust this symbol to the -# location of the LMFlash utility on your machine -# -ifeq ($(LMFLASH),) -FLASH := LMFlash.exe -q ek-tm4c123gxl -endif - -############################################################################## -# Typically you should not need to change anything below this line - -# basic utilities (included in QTools for Windows), see: -# https://www.state-machine.com/qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# build options -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) - -BIN_DIR := build_$(TARGET) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -std=c++11 -pedantic -Wall -Wextra \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : run norun flash - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_BIN) -norun : all -else -all : $(TARGET_BIN) run -endif - -$(TARGET_BIN) : $(TARGET_ELF) - $(BIN) -O binary $< $@ - $(FLASH) $@ - @echo - @echo Reset the board MANUALLY! - @pause - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -flash : - $(FLASH) $(TARGET_BIN) - @echo - @echo Reset the board MANUALLY! - -run : $(TARGET_BIN) - $(QUTEST) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -.PHONY : clean show - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - -clean : - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show : - @echo PROJECT = $(PROJECT) - @echo TESTS = $(TESTS) - @echo TARGET_ELF = $(TARGET_ELF) - @echo CONF = $(CONF) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/self_test/test/test_assert.py b/examples/qutest/self_test/test/test_assert.py deleted file mode 100644 index e5ee59a9e..000000000 --- a/examples/qutest/self_test/test/test_assert.py +++ /dev/null @@ -1,37 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -include("test_include.pyi") - -note(''' -This test group contains tests that intenionally FAIL, -to exercise failure modes of the QUTest system. -''') - -def on_reset(): - #print("on_reset()") - expect(" QF_RUN") - -# tests... -test("Expected assertion") -command("CMD_A", 0) -expect("@timestamp =ASSERT= Mod=test_qutest,Loc=100") - -test("Unexpected assertion (should FAIL!)") -command("CMD_A", 0) -expect("@timestamp COMMAND CMD_A 0") -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("Simple passing test") -command("CMD_A", 1) -expect("@timestamp COMMAND CMD_A 1") -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("Wrong assertion expectation (should FAIL!)") -command("CMD_A", 0) -expect("@timestamp =ASSERT= Mod=test_qutest,Loc=200") - -test("Simple passing test") -command("CMD_A", 1) -expect("@timestamp COMMAND CMD_A 1") -expect("@timestamp Trg-Done QS_RX_COMMAND") diff --git a/examples/qutest/self_test/test/test_command.py b/examples/qutest/self_test/test/test_command.py deleted file mode 100644 index cc5ad89be..000000000 --- a/examples/qutest/self_test/test/test_command.py +++ /dev/null @@ -1,23 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -note(''' -This test group tests the command() command, which -invokes the QS_onCommand() callback inside the target. -''') - -def on_setup(): - expect("@timestamp FIXTURE_SETUP") - -def on_teardown(): - expect("@timestamp FIXTURE_TEARDOWN") - -# tests... -test("Command") -note(''' -this test invokes command(1,1,1) -''') -command("CMD_X", 1, 2, 3) -expect("@timestamp COMMAND CMD_X 0") -expect("@timestamp Trg-Done QS_RX_COMMAND") - diff --git a/examples/qutest/self_test/test/test_fp.py b/examples/qutest/self_test/test/test_fp.py deleted file mode 100644 index a785fb8ed..000000000 --- a/examples/qutest/self_test/test/test_fp.py +++ /dev/null @@ -1,13 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -include("test_include.pyi") - -# tests... -test("FP output") -command("CMD_Z", 0, 3, 7) -expect("@timestamp COMMAND CMD_Z 4e-01 -6e+23") -expect("@timestamp Trg-Done QS_RX_COMMAND") -command("CMD_Z", 4, (-3 & 0xFFFFFFFF), 7) -expect("@timestamp COMMAND CMD_Z -4.2857e-01 -6.0221e+23") -expect("@timestamp Trg-Done QS_RX_COMMAND") diff --git a/examples/qutest/self_test/test/test_include.pyi b/examples/qutest/self_test/test/test_include.pyi deleted file mode 100644 index b075bb6ad..000000000 --- a/examples/qutest/self_test/test/test_include.pyi +++ /dev/null @@ -1,16 +0,0 @@ -# include script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -# preamble... -def on_setup(): - expect("@timestamp FIXTURE_SETUP") - -def on_teardown(): - expect("@timestamp FIXTURE_TEARDOWN") - -def command_x(par1=0, par2=0, par3=0): - command("CMD_X", par1, par2, par3) - -def curr_ap_obj(obj_name): - current_obj(OBJ_AP, obj_name) - diff --git a/examples/qutest/self_test/test/test_last-rec.py b/examples/qutest/self_test/test/test_last-rec.py deleted file mode 100644 index 5099ae0ab..000000000 --- a/examples/qutest/self_test/test/test_last-rec.py +++ /dev/null @@ -1,26 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -note(''' -This test group exercises the las_rec() command -''') - -include("test_include.pyi") - -def display_params(): - global p1, p2, p3, p4 - note("params: %d %d %d %e"%(p1, p2, p3, p4)) - -# tests... -test("Last-record") -command("CMD_B", 123, 23456, 3456789) -expect("@timestamp COMMAND CMD_B *") -last = last_rec().split() -p1 = int(last[3]) -s1 = last[3] -p2 = int(last[5]) -s2 = last[5] -p3 = int(last[7]) -p4 = float(last[8]) -display_params() # locally defined function -expect("@timestamp Trg-Done QS_RX_COMMAND") diff --git a/examples/qutest/self_test/test/test_mem-str.py b/examples/qutest/self_test/test/test_mem-str.py deleted file mode 100644 index 72c80e46d..000000000 --- a/examples/qutest/self_test/test/test_mem-str.py +++ /dev/null @@ -1,21 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -include("test_include.pyi") - -# tests... -test("MEM/STR") -curr_ap_obj("buffer") -fill(0,1,16,0x1A) -poke(33,1,b"Hello World!\0") -command("CMD_Y", 16) -expect("@timestamp COMMAND CMD_Y myFun 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A Hello World!") -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("MEM/STR empty string") -curr_ap_obj("buffer") -fill(0,1,16,0x1A) -poke(33,1,b"\0") -command("CMD_Y", 16) -expect("@timestamp COMMAND CMD_Y myFun 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A ''") -expect("@timestamp Trg-Done QS_RX_COMMAND") diff --git a/examples/qutest/self_test/test/test_peek-poke.py b/examples/qutest/self_test/test/test_peek-poke.py deleted file mode 100644 index 2897b05c0..000000000 --- a/examples/qutest/self_test/test/test_peek-poke.py +++ /dev/null @@ -1,54 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -include("test_include.pyi") - -# tests... -test("Peek/Poke/Fill uint8_t") -curr_ap_obj("buffer") -fill(0,1,100,0x1A) -peek(0,1,5) -expect("@timestamp Trg-Peek Offs=0,Size=1,Num=5,Data=<1A,1A,1A,1A,1A>") -peek(95,1,5) -expect("@timestamp Trg-Peek Offs=95,Size=1,Num=5,Data=<1A,1A,1A,1A,1A>") -fill(2,1,95,0x1B) -peek(0,1,5) -expect("@timestamp Trg-Peek Offs=0,Size=1,Num=5,Data=<1A,1A,1B,1B,1B>") -peek(95,1,5) -expect("@timestamp Trg-Peek Offs=95,Size=1,Num=5,Data=<1B,1B,1A,1A,1A>") -fill(0,1,100,0xA1) -poke(2,1,pack('") - -test("Peek/Poke/Fill uint16_t", NORESET) -fill(0,2,50,0x2A2B) -peek(0,2,3) -expect("@timestamp Trg-Peek Offs=0,Size=2,Num=3,Data=<2A2B,2A2B,2A2B>") -peek(94,2,3) -expect("@timestamp Trg-Peek Offs=94,Size=2,Num=3,Data=<2A2B,2A2B,2A2B>") -fill(2,2,48,0x2C2D) -peek(0,2,3) -expect("@timestamp Trg-Peek Offs=0,Size=2,Num=3,Data=<2A2B,2C2D,2C2D>") -peek(94,2,3) -expect("@timestamp Trg-Peek Offs=94,Size=2,Num=3,Data=<2C2D,2C2D,2A2B>") -fill(0,2,50,0xA2B2) -poke(2,2,pack('") - -test("Peek/Poke/Fill uint32_t", NORESET) -fill(0,4,25,0x4A4B4C4D) -peek(0,4,3) -expect("@timestamp Trg-Peek Offs=0,Size=4,Num=3,Data=<4A4B4C4D,4A4B4C4D,4A4B4C4D>") -peek(88,4,3) -expect("@timestamp Trg-Peek Offs=88,Size=4,Num=3,Data=<4A4B4C4D,4A4B4C4D,4A4B4C4D>") -fill(4,4,23,0x4C4D4E4F) -peek(0,4,3) -expect("@timestamp Trg-Peek Offs=0,Size=4,Num=3,Data=<4A4B4C4D,4C4D4E4F,4C4D4E4F>") -peek(88,4,3) -expect("@timestamp Trg-Peek Offs=88,Size=4,Num=3,Data=<4C4D4E4F,4C4D4E4F,4A4B4C4D>") -fill(0,4,25,0xA4B4C4D4) -poke(4,4,pack('") diff --git a/examples/qutest/self_test/test/test_probe.py b/examples/qutest/self_test/test/test_probe.py deleted file mode 100644 index a9cb918ba..000000000 --- a/examples/qutest/self_test/test/test_probe.py +++ /dev/null @@ -1,33 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -include("test_include.pyi") - -# tests... -test("Single Test Probe") -command_x() -expect("@timestamp COMMAND CMD_X 0") -expect("@timestamp Trg-Done QS_RX_COMMAND") -probe("myFun", 1) -command_x() -expect("@timestamp TstProbe Fun=myFun,Data=1") -expect("@timestamp COMMAND CMD_X 1") -expect("@timestamp Trg-Done QS_RX_COMMAND") -command("CMD_X") -expect("@timestamp COMMAND CMD_X 0") -expect("@timestamp Trg-Done QS_RX_COMMAND") - -test("Multiple Test Probes", NORESET) -probe("myFun", 100022) -probe("myFun", 200033) -command("CMD_X") -expect("@timestamp TstProbe Fun=myFun,Data=100022") -expect("@timestamp COMMAND CMD_X 100022") -expect("@timestamp Trg-Done QS_RX_COMMAND") -command("CMD_X") -expect("@timestamp TstProbe Fun=myFun,Data=200033") -expect("@timestamp COMMAND CMD_X 200033") -expect("@timestamp Trg-Done QS_RX_COMMAND") -command("CMD_X") -expect("@timestamp COMMAND CMD_X 0") -expect("@timestamp Trg-Done QS_RX_COMMAND") diff --git a/examples/qutest/self_test/test/test_qutest.cpp b/examples/qutest/self_test/test/test_qutest.cpp deleted file mode 100644 index d12033d89..000000000 --- a/examples/qutest/self_test/test/test_qutest.cpp +++ /dev/null @@ -1,219 +0,0 @@ -//============================================================================ -//! Last updated for version 7.3.0 -//! Last updated on 2023-07-19 -//! -//! Q u a n t u m L e a P s -//! ------------------------ -//! Modern Embedded Software -//! -//! Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -//! -//! This program is open source software: you can redistribute it and/or -//! modify it under the terms of the GNU General Public License as published -//! by the Free Software Foundation, either version 3 of the License, or -//! (at your option) any later version. -//! -//! Alternatively, this program may be distributed and modified under the -//! terms of Quantum Leaps commercial licenses, which expressly supersede -//! the GNU General Public License and are specifically designed for -//! licensees interested in retaining the proprietary status of their code. -//! -//! This program is distributed in the hope that it will be useful, -//! but WITHOUT ANY WARRANTY; without even the implied warranty of -//! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//! GNU General Public License for more details. -//! -//! You should have received a copy of the GNU General Public License -//! along with this program. If not, see . -//! -//! Contact information: -//! -//! -//============================================================================ -//! @file -//! @brief Fixture for QUTEST self-test -//! @cond - -#include "qpcpp.hpp" // for QUTEST - -using namespace QP; - -Q_DEFINE_THIS_MODULE("test_qutest") - -//---------------------------------------------------------------------------- -static uint8_t buffer[100]; -static uint32_t myFun(void); - -enum UsrEnum { - FIXTURE_SETUP = QS_USER, - FIXTURE_TEARDOWN, - COMMAND, -}; - -enum CmdEnum { - CMD_A, - CMD_B, - CMD_C, - CMD_X, - CMD_Y, - CMD_Z -}; - -enum UsrSig { - MYSIG_SIG = Q_USER_SIG, -}; - -//---------------------------------------------------------------------------- -int main(int argc, char *argv[]) { - - QF::init(); // initialize the framework - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - // global filter - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // enable all QS records - - // dictionaries... - QS_OBJ_DICTIONARY(buffer); - QS_FUN_DICTIONARY(&myFun); - QS_SIG_DICTIONARY(MYSIG_SIG, nullptr); - - QS_USR_DICTIONARY(FIXTURE_SETUP); - QS_USR_DICTIONARY(FIXTURE_TEARDOWN); - QS_USR_DICTIONARY(COMMAND); - QS_ENUM_DICTIONARY(CMD_A, QS_CMD); - QS_ENUM_DICTIONARY(CMD_B, QS_CMD); - QS_ENUM_DICTIONARY(CMD_C, QS_CMD); - QS_ENUM_DICTIONARY(CMD_X, QS_CMD); - QS_ENUM_DICTIONARY(CMD_Y, QS_CMD); - QS_ENUM_DICTIONARY(CMD_Z, QS_CMD); - - return QF::run(); // run the tests -} - -//............................................................................ -void QS::onTestSetup(void) { - QS_BEGIN_ID(FIXTURE_SETUP, 0U) - QS_END() -} -//............................................................................ -void QS::onTestTeardown(void) { - QS_BEGIN_ID(FIXTURE_TEARDOWN, 0U) - QS_END() -} - -//............................................................................ -//! callback function to execute user commands -void QS::onCommand(std::uint8_t cmdId, - std::uint32_t param1, std::uint32_t param2, std::uint32_t param3) -{ - switch (cmdId) { - case CMD_A: { - Q_ASSERT_ID(100, param1 != 0U); - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_ENUM(QS_CMD, cmdId); - QS_U32(0, param1); - QS_END() - break; - } - case CMD_B: { - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_ENUM(QS_CMD, cmdId); - QS_U8(0, param1); - QS_STR("BAR"); - QS_U16(0, param2); - QS_STR("FOO"); - QS_U32(0, param3); - QS_F64(param1, -6.02214076E23); - QS_END() - break; - } - case CMD_C: { - // all supported data elements - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_ENUM(QS_CMD, cmdId); - QS_I8(10, param1); - QS_U8(10, param1); - QS_I16(10, param2); - QS_U16(10, param2); - QS_I32(10, param3); - QS_U32(10, param3); - QS_END() - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_I64(10, param3); - QS_U64(10, param3); - QS_F32(param1, -6.02214076E23); - QS_F64(param1, -6.02214076E23); - QS_END() - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_OBJ(buffer); - QS_FUN(&myFun); - QS_SIG(MYSIG_SIG, (void *)0); - QS_MEM(&buffer[6], 16); - QS_END() - break; - } - case CMD_X: { - uint32_t x = myFun(); - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_ENUM(QS_CMD, cmdId); - QS_U32(0, x); - // ... - QS_END() - break; - } - case CMD_Y: { - QS_BEGIN_ID(COMMAND, 0U) // application-specific record - QS_ENUM(QS_CMD, cmdId); - QS_FUN(&myFun); - QS_MEM(buffer, param1); - QS_STR((char const *)&buffer[33]); - QS_END() - break; - } - case CMD_Z: { - float32_t f32 = (float32_t)((int32_t)param2/(float32_t)param3); - float64_t f64 = -6.02214076E23; - QS_BEGIN_ID(COMMAND, 0U) // app-specific record - QS_ENUM(QS_CMD, cmdId); - QS_F32(param1, f32); - QS_F64(param1, f64); - QS_END() - break; - } - default: - break; - } -} - -//............................................................................ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -#ifdef Q_HOST // is this test compiled for a desktop Host computer? -#else // this test is compiled for an embedded Target system -#endif -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(recipient); - Q_UNUSED_PAR(e); - Q_UNUSED_PAR(status); -} - -//---------------------------------------------------------------------------- -static uint32_t myFun(void) { - QS_TEST_PROBE_DEF(&myFun) - QS_TEST_PROBE( - return qs_tp_; - ) - return 0; -} - diff --git a/examples/qutest/start_seq/gizmo.qm b/examples/qutest/start_seq/gizmo.qm deleted file mode 100644 index 7f3a495a1..000000000 --- a/examples/qutest/start_seq/gizmo.qm +++ /dev/null @@ -1,112 +0,0 @@ - - - Start sequence example - - - - - - - - - the single instance of Gizmo (Singleton) - - - - Gizmo constructor - : QActive(&initial) - - - - - - Q_UNUSED_PAR(e); - - - - - - - static QP::QEvt const startEvt(START_SIG); -POST(&startEvt, this); // self-post - - - QS_BEGIN_ID(QP::QS_USER1, m_prio) - QS_STR("START"); -QS_END() - - - BSP::getStatus() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // global "opaque" pointer to the Gizmo AO - = &Gizmo::inst; - - - - - - - #ifndef GIZMO_HPP_ -#define GIZMO_HPP_ - -enum GizmoSignals { - DUMMY_SIG = QP::Q_USER_SIG, - // ... - MAX_PUB_SIG, // the last published signal - - START_SIG, - // ... - MAX_SIG // the last signal -}; - -$declare ${AOs::AO_Gizmo} - -#endif // GIZMO_HPP_ - - - - - #include "qpcpp.hpp" // QP/C++ framework API -#include "bsp.hpp" // Board Support Package interface -#include "gizmo.hpp" // Gizmo AO - -//using namespace QP; - -$declare ${AOs::Gizmo} - -$define ${AOs::AO_Gizmo} -$define ${AOs::Gizmo} - - - diff --git a/examples/qutest/start_seq/src/bsp.cpp b/examples/qutest/start_seq/src/bsp.cpp deleted file mode 100644 index 666f3bbfe..000000000 --- a/examples/qutest/start_seq/src/bsp.cpp +++ /dev/null @@ -1,61 +0,0 @@ -//*************************************************************************** -// Product: Start sequence example -// Last updated for version 7.2.0 -// Last updated on 2022-12-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ framework API -#include "bsp.hpp" // Board Support Package interface -#include "gizmo.hpp" // Gizmo AO - -using namespace QP; - -//Q_DEFINE_THIS_FILE - -static std::uint8_t status; - -//............................................................................ -void BSP::init() { - QS_SIG_DICTIONARY(START_SIG, nullptr); - - QS_OBJ_DICTIONARY(AO_Gizmo); - QS_OBJ_DICTIONARY(&status); -} -//............................................................................ -void BSP::msg(char const *msg) { - QS_BEGIN_ID(QP::QS_USER1, 0U) - QS_STR(msg); - QS_END() -} -//............................................................................ -std::uint8_t BSP::getStatus(void) { - return status; -} - diff --git a/examples/qutest/start_seq/src/bsp.hpp b/examples/qutest/start_seq/src/bsp.hpp deleted file mode 100644 index c2fa1b62d..000000000 --- a/examples/qutest/start_seq/src/bsp.hpp +++ /dev/null @@ -1,46 +0,0 @@ -//*************************************************************************** -// Product: Start sequence example -// Last updated for version 7.2.0 -// Last updated on 2022-12-22 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP -#define BSP_HPP - -// a very simple Board Support Package (BSP) -----========-------------------- -class BSP { -public: - enum { TICKS_PER_SEC = 100 }; // number of clock ticks in a second - static void init(void); - static void msg(char const *msg); - static std::uint8_t getStatus(void); -}; - -#endif // BSP_HPP diff --git a/examples/qutest/start_seq/src/gizmo.cpp b/examples/qutest/start_seq/src/gizmo.cpp deleted file mode 100644 index 5c5162a36..000000000 --- a/examples/qutest/start_seq/src/gizmo.cpp +++ /dev/null @@ -1,146 +0,0 @@ -//$file${src::gizmo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: gizmo.qm -// File: ${src::gizmo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${src::gizmo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ framework API -#include "bsp.hpp" // Board Support Package interface -#include "gizmo.hpp" // Gizmo AO - -//using namespace QP; - -//$declare${AOs::Gizmo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Gizmo} .............................................................. -class Gizmo : public QP::QActive { -public: - static Gizmo inst; - -public: - Gizmo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(init); - Q_STATE_DECL(on_battery); - Q_STATE_DECL(on_mains); -}; // class Gizmo -//$enddecl${AOs::Gizmo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${AOs::AO_Gizmo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Gizmo} ........................................................... -QP::QActive * const AO_Gizmo = &Gizmo::inst; -//$enddef${AOs::AO_Gizmo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Gizmo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::Gizmo} .............................................................. -Gizmo Gizmo::inst; - -//${AOs::Gizmo::Gizmo} ....................................................... -Gizmo::Gizmo() - : QActive(&initial) -{} - -//${AOs::Gizmo::SM} .......................................................... -Q_STATE_DEF(Gizmo, initial) { - //${AOs::Gizmo::SM::initial} - Q_UNUSED_PAR(e); - - QS_FUN_DICTIONARY(&Gizmo::init); - QS_FUN_DICTIONARY(&Gizmo::on_battery); - QS_FUN_DICTIONARY(&Gizmo::on_mains); - - return tran(&init); -} - -//${AOs::Gizmo::SM::init} .................................................... -Q_STATE_DEF(Gizmo, init) { - QP::QState status_; - switch (e->sig) { - //${AOs::Gizmo::SM::init} - case Q_ENTRY_SIG: { - static QP::QEvt const startEvt(START_SIG); - POST(&startEvt, this); // self-post - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Gizmo::SM::init::START} - case START_SIG: { - QS_BEGIN_ID(QP::QS_USER1, m_prio) - QS_STR("START"); - QS_END() - //${AOs::Gizmo::SM::init::START::[BSP:getStatus()]} - if (BSP::getStatus()) { - status_ = tran(&on_mains); - } - //${AOs::Gizmo::SM::init::START::[else]} - else { - status_ = tran(&on_battery); - } - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Gizmo::SM::on_battery} .............................................. -Q_STATE_DEF(Gizmo, on_battery) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Gizmo::SM::on_mains} ................................................ -Q_STATE_DEF(Gizmo, on_mains) { - QP::QState status_; - switch (e->sig) { - default: { - status_ = super(&top); - break; - } - } - return status_; -} -//$enddef${AOs::Gizmo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qutest/start_seq/src/gizmo.hpp b/examples/qutest/start_seq/src/gizmo.hpp deleted file mode 100644 index 063e032ed..000000000 --- a/examples/qutest/start_seq/src/gizmo.hpp +++ /dev/null @@ -1,52 +0,0 @@ -//$file${src::gizmo.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: gizmo.qm -// File: ${src::gizmo.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${src::gizmo.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef GIZMO_HPP_ -#define GIZMO_HPP_ - -enum GizmoSignals { - DUMMY_SIG = QP::Q_USER_SIG, - // ... - MAX_PUB_SIG, // the last published signal - - START_SIG, - // ... - MAX_SIG // the last signal -}; - -//$declare${AOs::AO_Gizmo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - -//${AOs::AO_Gizmo} ........................................................... -// global "opaque" pointer to the Gizmo AO -extern QP::QActive * const AO_Gizmo; -//$enddecl${AOs::AO_Gizmo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // GIZMO_HPP_ - diff --git a/examples/qutest/start_seq/test/Makefile b/examples/qutest/start_seq/test/Makefile deleted file mode 100644 index 0e2936bf4..000000000 --- a/examples/qutest/start_seq/test/Makefile +++ /dev/null @@ -1,273 +0,0 @@ -############################################################################## -# Product: Makefile for QUTEST-QP/C++ for Windows and POSIX *HOSTS* -# Last Updated for Version: 7.2.0 -# Date of the Last Update: 2022-12-22 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# -# examples of invoking this Makefile: -# make # make and run the Python tests in the current directory -# make TESTS=test*.py # make and run the selected tests in the curr. dir. -# make HOST=localhost:7705 # connect to host:port -# make norun # only make but not run the tests -# make clean # cleanup the build -# make debug # only run tests in DEBUG mode -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the QTools collection for Windows, see: -# https://github.com/QuantumLeaps/qtools -# - -#----------------------------------------------------------------------------- -# project name: -# -PROJECT := test_gizmo - -#----------------------------------------------------------------------------- -# project directories: -# - -# list of all source directories used by this project -VPATH := . \ - ../src - -# list of all include directories needed by this project -INCLUDES := -I. \ - -I../src - -# location of the QP/C++ framework (if not provided in an env. variable) -ifeq ($(QPCPP),) -QPCPP := ../../../.. -endif - -# make sure that QTOOLS env. variable is defined... -ifeq ("$(wildcard $(QTOOLS))","") -$(error QTOOLS not found. Please install QTools and define QTOOLS env. variable) -endif - -#----------------------------------------------------------------------------- -# project files: -# - -# C source files... -C_SRCS := - -# C++ source files... -CPP_SRCS := \ - bsp.cpp \ - gizmo.cpp \ - test_fixture.cpp - -LIB_DIRS := -LIBS := - -# defines... -DEFINES := - -#----------------------------------------------------------------------------- -# add QP/C++ framework (depends on the OS this Makefile runs on): -# -CPP_SRCS += \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_actq.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qs.cpp \ - qs_64bit.cpp \ - qs_rx.cpp \ - qs_fp.cpp \ - qutest.cpp \ - qutest_port.cpp - -ifeq ($(OS),Windows_NT) - -QP_PORT_DIR := $(QPCPP)/ports/win32-qutest -LIBS += -lws2_32 - -else - -QP_PORT_DIR := $(QPCPP)/ports/posix-qutest -LIBS += -lpthread - -endif - -#============================================================================ -# Typically you should not need to change anything below this line - -VPATH += $(QPCPP)/src/qf $(QPCPP)/src/qs $(QP_PORT_DIR) -INCLUDES += -I$(QPCPP)/include -I$(QP_PORT_DIR) - -#----------------------------------------------------------------------------- -# GNU toolset: -# -# NOTE: -# GNU toolset (MinGW) is included in the QTools collection for Windows, see: -# https://www.state-machine.com/qtools -# It is assumed that %QTOOLS%\bin directory is added to the PATH -# -CC := gcc -CPP := g++ -#LINK := gcc # for C programs -LINK := g++ # for C++ programs - -#----------------------------------------------------------------------------- -# QUTest test script utilities (requires QTOOLS): -# -ifeq ("$(wildcard $(QUTEST))","") -QUTEST := python3 $(QTOOLS)/qutest/qutest.py -endif - -#----------------------------------------------------------------------------- -# basic utilities (depends on the OS this Makefile runs on): -# -ifeq ($(OS),Windows_NT) - MKDIR := mkdir - RM := rm - TARGET_EXT := .exe -else ifeq ($(OSTYPE),cygwin) - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := .exe -else - MKDIR := mkdir -p - RM := rm -f - TARGET_EXT := -endif - -#----------------------------------------------------------------------------- -# build options... - -BIN_DIR := build - -CFLAGS := -c -g -O -fno-pie -std=c11 -pedantic -Wall -Wextra -W \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -CPPFLAGS := -c -g -O -fno-pie -std=c++11 -pedantic -Wall -Wextra \ - -fno-rtti -fno-exceptions \ - $(INCLUDES) $(DEFINES) -DQ_SPY -DQ_UTEST -DQ_HOST - -ifndef GCC_OLD - LINKFLAGS := -no-pie -endif - -ifdef GCOV - CFLAGS += -fprofile-arcs -ftest-coverage - CPPFLAGS += -fprofile-arcs -ftest-coverage - LINKFLAGS += -lgcov --coverage -endif - -#----------------------------------------------------------------------------- -C_OBJS := $(patsubst %.c,%.o, $(C_SRCS)) -CPP_OBJS := $(patsubst %.cpp,%.o, $(CPP_SRCS)) - -TARGET_EXE := $(BIN_DIR)/$(PROJECT)$(TARGET_EXT) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o,%.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o,%.d, $(CPP_OBJS_EXT)) - -#----------------------------------------------------------------------------- -# rules -# - -.PHONY : norun debug clean show - -ifeq ($(MAKECMDGOALS),norun) -all : $(TARGET_EXE) -norun : all -else -all : $(TARGET_EXE) run -endif - -$(TARGET_EXE) : $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) $(LIB_DIRS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -run : $(TARGET_EXE) - $(QUTEST) -e$(TARGET_EXE) -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# create BIN_DIR and include dependencies only if needed -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) - ifneq ($(MAKECMDGOALS),debug) -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif - endif -endif - -debug : - $(QUTEST) -edebug -q$(QSPY) -l$(LOG) -o$(OPT) -- $(TESTS) - -clean : - -$(RM) $(BIN_DIR)/*.* - -show : - @echo PROJECT = $(PROJECT) - @echo TARGET_EXE = $(TARGET_EXE) - @echo VPATH = $(VPATH) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo CPP_OBJS_EXT = $(CPP_OBJS_EXT) - @echo LIB_DIRS = $(LIB_DIRS) - @echo LIBS = $(LIBS) - @echo DEFINES = $(DEFINES) - @echo QTOOLS = $(QTOOLS) - @echo HOST = $(HOST) - @echo QUTEST = $(QUTEST) - @echo TESTS = $(TESTS) - diff --git a/examples/qutest/start_seq/test/test_fixture.cpp b/examples/qutest/start_seq/test/test_fixture.cpp deleted file mode 100644 index 9bb3229be..000000000 --- a/examples/qutest/start_seq/test/test_fixture.cpp +++ /dev/null @@ -1,102 +0,0 @@ -//*************************************************************************** -// Product: Fixture for QUTEST -// Last updated for version 7.3.0 -// Last updated on 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ framework API -#include "bsp.hpp" // Board Support Package interface -#include "gizmo.hpp" // Gizmo AO - -using namespace QP; - -Q_DEFINE_THIS_FILE - -//............................................................................ -int main(int argc, char *argv[]) { - - QF::init(); // initialize the framework - - // initialize the QS software tracing - if (!QS_INIT(argc > 1 ? argv[1] : nullptr)) { - Q_ERROR(); - } - - BSP::init(); // initialize the BSP - - // pause execution of the test and wait for the test script to continue - QS_TEST_PAUSE(); - - // publish-subscribe not used, no call to QF::psInit() - - // initialize event pools... - static QF_MPOOL_EL(QEvt) smlPoolSto[10]; // storage for small pool - QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - static QEvt const *qQSto[10]; // event queue storage - AO_Gizmo->start(1U, - qQSto, Q_DIM(qQSto), - nullptr, 0U, (QEvt *)0); - - return QF::run(); -} - -//---------------------------------------------------------------------------- -void QS::onTestSetup(void) { -} -//............................................................................ -void QS::onTestTeardown(void) { -} -//............................................................................ -void QS::onCommand(uint8_t cmdId, - uint32_t param1, uint32_t param2, uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -//............................................................................ -// callback function to "massage" the event, if necessary -void QS::onTestEvt(QEvt *e) { - Q_UNUSED_PAR(e); -} -//............................................................................ -// callback function to output the posted QP events (not used here) -void QS::onTestPost(void const *sender, QActive *recipient, - QEvt const *e, bool status) -{ - Q_UNUSED_PAR(sender); - Q_UNUSED_PAR(recipient); - Q_UNUSED_PAR(e); - Q_UNUSED_PAR(status); -} diff --git a/examples/qutest/start_seq/test/test_start_seq.py b/examples/qutest/start_seq/test/test_start_seq.py deleted file mode 100644 index 7827f27b9..000000000 --- a/examples/qutest/start_seq/test/test_start_seq.py +++ /dev/null @@ -1,53 +0,0 @@ -# test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/qutest.html - -note(''' -This test group demonstrates testing of the start sequence. -Specifically, a "Gizmo" AO needs to start either in the state -"on_mains", when the AO detects at runtime that main power -is available, or in the state "on_battery", when it is not. -However, the state machine semantics does not allow guard -conditions on the initial transition itself. A workaround is -to self-post a START event, which then triggers a transition -with a guard. -''') - -def on_reset(): - expect_pause() - -test(''' -QACTIVE_START(AO_Gizmo) with status==1, -should go to state "on_mains" -''') -current_obj(OBJ_AP, 'status') -poke(0, 1, pack(' St-Init Obj=AO_Gizmo,State=QP::QHsm::top->Gizmo::init") -expect("@timestamp AO-Post Sdr=AO_Gizmo,Obj=AO_Gizmo,Evt St-Entry Obj=AO_Gizmo,State=Gizmo::init") -expect("@timestamp Init===> Obj=AO_Gizmo,State=Gizmo::init") -expect_run() -expect("@timestamp AO-GetL Obj=AO_Gizmo,Evt Obj=AO_Gizmo,Sig=START_SIG,State=Gizmo::init") -expect("@timestamp USER+005 START") -expect("@timestamp ===>Tran Obj=AO_Gizmo,Sig=START_SIG,State=Gizmo::init->Gizmo::on_mains") - -test(''' -QACTIVE_START(AO_Gizmo) with status==0, -should go to state "on_battery" -''') -current_obj(OBJ_AP, 'status') -poke(0, 1, pack(' St-Init Obj=AO_Gizmo,State=QP::QHsm::top->Gizmo::init") -expect("@timestamp AO-Post Sdr=AO_Gizmo,Obj=AO_Gizmo,Evt St-Entry Obj=AO_Gizmo,State=Gizmo::init") -expect("@timestamp Init===> Obj=AO_Gizmo,State=Gizmo::init") -expect_run() -expect("@timestamp AO-GetL Obj=AO_Gizmo,Evt Obj=AO_Gizmo,Sig=START_SIG,State=Gizmo::init") -expect("@timestamp USER+005 START") -expect("@timestamp ===>Tran Obj=AO_Gizmo,Sig=START_SIG,State=Gizmo::init->Gizmo::on_battery") - diff --git a/examples/qwin-gui/README.md b/examples/qwin-gui/README.md deleted file mode 100644 index d67f7685d..000000000 --- a/examples/qwin-gui/README.md +++ /dev/null @@ -1,82 +0,0 @@ -![QTools Collection](https://www.state-machine.com/img/qwin_banner.jpg) - -# About this Directory -This directory contains examples that illustrate the "Dual Targeting" -approach to developing embedded software. Specifically, the examples -run on Windows GUI, but large portions of the code are actually for -deeply embedded boards. - - -# What is "Dual Targeting"? -When developing embedded code for devices with non-trivial user interfaces, -it often pays off to build a prototype (virtual prototype) of the embedded -system on a PC. The strategy is called "dual targeting", because you develop -software on one machine (e.g., Windows PC) and run it on a deeply embedded -target, as well as on the PC. Dual targeting is the main strategy for -avoiding the "target system bottleneck" in the agile embedded software -development. - -> **NOTE** -*Please note that dual targeting does not mean that the embedded device has -anything to do with the PC or Windows. Neither it means that the simulation -must be cycle-exact with the embedded target CPU. Instead, dual targeting -simply means that from day one, your embedded code (typically in C or C++) -is designed to run on at least two platforms: the final target hardware and -your PC. All you really need for this is two C/C++ compilers: one for the PC -and another for the embedded device.* - - -# About QWin™ GUI Prototyping Toolkit -QWin™ is a free GUI toolkit for prototyping embedded systems on Windows in the -C or C++ programming language, including building realistic embedded front panels -consisting of LCD displays (both graphic and segmented), LEDs, buttons, knobs, -sliders, etc. The implementation is based on the raw Win32 API to provide simple -direct mapping to C/C++ for easy integration with your embedded code. - - -> **NOTE** -_The problem of building GUI prototypes of embedded devices on the desktop -is very common, yet it seems that most developers try to use C#, .NET, -VisualBasic or other such environments to build prototypes of their embedded -devices. The main shortcoming of all such solutions is that they don't provide -direct binding to C/C++, which complicates the build process and the debugging -of the C/C++ code on the host._ - - -# QWin™ Code -QWin™ is included in the QP/C and QP/C++ frameworks (in the `\ports\win32` -and `\ports\win32-qv` directories), where `` stands for the -installation directory of the qpc or the qpcpp framework. - from the QTools Collection._ - - -# QWin™ Features -Currently QWin™ provides the following facilities: - -* Graphic displays (pixel-addressable) such as graphical LCDs, OLEDs, etc. - with up to 24-bit color -* Segmented displays such as segment LCDs, and segment LEDs with generic, - custom bitmaps for the segments. -* Owner-drawn buttons with custom “depressed†and “released†bitmaps and capable - of generating separate events when depressed and when released. - -Additionally, the provided code shows how to handle input sources: -* Keyboard events -* Mouse move events and mouse-wheel events - - -# QWin™ Documentation -QWin™ GUI Prototyping Toolkit is described in the pplication Note: -[QWIN GUI Kit for Prototyping Embedded Systems on Windows](https://www.state-machine.com/doc/AN_QWin-GUI.pdf). - -[![AppNote: QWIN GUI Kit for Prototyping Embedded Systems](https://www.state-machine.com/img/qwin_an.jpg)](https://www.state-machine.com/doc/AN_QWin-GUI.pdf) - - -# Licensing -The QWin is licensed under the permissive MIT license -(see top-level comments in the files `qwin_gui.h` and `qwin_gui.c`) - - -# Contact information: -- https://www.state-machine.com -- info@state-machine.com diff --git a/examples/qwin-gui/dpp-gui/Res/BTN_DWN.bmp b/examples/qwin-gui/dpp-gui/Res/BTN_DWN.bmp deleted file mode 100644 index 029e063b654a9315835e5090a91cbbcdc80cd6a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5994 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 Hz%l#}`#dmn diff --git a/examples/qwin-gui/dpp-gui/Res/BTN_UP.bmp b/examples/qwin-gui/dpp-gui/Res/BTN_UP.bmp deleted file mode 100644 index 28faefc9a7e374861477162e091e7a9d1071103b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5994 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 diff --git a/examples/qwin-gui/dpp-gui/Res/eating.bmp b/examples/qwin-gui/dpp-gui/Res/eating.bmp deleted file mode 100644 index d32ce36dadc0437ca26c35c8536ba65fb1988c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17814 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 diff --git a/examples/qwin-gui/dpp-gui/Res/qp.ico b/examples/qwin-gui/dpp-gui/Res/qp.ico deleted file mode 100644 index 032e1307b5a64fadaea08a03d24c25171a25ee32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10134 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 I);#e2KXW%voB#j- diff --git a/examples/qwin-gui/dpp-gui/Resource.rc b/examples/qwin-gui/dpp-gui/Resource.rc deleted file mode 100644 index 96bf900a5dc9627b9b19c2ef3635c5dba7f04d02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7354 zcmd^ES#Kgo5U%G)`45xvOI9Hm<0HqL&1JNhB?j*r$r9RKp9+gDgXKiZZ%^`lRg`BM zW-x2VD^}5H=$<~RzplHRfBs&Vb&2FauH>WK%C(H~p34MnZ_zfEJ9#fdd{yKJJds?; znT+t>qJ4t$6m7RCIqwd&kEloZBDE{I!I+|aE8k$1buHJ>IzsOdqfd2gJU726mlEq} z&Ro-R=Q@wHccmj;>B*5)r73S@Acs;zYZdjjw4{%gE`ASW4=pX!eSKnBy~ojc8A$_t zndR|0xO6R_u>T3TLq7Dd>tp;jvFi%Qt>$||V zPC;>3>d-2)sV?m22-a1>$^&Ru3lHi3g(u3L*#nJ3=r>v3X@nf0yH?f?+Z=FD+&G#oL^AK%5 z5z*(av!?#|6qZIGV-I~qmcNlasL|r##?$6J;E+~%2U(fSbjqm#`rs(#t#%L*mDP5Ach(!#lUfg6(`7MXz2xfQ{r#H^EO5t0tMyz z4pb9KFs5)E(RUP2X^N0IO{2=dOBp$e$1rlgdsw*#-q31a>u&?}*kicaLroqi7h)i= z2+M4l*eTlqs5C+402qnw7aeQ7Bf2fwc|lyXrR8u@s+8rnP}8=Re=mz|YiVr8t?e&_ ztGqO>4RDFrSbiyV)S2ZZO6eIkaynb0Eoi2l6WlJsGKRGsLHpZN?RQTQ+HF1|F5#JY3M!(`lTR8M zJ%PoX3NV;#7+I*<8&gh%$QTi5rFr<==6xLZR#tl{gCf6nrraj4YijrOYV=6^_^M2O zVJqN=Q(Jab^3`>Y>+*X?HIJ>!ubc1lP5LqLUL#ih8E`cnAxyT^ec%5kBu;b|3Bufv zI*`sNR;%vlyo}(n8TF`VH!3gBemKJ8!X9MXhIg-OWD2b&{gw9q>Gr%jEspmkCwRg& zit<4-h~(~L7K`OBd6c=YBogJ1N_w)eaE*KVeL6Q;jIt-;qSS8aqV6$+jBII&P(R=^rB6i z5-j#G6ZT$~e0g^Kyt6%T7-%&$yWBKuN^m#jK=YfMcM2vjf!3v4LPip_abFtr! zrR6`+Q(hn3WHvCX!Hac?Hwbp$wwPkJUYQOg@^Gthn_Imy%^jlSId=l@O3!wIuO2-A z2R%WjN3zb0j~2l@L^}=An%I-g8}glJv*heqeXvrumUI~hBf}dgrxj+(>Dgg@Hm5Ek zb`+6m5p5`~d<*(-?s`{G0~`@~k$%n7FS^O6?7!Z7+~@tLvkBc@{GX2V()qi3B@yQ9 S`v~U|{_8mZ56-;YN$FpF6+zkn diff --git a/examples/qwin-gui/dpp-gui/bsp.cpp b/examples/qwin-gui/dpp-gui/bsp.cpp deleted file mode 100644 index 05af2a631..000000000 --- a/examples/qwin-gui/dpp-gui/bsp.cpp +++ /dev/null @@ -1,377 +0,0 @@ -//============================================================================ -// Product: DPP example, Win32-GUI -// Last updated for: @qpcpp_7_3_0 -// Last updated on 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -#include "qwin_gui.h" // QWIN GUI -#include "resource.h" // GUI resource IDs generated by the resource editor - -#include "safe_std.h" // portable "safe" / facilities - -#ifdef Q_SPY - #define WIN32_LEAN_AND_MEAN - #include // Win32 API for multithreading - #include // for Windows network facilities -#endif - -//============================================================================ -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE - -// local variables ----------------------------------------------------------- -static HINSTANCE l_hInst; // this application instance -static HWND l_hWnd; // main window handle -static LPSTR l_cmdLine; // the command line string - -static SegmentDisplay l_philos; // SegmentDisplay to show Philo status -static OwnerDrawnButton l_pauseBtn; // owner-drawn button - -static unsigned l_rnd; // random seed - -#ifdef Q_SPY - enum { - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - COMMAND_STAT - }; - static SOCKET l_sock = INVALID_SOCKET; - static std::uint8_t const l_clock_tick = 0U; -#endif - -} // unnamed namespace - -//============================================================================ -extern "C" { - -Q_NORETURN Q_onError(char const* const module, int_t const loc) { - QP::QF::stop(); // stop ticking - QS_ASSERTION(module, loc, 10000U); // report assertion to QS - - char message[80]; - SNPRINTF_S(message, Q_DIM(message) - 1, - "Assertion failed in module %s location %d", module, loc); - MessageBox(l_hWnd, message, "!!! ASSERTION !!!", - MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); - PostQuitMessage(-1); -} - -// Local functions ----------------------------------------------------------- -static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, - WPARAM wParam, LPARAM lParam); - -} // extern "C" - -//============================================================================ -// thread function for running the application main() -static DWORD WINAPI appThread(LPVOID par) { - (void)par; // unused parameter - return main_gui(); // run the QF application -} - -//============================================================================ -namespace BSP { - -//............................................................................ -void init() { - if (!QS_INIT(l_cmdLine)) { // QS initialization failed? - MessageBox(l_hWnd, - "Cannot connect to QSPY via TCP/IP\n" - "Please make sure that 'qspy -t' is running", - "QS_INIT() Error", - MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); - } - QS_OBJ_DICTIONARY(&l_clock_tick); // must be called *after* QF::init() - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - QS_USR_DICTIONARY(COMMAND_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); -} -//............................................................................ -void terminate(std::int16_t result) { -#ifdef Q_SPY - if (l_sock != INVALID_SOCKET) { - closesocket(l_sock); - l_sock = INVALID_SOCKET; - } -#endif - QP::QF::stop(); // stop the main QF application and the ticker thread - - // cleanup all QWIN resources... - OwnerDrawnButton_xtor(&l_pauseBtn); // cleanup the l_pauseBtn resources - SegmentDisplay_xtor(&l_philos); // cleanup the l_philos resources - - // end the main dialog - EndDialog(l_hWnd, result); -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - UINT bitmapNum = 0; - - Q_REQUIRE(n < APP::N_PHILO); - - switch (stat[0]) { - case 't': bitmapNum = 0U; break; - case 'h': bitmapNum = 1U; break; - case 'e': bitmapNum = 2U; break; - default: Q_ERROR(); break; - } - // set the "segment" # n to the bitmap # 'bitmapNum' - SegmentDisplay_setSegment(&l_philos, (UINT)n, bitmapNum); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t paused) { - char buf[16]; - LoadString(l_hInst, - (paused != 0U) ? IDS_PAUSED : IDS_RUNNING, buf, Q_DIM(buf)); - SetDlgItemText(l_hWnd, IDC_PAUSED, buf); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - l_rnd = l_rnd * (3U*7U*11U*13U*23U); - return l_rnd >> 8; -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} - - -} // unnamed local namespace - -//============================================================================ -extern "C" { - -extern "C" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE /*hPrevInst*/, - LPSTR cmdLine, int iCmdShow) -{ - l_hInst = hInst; // save the application instance - l_cmdLine = cmdLine; // save the command line string - - //AllocConsole(); - - // create the main custom dialog window - HWND hWnd = CreateCustDialog(hInst, IDD_APPLICATION, NULL, - &WndProc, "MY_CLASS"); - ShowWindow(hWnd, iCmdShow); // show the main window - - // enter the message loop... - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - //FreeConsole(); - BSP::terminate(0); - - return msg.wParam; -} -//............................................................................ -static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, - WPARAM wParam, LPARAM lParam) -{ - switch (iMsg) { - - // Perform initialization upon creation of the main dialog window - // NOTE: Any child-windows are NOT created yet at this time, so - // the GetDlgItem() function can't be used (it will return NULL). - // - case WM_CREATE: { - l_hWnd = hWnd; // save the window handle - - // initialize the owner-drawn buttons... - // NOTE: must be done *before* the first drawing of the buttons, - // so WM_INITDIALOG is too late. - // - OwnerDrawnButton_init(&l_pauseBtn, IDC_PAUSE, - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_UP)), - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_DWN)), - LoadCursor(NULL, IDC_HAND)); - return 0; - } - - // Perform initialization after all child windows have been created - case WM_INITDIALOG: { - - SegmentDisplay_init(&l_philos, - APP::N_PHILO, // N_PHILO "segments" for the Philos - 3U); // 3 bitmaps (for thinking/hungry/eating) - SegmentDisplay_initSegment(&l_philos, 0U, IDC_PHILO_0); - SegmentDisplay_initSegment(&l_philos, 1U, IDC_PHILO_1); - SegmentDisplay_initSegment(&l_philos, 2U, IDC_PHILO_2); - SegmentDisplay_initSegment(&l_philos, 3U, IDC_PHILO_3); - SegmentDisplay_initSegment(&l_philos, 4U, IDC_PHILO_4); - SegmentDisplay_initBitmap(&l_philos, - 0U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_THINKING))); - SegmentDisplay_initBitmap(&l_philos, - 1U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_HUNGRY))); - SegmentDisplay_initBitmap(&l_philos, - 2U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_EATING))); - - // --> QP: spawn the application thread to run main() - HANDLE hThr = CreateThread(NULL, 0, &appThread, NULL, 0, NULL); - Q_ASSERT(hThr != (HANDLE)0); - - SetDlgItemTextA(hWnd, IDC_EDIT1, "Edit1"); - SetDlgItemTextA(hWnd, IDC_EDIT2, "Edit2"); - return 0; - } - - case WM_DESTROY: { - PostQuitMessage(0); - return 0; - } - - /* commands from child controls and menus... */ - case WM_COMMAND: { - switch (wParam) { - case IDOK: - case IDCANCEL: { - PostQuitMessage(0); - break; - } - case IDC_PAUSE: { // owner-drawn button(s) - SetFocus(hWnd); - break; - } - case IDC_BUTTON1: { // regular button - char buf[32]; - GetDlgItemTextA(hWnd, IDC_EDIT1, buf, sizeof(buf)); - SetDlgItemTextA(hWnd, IDC_EDIT2, buf); - break; - } - } - return 0; - } - - // drawing of owner-drawn buttons... - case WM_DRAWITEM: { - static QP::QEvt const pe(APP::PAUSE_SIG); - LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT)lParam; - switch (pdis->CtlID) { - case IDC_PAUSE: { // PAUSE owner-drawn button - switch (OwnerDrawnButton_draw(&l_pauseBtn,pdis)) { - case BTN_DEPRESSED: { - APP::AO_Table->POST(&pe, nullptr); - break; - } - case BTN_RELEASED: { - static QP::QEvt const se(APP::SERVE_SIG); - APP::AO_Table->POST(&se, nullptr); - break; - } - default: { - break; - } - } - break; - } - } - return 0; - } - - // mouse input... - case WM_MOUSEWHEEL: { - return 0; - } - - // keyboard input... - case WM_KEYDOWN: { - return 0; - } - } - return DefWindowProc(hWnd, iMsg, wParam, lParam) ; -} - -} // extern "C" - -//============================================================================ - -namespace QP { - -//............................................................................ -void QF::onStartup(void) { - QF::setTickRate(BSP::TICKS_PER_SEC, 30); // set the desired tick rate -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QF::onClockTick(void) { - // perform the QF clock tick processing - QTimeEvt::TICK_X(0U, &l_clock_tick); - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output -} - -//---------------------------------------------------------------------------- -#ifdef Q_SPY // define QS callbacks - -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - diff --git a/examples/qwin-gui/dpp-gui/bsp.hpp b/examples/qwin-gui/dpp-gui/bsp.hpp deleted file mode 100644 index 2479d54c1..000000000 --- a/examples/qwin-gui/dpp-gui/bsp.hpp +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -// Product: DPP example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-12 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {100}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void wait4SW1(); -void ledOn(); -void ledOff(); - -extern QP::QTicker *AO_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ diff --git a/examples/qwin-gui/dpp-gui/dpp-gui.sln b/examples/qwin-gui/dpp-gui/dpp-gui.sln deleted file mode 100644 index 2daa822a3..000000000 --- a/examples/qwin-gui/dpp-gui/dpp-gui.sln +++ /dev/null @@ -1,23 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dpp-gui", "dpp-gui.vcxproj", "{79027B25-0949-4F66-9765-4EFBCBBEFB94}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - QSpy|Win32 = QSpy|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Debug|Win32.ActiveCfg = Debug|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Debug|Win32.Build.0 = Debug|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Release|Win32.ActiveCfg = Release|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Release|Win32.Build.0 = Release|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.QSpy|Win32.ActiveCfg = QSpy|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.QSpy|Win32.Build.0 = QSpy|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj b/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj deleted file mode 100644 index 8c3135b22..000000000 --- a/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj +++ /dev/null @@ -1,320 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - QSpy - Win32 - - - - {79027B25-0949-4F66-9765-4EFBCBBEFB94} - dpp-gui - 10.0 - - - - Application - false - NotSet - v142 - - - Application - false - NotSet - v142 - - - Application - false - NotSet - v142 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(Configuration)\ - $(Configuration)\ - false - false - $(Configuration)\ - $(Configuration)\ - false - false - $(Configuration)\ - $(Configuration)\ - false - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/dpp-gui.tlb - - - - - MaxSpeed - OnlyExplicitInline - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;QWIN_GUI;_WINDOWS;%(PreprocessorDefinitions) - false - - - MultiThreaded - true - - - $(IntDir) - $(IntDir) - $(IntDir) - Level3 - true - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - %(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - Windows - false - - - MachineX86 - - - true - .\Release/dpp-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\QSpy/dpp-gui.tlb - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - Q_SPY;QWIN_GUI;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - - - $(IntDir) - $(IntDir) - $(IntDir) - true - Level3 - true - ProgramDatabase - Default - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ws2_32.lib;%(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - true - false - - - Windows - false - - - MachineX86 - - - true - .\QSpy/dpp-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/dpp-gui.tlb - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - QWIN_GUI;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - - - $(IntDir) - $(IntDir) - $(IntDir) - true - Level3 - true - ProgramDatabase - Default - - - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - %(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - true - false - - - Windows - false - - - MachineX86 - - - true - .\Debug/dpp-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - - true - - - true - - - - - - - - - - - - - - - - true - true - - - true - true - - - true - true - - - true - true - - - true - true - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj.filters b/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj.filters deleted file mode 100644 index bacd1fe07..000000000 --- a/examples/qwin-gui/dpp-gui/dpp-gui.vcxproj.filters +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QS - - - QS - - - QS - - - QS - - - QS - - - QS - - - QP_port - - - QP_port - - - - - - - - - QS - - - QP_port - - - - - Res - - - Res - - - Res - - - Res - - - Res - - - Res - - - Res - - - - - - {c8d4d732-dcf8-4466-ad8e-3f15ab6fe204} - - - {cb277694-9964-421d-b5bd-0004c348d0a7} - - - {45ec4af0-fc0e-466d-abe9-db8791529dc6} - - - {3c454ef1-d642-403f-97ef-c157e04d82c9} - - - - - - \ No newline at end of file diff --git a/examples/qwin-gui/dpp-gui/dpp.hpp b/examples/qwin-gui/dpp-gui/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/qwin-gui/dpp-gui/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/qwin-gui/dpp-gui/dpp.qm b/examples/qwin-gui/dpp-gui/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/qwin-gui/dpp-gui/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/qwin-gui/dpp-gui/main.cpp b/examples/qwin-gui/dpp-gui/main.cpp deleted file mode 100644 index 993a5014f..000000000 --- a/examples/qwin-gui/dpp-gui/main.cpp +++ /dev/null @@ -1,89 +0,0 @@ -//============================================================================ -// DPP example for Windows -// Last updated for: @qpcpp_7_3_0 -// Last updated on 2023-07-19 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -// "fudge factor" for Windows, see NOTE1 -enum { WIN_FUDGE_FACTOR = 10 }; - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe - - // initialize event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO*WIN_FUDGE_FACTOR]; - QP::QF::poolInit(smlPoolSto, - sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10*WIN_FUDGE_FACTOR]; - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start(n + 1U, - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - nullptr, 0U); - } - // leave the priority level (N_PHILO + 1) free for the mutex in BSP - static QP::QEvt const *tableQueueSto[APP::N_PHILO*WIN_FUDGE_FACTOR]; - APP::AO_Table->start(APP::N_PHILO + 2U, - tableQueueSto, Q_DIM(tableQueueSto), - nullptr, 0U); - - return QP::QF::run(); // run the QF application -} - -//============================================================================ -// NOTE1: -// Windows is not a deterministic real-time system, which means that the -// system can occasionally and unexpectedly "choke and freeze" for a number -// of seconds. The designers of Windows have dealt with these sort of issues -// by massively oversizing the resources available to the applications. For -// example, the default Windows GUI message queues size is 10,000 entries, -// which can dynamically grow to an even larger number. Also the stacks of -// Win32 threads can dynamically grow to several megabytes. -// -// In contrast, the event queues, event pools, and stack size inside the -// real-time embedded (RTE) systems can be (and must be) much smaller, -// because you typically can put an upper bound on the real-time behavior -// and the resulting delays. -// -// To be able to run the unmodified applications designed originally for -// RTE systems on Windows, and to reduce the odds of resource shortages in -// this case, the generous WIN_FUDGE_FACTOR is used to oversize the -// event queues and event pools. -// diff --git a/examples/qwin-gui/dpp-gui/philo.cpp b/examples/qwin-gui/dpp-gui/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/qwin-gui/dpp-gui/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/dpp-gui/resource.h b/examples/qwin-gui/dpp-gui/resource.h deleted file mode 100644 index 6e14c1245..000000000 --- a/examples/qwin-gui/dpp-gui/resource.h +++ /dev/null @@ -1,35 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Resource.rc -// -#define IDI_QP 2 -#define IDD_APPLICATION 101 -#define IDB_THINKING 134 -#define IDB_EATING 135 -#define IDB_HUNGRY 136 -#define IDB_BTN_UP 137 -#define IDB_BTN_DWN 138 -#define IDC_PHILO_0 1000 -#define IDC_PHILO_1 1001 -#define IDC_PHILO_2 1002 -#define IDC_PHILO_3 1003 -#define IDC_PHILO_4 1004 -#define IDC_EDIT1 1005 -#define IDC_PAUSE 1006 -#define IDC_EDIT2 1007 -#define IDC_BUTTON1 1008 -#define IDC_PAUSED 1009 -#define IDS_APP_TITLE 40000 -#define IDS_PAUSED 40001 -#define IDS_RUNNING 40002 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 112 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1009 -#define _APS_NEXT_SYMED_VALUE 123 -#endif -#endif diff --git a/examples/qwin-gui/dpp-gui/table.cpp b/examples/qwin-gui/dpp-gui/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/qwin-gui/dpp-gui/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/game-gui/Res/BOARD.bmp b/examples/qwin-gui/game-gui/Res/BOARD.bmp deleted file mode 100644 index 64875e3ca688d5504721f91bb12ffa1b1b7770d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659366 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

a|~)~NzoiGE!|&Gus1JnPj24c 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
22zsN z?$=ya2X(3<4B z24Z2k2dJ>zgO~US)kd*0GeKe{z{_*q%o&hZaZ!;(h@>SY+zGz+?e;HcPn+uP>H>9! zgOf_^}itucwkf7z)!qPLazz_dg#GY4# z$%_pLg$hHOZzxn~Upf~jmE5|hzzt%$pE7a$XPY+?$PoAB@smdp!1(=p_pDm6oahw> zgM%HJqeuZIghwD_L5ULg$Qn(Bj$(ssnw{ZoviH*MIv8xv;EF*Y?P zPXjNAlHw5Zev0fq8suxo>^WUg~?^ro)f3xV6UiW^p2|b5PVEb zEZ)QDWo#a_eD#S(F{pK2jZK)ba^0eP_(weLFNPw|M8#Gpa_G?<#3x$E4+dAFTS8 zlJ*cib44S&S(~=sc$Sq|(QxE?h`o1!m92vjP#Q}w*-lYrgU#U`gdY*QwFV|uHXdUq zZa#b>wfEL5t`B+}PTC0c==B>jk0F zS4&7j@6RR8ozJrKckJ0qoGhxOybHoS3dskwQW5!CkgCIz9^hf+X(13 zYVECQ?X7F=trw-Ip}nu6tG~Llx3smhw5_|mtv9c-{#-D73TI0zCR`)Xb=8P?~x4d(DksRcOL--V_SQmr9FDWxLCFjBOg7Eyx(88+ok#V-} zUbu;)D@=d@n2j(|Lr5lu!Z7k`X`31v+B&+7nKci8w%oSfjE2t4dR)aiKvN=Qpt%do zR*c{euniOkW!l(A1j@pt?^~Ig;ebRAcM&vTpaZ>zG8?JIjKFM`sH|Dd`(RZ_LQ+{z zKf3^&;z~O(j)U1c1ZHDP*wTr75FT!2ZQTW}opHH^dk-IDx@Da;HbU1;*T9%Kbdg^b zQz`MS&?$sF_>UTW>gJuY-dDLzGR)TXvc9XQp%cf*?)o;FwOx?6@NfO)oqahS-FwfR z_Y4?8kdy&n)lf%WUtOPs2cR}qTY*>Me1;=5K;M zd7BcH8hHFYz=m^ztO!?y-z)MZ{x!@d_FoVwn7m~=Y^-inuz^y*IehPAV>xZY*uCF= z9UB!%1>GS-XcBS* zyh-?t-|#&}_C0V8_XDZC4&H=COje*_1z;0Gdr8f6rkYm05<9S|AytSJ!`3* zfh|*)PB)MO8hAbOA4~tsQG$*VW&^NEoDv`ntiqzt5v~d6e91rG-O(Or!fl&3U%zxI zEg?P`cfr%A)~{ZL=@Vdv->(F-g+nR1=6GN5EkO-{Jb)OhWL|mFXq1t?V*5Zv7%^~* zA%hR@KiF|Zg)At9{2}P5CLEoaDu1iUboh0J0~kS4Nd2%)!@z{yN|!Kv60XTot-;sH zC_7HX!o}I4Qi14Hyxd&gU$Xe%zP%Cm!=9%kKaGBZF@5})AP0L}Zdt-?Sj@4TOCRYR zn&1d>qe9n7y)EzRe+0APO?KworL?q+#`@;IuHMepwzOwSqI-D(jZLgb|3k2knKADd z9t9qb&d$zmUV)?0N{Y)aYX12@tGoN#|N6JKpa0s_|ElHHPwhYbXG1q(q<^dL{kfv6 z?`cl{`|CD3SlfHrIa$Nj5#1(|Fbd4ZtVqnCiJ`u|rG=Y=i<`Iqij7-BQ!@%$x@$XM zHnjKR7gyEY|E#q7Mr`us@Ys-q7crHM2^9@VMdjYousosbXgP7p>vSrZ)aF<{t@v zoLJk0Ccw^PryacfOl|D&qh*>OWM@yHOK9*s&|Luq>mq_r%@%UgIVigI7(-A3+)~C3UcX zvZ9KrlA@{-G!DXb#J<}&xY~I6f3*Ai@SK9ktfDC^)(*3E(lNJ1j~B}BJ#C{QhSs)0 z(~d_x#eDp&_!aTL9K!FJX~+ z{dBcRHcO^bGS|Zoh-iH)91opWZ~pX2dS>%a|Iyq}?8%QjCdrdc;J2>+hTc~V{Xf
m5k}hcV@_H1nvEOnT^uc~&1sevl$3^W<0`;4RpN1nvJCNl z+1T3KxOiT?_b{ivqZps4x>kv5%dT$9tZbkVhEQ1FhB>dk|8IqLE#DnD;^pJVG7V-^ zRvZkd7H#n&sjFc0R#F`bF+_ln>xiHY-|mYosmbj4>2g%ksnEwK??s&rkGUL`c$ zky{U_LtaG}R>zk&+)v5!8a3X@#ogA@f+Yi2-B;SrpzZ?JJPW+3T zPtz&k>G?7Fm8c>=$glkV!VO0^FF1XXaF&c0WL^TZk#UrCWyatu9aBRics947aSvYP zmh}D%W=pHa=-iUq*bZzfY3_n;6Gaw}z_u%=qxVKs%(Pi^tWC`vNYxEsGbB~0wuR|1 zGm~L#+pLVmd}3?o;1V$6^xe>k-dDx#J#ciT9o_8pWG-!8m93o>kZ&y=6|$#a(fu;| zMfQfzJ~uNm#{ZmTx*|xzKwGeOEZ|Vn6N>KX7x4MM14W&^MQ!-V^_92vU|VN5 z(I|7gWS~L_L*7<)5SY+Y+V|t8oxALvT(DQ0qatoPoJ0rMF`2C}F_3asP%d~wS=;P5 za45Z^va0__FdOup7^__`>pJ^tu)4Ov3U)A1D>{2iaBQn>{66@m`!HHrz!A*A zxxj2Lj&>;7K8=d#>1-ny^I^!H58q!#tf-Ev60rjqOqmS?9VfyEbvfesCRi%man)7i zPzRQPo02YGx)FZNKk|n1OX(Yazy(m}XA-9Ry`!|&OY1uf1Zy$32JDpiQ-Kp$I)HGh zXfuKU`N%^DwqbN*GU509jG$2w;UY5)!@PNWxZwuhSY6dnReAo@$vM-eI@{Vv9#&ZD z!ED?S_rl$A!Q2bi$<@j(^}qGdn7Aa^BS%5Rmxr5^qdg=WXbt!($F6*&S$WHJIK3@@?*9m8o3~(DLo@cw zpMUya|M}D3{-e9QH#I4R5K%`{O9vARYw|w;7mbHolNV-~uCt|utCNeXr*F`dSzGrU zew31l#j3jJ6~Tj)I>C(nT;2W?Hmv-HwwSEE-N#S6dIz}LI{P@dI9Xcp1kpVp4Hnl= zUL@=ejAt8DV^paMhJn6HI9LHw$5(TSFE}aofKD5 zU)cXQ+`>QjX8*KxTh{J6^wpVbPs{2vI$l1?EBWr^`3W=T8JSpF+1Z;|n!_t8s0sHifOC{lJ>hT6ki?3}IbUC@F5 z=G^5pg4(K@zc_Mg^t{FPfupVcM|n+~`@zn=FWUNFbp04xQhW4T$m}I6P0ekcUEG+w z$epgKiDMX{sv?VlaP-$yWj=JYv2}Iz@*O+z)BQ&hY8sx_G#q>QWZ|}5o^zJ_FIqkA zndz$P0cU4awpW>*3QY*33~?Ov^;wxQ`kVkuM#byrZyC7Has*L1g)K1mwdSCV%X#K z@_L%ZrA>+(mHgRo#KLnP%!cU4i7U5eE?8<~=Kz__rWk%OgjX2Xpq7{PnY0N z7i(JwCs)rg6W8w88gbDY^F&GjF3DB13D0P7p&Hm0O-r*6_5n;liVY1*d4a6BuUlH#Oq{pi;)6$74XuSDuK7p85CDV~ z?UWvYDm#0tdtO#_zAS3(y`Pq~Zs#s*R}aGDU~fRexU`W>6`+7@4p0A|D_qs@6{$f9 z$;gk=+WjW|@+-q8@ofJGn2n{ArHX+^0nA9)2`EK~D6oX{x;Z&^ zAOzlP3_`45zV2=(j~uQlEkT3g!l{!JM+fmGR#!4~ORx>hCPt==YLlKFx5f)g0R~8D z2h=17V{d{b`D#w(HSjhNw*4cRZ6I0$5lKaU>VcIvFGGH6D)L{-FF-;^%#%!UKpLrl z9H5w_h+5E&r-$2?Pd|x%64h86ke z`#FuDxqjD?+cC+hMU~k#jT!Y#Ic=Ru71c?_74aq2H*(9aC8STBx5(AY%g({p!iq!+ zSnX8MS4ICzOP$osBpeXov__;E)zWjfcXD_0bo31jT)y^Na^{1=%BZqBj6o>Ohvk$% zE^UY|ZMdA2zV+zo$qQFFyZO2}xZBy;LxT!+R#iX+*a9=2`n!tn!Qtqrs~YL*+L%Fb zc@MXBc3--7=bcB$K1AhIMdei9eNlWfqvUpW`Tc_G+nL4t(2m%=)y~7u%*+;;N6tl_ zi^|X;ddRU6vZ*>$k)o_b5Q3hHrn8lUy}b)Fy!W&@YxbWG&#Qb^)fAascqcLS?z6Or z?1G5GvZr;eu{AB{BIB2S{JDdxueG(Km9?$R5=vrCW;}t}Aa;l1IIpe@g=uGQ;o{)p z>Ju0^ea`lCm+xle#Z@+;)^#_%_+sn}^i*R@>*FgM(AJ17D8^q}*Tv1)-pS6^!N$nU zNRyP-x=d=MEHEY{gQ3Mp)>gH#v-0xyv2$@9H*My3M^7XcmFCtr)pYmQb@$hI_0_|J zb@$^LnOEDGT3G(|fg@w4PPcV(vbM8=2~krS0%jF;2}d5N!qTcD9AQI9Hv~d2-~>0*?I?zS-9e2RANebQ))%i(}Jpp zY5DkxJxI+h<$&bZ(*d%xB#~}QTUCk6 z$1%Xg&BM`W#Ps*qAG;m-xTy9?dHwZgA_wmFlb3g%4L=SiPOvtybg{CuF(a2J+e{=`$S!I`3<7DkSk$b{ z%m6~B?AB&2I2#d@$Y!Uh^LbPIi^jIBhBle#hfrxl`U41uZrjzTNh4>@wXt)uHG^jZ zl@mp!ZHbGlF&0dgLTyVUeM@5e>2pVC|7kNwSn#5CSa!qLW5-E^@nZa zqXgTCJ(O-4q$eS_|32dSuB(G!mxq(%ibV^9FI~VXD={W|<+7#Z)q>%WFdHaT!ff0! zmrbXMRB8X$m`wss5@eE&@KC??WaVG}9hE9aEL7wGY+yw~DRLk&5H9|Mm<{j-y~b7- zWa8oGvSIy4VWA-zFVdqTBetwtH!Ud0!_Jm~DeMA5{f59CiflU|Z3;L7iX;HWBj6$O z$goRFAWe>V2YKsY!zx<$fl+z4=mo~Ku(-u?s3HdK*CNfcX4>(Qfv=FFPCV8MdLix$nD zHEWcAfP=XuGrzfkp%ga?&*@;thH)55O{_BRZmu4lKF%J2Q|2t$_TBy;&Rw|}^5FL4 zr(vNH;Znz3Z)s_bp5{zSDsrNs~D-C&`clgf3H9K~VnLE#W%s4w2H*Cw$ zltc-tkPvI=P$by^YC}~KHC7m;Fc`TJRb^#t_|`P)fA}Qqc{W*x zV#_LH%c|~Y=3b3^_TBLdi`Q=QA3fRD!Ogcl$}Rem5;UuB!1-N!8QJ#`wzmn3Bpn@kx7*9GSChsfmq^og+qg zTN99wsw!4Cu?JLEfgr+5L{sJ}h5(GMosFA^Tfm6G>2v3A-nsimWK3#FWma8NPD2as z*)M7uo|RR_<`wNdcxc|jh5r8j=vUiVm~nY1z=MI|ujmEPD?A&cR7qKZX%vTDdnX4M z5BFK~=IuXsJwzhzJXKM)v zB&9p!9QQK?7(8GguOIeY9UW&k4|^Anv6E+P-*fQMvll7FmBlSx+4U_1JK&1Rjvyho z=$PhR-9=hxj2M>Pt-FLWT9Q`cq9jshjo&5vn zt^V-Ty+_dn?XpnPWgr5kBHcf36 zusSIlh{wm(+Q#15Eg)#+=FjgwNk}QLCB!?kwJW`;owNuTLtiwur&c$nS2yyf)gN#0 z@%I-QU`Qe@R5V zD@5f(XsPv*Un94n^+e#$*TY>iiLET9zjBEF0_nwH9-X; z6}YXfsjdB(8FRwpl5)!Hid%aSpFuOQuoXGAzH(XIC|~B(w??LA&0W0M#TAV%8ym6? ziWFU>LD3TxK^kb1BM!e6%mKExw!=-$$IY61=+d?46}7;&ypA7p+g}!R|6JJnb6)4m z%%;u^60TJ>-+TIe!{^)mMvQRa-mEN{Glh5%;Wo4;bom5{M3DoM-^3^Kzy9MDshu~E zj5n#U2+GPY>-fNhoBFSR{kz3o8mq7$T(AI~#J(XfE~7!1x((4+5ta_YA5NPz{`{%q z1XZTQ$6h*nijR)AR=_j<3|E3Tm}GDq2-s+lyOUa$I)u~l4P)=`??U=Ud@222wut}t zZ@4@zUczP^W&bY!m%ppn-p48N83qNNe%H#oOuSEPP%LPH()tw;1LN&VMO8mPDMiX{yttrk{sK$&nK_+&AB3mKWZOjaD6kD!%c*Hc-jh;)O0Z2VYD(}rqDY|!a?D1mTs8|Z zx>O{AUq0evhVlt2fs8tdqGU_L#)JYV?CfAiZms~|AW!eWag%2)S+#D>rmY`+_T|T4 ze7$AI?zJ1YtXcWt^hwkGJpDYJ-P{~q9Bt9&A!1vEdvIjs65tJ}DGSa8X&}{t*_Uh~ zL4G4g28^CCY5IZ{t5$uoWy4oH*YEgd^LM+~fA#h94Vz{!SnA;u;O6S-?e1l7X$3OZ zB2=`fd+y40K0)Jc9UbkQoa~*PphFO57gAixDk@6gK1D?(MFk~= zAwz)$q~aulx}b@0>>%%#Ll+O25id{Q5o4yzn!jfK z`tSCBeeUA7m#-bXb$8eK%R7#r+O&Pgyg9RcygVSTo$Oh(v0bpeP?9KLkqv}<0-h1}qk(+mqhlU@! zcmL4!+ut5Lz2?(xQ)bM@hlH^w$y#zf5@*gW)48aJyf+AQHiB=O94TNMH+N50H;?g? zr*HWDt6fJBSx=;RCtH#6tbh720a)<Yqp4SkC_XZChG-QZ|4gtPa_O8&eZk~Yw^FI6-Cg;eldsku;@1|vvfc0F&lZz2g z4qm>oVe1!@#*d{xxm4aDCTe<>3+7U(@TPOYVhUpU*4JgD;OgZLfjMGq(7X>;Zar}1 zM971%%-rz&q6dW~_j3yFro6Zu8N2V?mGP4&xVgL9+1c>s^VXo4C++Xh<71T}I}$4p zM7@!YzP-7Piyi&x8yGZk_JS1$FWkNvllm~TD7vI3wxT{fxAa$aV;YlrnB#oTl5K3Di%T0uSR-8xR8skk zqob|gNdNcOtvP=)II*}YyRn_vfxM>nf|ib=HUd;z9>2)id-nXS1@nPc2q@vc4)q5a zBDo$(byIyUq6dbfIEco+aEov-w{=*(;gid^?!{*p5*=LH^)k1ytrWp$f*o4B)5~kG zMMQ7->bn46FCR}g4+|TzMnLK@_7pU3E9;YVJ4x0fPO$0KL2qg)k{5>)e zfaISpuQfIBBjZgfyn_P^19D&)_$TVJfB9v9L2J?lgR;OL3^PHLLGTKAFOnTBoFdkf0*r0glqF$dO6%%_9G+G;_-Ti;5ge$RUlq!k-3~f&WGQ&9e;r<`2$D`_g5I zttifB8fqedT}vn!U?pVNLo~64HBu>a|k$oS~UgL`+49T`BFu*_2YOFX8;p-In< z#{@R}y~}>Bqh7m<|0f^iy((R^guWy|4xPfxj|lU(JHC1ldXK2mO&ivY@b|?r60`&D z#;ONw;~%+lj{Gm3DWNr~{|90=3AV{G8)yx921t_t8@71B8(-p9$9Q9#AQk$SA;+5T zU~3Itw70Pd^cm^yhR4e2v6E&5O`PTzG~RdAxUmzb`S_0-7c_pP-w1CvFHcu@R|h9z zYG{h#%J}Dn#cWL>D3b+b#O*G0K|eg?2z}~hFM|IaPQnT_bUw~KGH4Nj)_$8b@laf z_wxxH?dTm~>*Y_-rIUAnv%9YwU-}2Sd3gb`ENyThwHrQcxWeEeLj0ChoAjY7psPWH z2fa&$2Sms6uF*2SlrE0$Zf?GgZa&s-J~rL~#!haQZr=7D;u|MdFBcCFb8BnNDaNK` z6GHEwH5%luGU#2BB@P*^Fc>vmWmp{AAF41!afphVGLyTbgQKSlvAMpsZeHdt9%ypf z`vqFLd70Wdd-#lS^9peH3UG4vv?fx(+#1aYO=aa_^d#OO+$`6pq{zDiX5+@uEQ5tX zHptn{dE|)EK7J#;M~wCzH_>;}lreMX&t17@{LH!jVfQ@yZ zz6A;3KtNqfMHyn5$HY6uP-MU0=N|KZ2W*RG$xY~_S0vpAKfcK|5a-Nn_`${JuL;WVZ( z5|1(r27>|z4dx6gYHI)f)>}iAl!hA{TRYgJIOjWZq`ilq&*%xW-(S7{t8c&f{?N7q zhgW^JZNnEkCeK;q>Fdt~&YL3HU$|N(CFxR`*;pu<<+y7JxZ-|o4HR**_Z{IMIC{*; z3Df4U`e^IkgF8;1-E;Bk-gB3~IdXEtwy(WMjNw8_Ud%Q`=60tp<-_9Xh$ki7NTBvH zk@M6@^*+qn)Y{$E+sAJdEZ+PjtGDdfd+^NFQ@6rS+zQ=);p(~Dp*waRm_2uipRXTi zjrWseL%f^pfPf8DSV>vGw6#?5#Ui>#I0oqJJJ~sUdig}qfT7DzH#eUF5UqsImiJU5DU!4QNnDdhP;x7mbm&W53x2igpF}V>&KeL%YcPsfvhWE6 zuz>^Na16;a_ z?}Lq>*?IZ-`*?D(GRP*8A!I$!B~S<`0y-3n5b5xS>A>wdIygDIdwK?pnz?xS!Lt{F zqvNkVd3rD9ISvfB6H*?gW!;HM+;i+~(3IKUe*R!Kx|C)?CIA@vQzDV1`fET%4i)}? zh}mRjM==-}8`QZS39~^zLau=G7cZC-_v8_&e_|sa{(scHbzD{1{{R2S=iWPxiK1Yj zA}S&(DhNo2bP8f%cXxMp2X=RNfE}P9NJw{gmmTwa?z3jjhYu=uX71eI_uj{2yIp5< z&f2Trul0JzS~PoxiJp!sMqwSABu~*i%V3NoXJpJ8h6#T>}l#^>*QkZ zVq;;`*VUt+YhO1z($+?%n5J1?V=rS`^5j9{)tyNXV%?ij6~+wx+gj_nsEL?0ea{7+cz!TH4y%ySmu9 z8ba>$G&L~5l1;l^JDixbFg62FNpA1x7uZ27N!ksDJ+O_YpcV`R%(^&d#Z<3nFZ6#F zy{zr*iD=Q+b6{^b_dc#}E_M!%Hn!{q@Nl7zBt{6N2f>T#ze!^vhqr=cZY-Gx&_Q@! zV}i%Z!!Y6GTytY%2Ma5+o<<%nZf?%5HodH@%q?B)90$1d>22?1Yh_`etBoM!tQj?| z`Wxc}gg&(X&vkyPSHBK4KDDL=_@6stRqRbr%~~0oI$7EFGPg7_1D@MjTHDy!IhY%n znCVFfn*k3NV%-xpCBb}e2>eq54A-K{V%Q6SO&aV9!nC0^E$pn#Y;?NnIoP}E=ooa< z(zP(|?F{OJ`Rj8+&6b2ELuOwLNnIDiXFw05lM7z5@nZ+dG+6&tl?n--ll)YR2f z^tyL}jOyO4i;k|g3G>FcVi>e z9?ZtDmqtFc)o&Mv)-ilJaRB#4qAL^q#MaKCXHR1TBQt$d3sXDCzC(w@e@>sjXv*xl zz59EbSX#3^Ff!x7B8g93WEj;+|LrR3nix~I{$J+RG$SnQ@2 zoxAt2aCPrDdfdD<>z8laF>m#{u`}n`x%V?Px6&n2yO9y~A|Dn#ECN`fME)QXCV~KL zw6h$l{aX`q;K8h^dQ~OaNLT%nm|xtn^QUaI2?K)$q5J?^ai_UDX|(g~=N{nqgi{(h zvUBJF4|XY%qk)V}69`S*YXE8F%tf;ZOeinyA593+|J{3yS^WwZ1!$~x|F%uYO1uK0 zjBw=6&QY3-oL} zszQkGrmKEgo(Xx@aLK<$qUz5{v%rdnR7bQ4&Va~tF2W@Cad8ZK@hmqZ_2QY6V}=jm zbTH<=Fc)O|FVLC*Z1UcrwOJTN$*aAKk5xH0rcawZW9Xpa!v+mMyysw$Z$O~$i=+Dv4(adN zO;eN8ANKCtasSTEySJ_pP0>(SN10QAl$yZfkpLVHALxm%^j*}xCyq}ZJ+{A#+pzuv z#|u-Or^HVJ_neoqA%h}O&=)hqfy**5N8rG{_3l^GaHrUWM zX((|`)R&Ue2+RfA0RoEtq6djCE}f=lZtUW0KVhl{~t=* zrEMFt9@>^hJxvW!80w+7a<;Q}v^2MZD%0uCXr~{ksX#&0k$eOY5~H2|g27|h(`$9> z{0wSkQs79)K(#QoFf%j*`SddFWo2e%YiUc`#?%V(Prx%+YCswY4U!E~6qwC(5`X*K z-+r!Brx8xSjT!;lFj4J<6LqIf%ohM82bVZG*ts}4IM~_radU-TgaC(FrVEhr6qVXh zQ>rYjNHT2{oz5hsyTw8zN{fXm<^je%^&G8$L6-Km*3ND&mbO;5RNv0V%G}h()P(9I z8t`Rc`UoymG7pe}YB)CpACi&QpmB)S%z+rzpceM5CZ;CL z2xmuo_uel3`}Pqn-~goyU^O;kya|K`V3Uzx7_dn^8*r`%(fRe)6m?6!OF#3^mKJ> ztwEoLJqRPN)d|c73_z~S!GPc}a(y4&v$Zr8HvF_3{{~-y19BQ~%{jxltYWY|DDE}IXsy`>q(uy=hctN$X zEVIP193eqa*o_`Ggj3f+@(1_qGBwacLNPXookD^s%oGr4joy)W4eiOrXcXnI_AWkF zEy;gKx@sXsvE`VJdeI$^9-@7}mmQCglJ9bc4{Q<#l? z6HlK%^*S;vBEeKYS08j9DAoj(iX%p|z7838ioQ3z;?&m zd+eAoni?G?cVRTu^*Lr-p`~(D6ocRjC_9Yewr<{Z;rv;wZ|EjORd8*1zB+_EFcKQJvZB{d;A>{ZZ|@#6qds9iCZ#()-KO;gZc zYgev7dkzhYlwlH~)>Lob+SJ@|#pz&$jr~rPKXJgHECQwC;Qb)7LrwdZgyTy z_DetC8IvZ`FN$?)t3h$MXnyACk)0biI$K+}Xsjrdq)G}6ILu|+=8Z3WpTx$5M}@yS zc4VKWX-^%kj-DQ_2X=3djR>KaFC0J8&((=dw|=)SlgEt)u3x=$u1{}g#GgXF+Kgd3 zi@<}7B??TMl7lu$aMr0uZ^y-p=4{)#Vcpsl!-o%4Yty1@=MJ{LOec>Yy=CM2EgRMk z9puS|g0+#$NM8@r-#t5b96NH*-p&dNKv9wC9QA9}`kR)P=JsuyrcIq_Y;4%ItG2VV z>+ut(db_v{@*K2h&%Wo+{U1Jj%zf(Q$@rr~se;fzYybG$-(`Cp#X3KOs%zD)2Z+O# zjgin8B94&WecaraEm_i`y?U3fot<1A7B5*aXZCa(Ys)#arayc7@Ks2l_r2ST7can) z4LHj1qiO<2Ny`xqCknC%z`vQEviR`C#nFDs#0io%xqDYTYs&(nLF57&zv^-!0sJ~_w1ZAdAy~OKFcYvhZPm%17cw>3=k6X7YL`+r~$p! zp}iU&@vP6_#~wYjxeSdBdf8by_I5M|3Y!{w4)9nofA+eyD`(G|W?-NzasUX)={0CE zKJu3Kty`!`k;;_yv^!&+jvVjawUe=-KHDEal)beBG@Xedcv#=Am(9q*!={cO&$f>6 zN75NsvN&3lirfTp6EC8)#6KibF|e&ehqk6Bh6DO}P+!ysM!G$~zz+7-Mg~}S_OLK9 zbak+`HZ$(+U^`{p=s8m-O`kNrZ*ONr35`GrfgE5qGUOGKUApWnb@(?ASEs@K``TMt z80+Ym_UO?I#YE2@rp5+#w!QF|w6n5sb9OMNO-zm0|MYctaj>-lvthXbAQ8@k;55LS zKx=Z6O^)SAhRegG3_7TWYRZcz2W%qoFY;^@_)lE2T1!OVkFWpJXjNZ4Q!1Oj^k9)jpt?j)e{FJLygOs|Gps^W*5)75?` z&+xm6s$Z^_En@dq*okG1u$*b$3?r+lJkO55< zWM$pIenU@7i{n#6UcM|XD9BDt%}Gi5P+GQT-hvIwmtQ=2^75H8&{^3jNx2zmtClP{ zxO;o#>sKiWv71(|prGwqG`BG^K5^hcPHJlG>#!B`=lR{gmz9$l8V*zmFDlIQeew{k z&9OuKvocZ(3v$y^6W^8=#)Stjm_GT&xzlM0aW9@e88Ofk%_UkUP?Oda-o*Vr1gVrHjs-I5N<~E%4dn*w-N^5AR<( zZ}vm)TbU_|EV+o1#tQW$4o9i6z--f}O?esMfAPY3^mptp5MBhA&^PJ1)oWW&M998l z2VML2UbAWKHm_|iZcZ%Cm`k3!>?%?Au08XgzpbztB0IkOf6NcQfTJ!9rzPtRa~|0nnF@7uNO(B8f2 zi3x=7BiaM<8WhOI*kF(_7tWnLkr)%rdAsP2p~#31gCFvYIn#V!Jc&z;xp?*5*|R4y zQsco_bEi)_vVV6@MmnnYn^&)7r=>phzB78rV9`7HV#mD>^MCYc!tmid;nYp2QP9Ht zSu+Ek`^LpZKX~jD7Z;J0nLKXPP(7V4kPR!BFDfm|FRv`xwQ;SDi9x5ft%vk;fAQ>L zc1Ch^Wa!PS7y9*fV%p+=O_0%}2lgF5bil^K9Hxj!z&zm?b`vAr-Fvn_c;w^z;_-9; zr}rOu+t^vQZP%(t53Lo;7O?;(CB&~1N}Pzn zkq8a!Y%HJqKHj`>ow13bw!ZG__3NTyqNhxqdhqa}yZ7&%Jac;9qJ`IP-@I_{oSBI! z%Fw!X>VS6uW*|3!n)IY@T^KgpQNe5=I&2ZOyLDf=Y}u2C5B0Ql26_$$Vtaaxuo3(ffDpWH56K zF)I2#9=#7AJ@_gtX!`7F*Kb{mij5@Oh^W^wv5^yo59`Lknlkbe?|8JL0BL%JyF`ID zmdB zX1SqGH^LvNC@G?3=g@8Ltq@^N@I#Ss3z!Yb1YwO$mv(n8?>je_FI@;bt)tt0$e3YA z&m3E~dEK;`Q!ZRM6A~JfkQf^l9&-Njc}Xt_%PM2TNU%@~IK;gJrxmo}^i@;_Qb=tR zL;ck&mTup&vA?^Uk;Gc}J$mH$;>Am+PMNxM+qS>}|G*c1LH^J8@7~$p-4z5#o`MMk zSs@50As1=2wyl+$HgEMf6nx&M>r~S*LG`5Q}p%oXH6%> z>+u77FPuIR@j5g*JnVH~z^j-3o7S!Z$Wd`r`NZ^W-nb!q2|fbeaHiPnwf$9~f5@xA z2i~_=E}RcX-HnqawK`3kG=BH?&9f#?ur@ZdfV9-rKDcM+(+78hUcPwx_~D`bdw_F- zssi^yJ#nuJX5{Eap7?WsjbF)g_(9^&U^a%6C=Yo8X(&8A8&61Mt#`m{XG&~zL~tO- zhSL6Y3QmFo<>DnOsww}u$U%;azAdEuPjWf_M-!CxN7p~g>UROQYMBGQ*dj4`c@EOx z0=EFk_{ei6AhME`Dmwgi;EU%2`u0IX%0vEyko`+A8_P&F7$by!&G%|Q;iDWRd^b_` z`_*!WWTPTTLrH5O)4#BWj~F!Y=H*KXQIV&Q9k%ObE>-|BJjBLOxlse!N)FOQLNp+E z;l)|?rQa>pcOO>$)nAqV?u+CPYj_K=ijly;lPV>nUJ(S00ggZOxqUMvIB4|95vT+3 z=|g8n!wPXA&zVFGm`!v9KgR})E+7Z6ADB(bL>Y_I7JXb@u3o(G<>QBfoNRWe?yk<~ z&zvgC&3WbfY|XO8`@MD~#zt3^6qOg|zX4h$CfFMp5{zS@yZfw36Zh@d_T|I7_{cCv zE3>h~2YKHF7$n_1caEqm?V301=jd?v#`V&?ya(5>o9p)2wSIkOW@>I;W`1ra=P?96 zf8y?B|H|L@O+|5OX+cg-`kS)Cz^C`E4Rq&B92@xj8F+QoqJ2&Gj=4d~_y?1OMP;BT!>(r?OW&_0;_cYkEV`oxqthKp?hL+}qD;JWI6Ugw~sT1WTMQ6{R z8a`_HvNbEb_UxKIWfE&R9Zjduvy@gsYceMh1{EVpTIiG-gAQ@a<;1=!lB)QpRdpdTMxh*r7xFSFKw9_|b!Pix(SfcPE+$u#KQbke{+>(oG0S#NLEf zZHhlaODNYSZ0fhHUz?SZ6!7Gcdh=$EE{=h(0#nnIU-;4R2L!FI167lLW6C?qEfp#O*3xS$BAI-+LS4DZry*oENob7GxdTrjd zEjc6Qncovw)bz9z79wx&+s~i-revfFg(H}Xg_=81O=uoj!_}pbjID_E0mF(Z#z4=$ zK6h?DfBIzBQT<~(b&g{s^N{o(7 zNr+>W0JEJwaxgPBIWi<@#lm?UrzHjEWz}OQLglq+ii&?oe~+a2nB=7Rr%xXy#6`XI zeY|AO%+5G^cT_)r>Ui|)P_NA!&GmZdcIw#2(Jm$;G&Ly>fEN}Ll$;QI?C=3>1py?2 zVFR|22G3LlGt~f$_|qS~SIgv^kAD)g0YNB<$caDfqqY;LtbrPzZNc? zUY0HyoTGwRqgShA6-f4f08+Jb{xfj(e<-hNUuHG<(N*o6RX@rwgJeqg-Ah*NAHI~S zEnpiHoL2+bn0E*x@(0m@(BO^t?AlSBpLg`o0krT!b%h((UxnF_>@~oKs(%tvzUq^z z@Suit)t`t=B8D`C^Pw53buUvBPJ4g-D(LR58w2~gvsr_;7h{8EgsBP*%buMf zBnN5o1dYihES$wlYbe!!$e(H`C#}J#V8N$?q-h`0j0!_N-Fb6n`T0J*bL*xhZlszT z0=6L$fL>%MuUZY5jqlJ4qVd6Lq=k-^9Pn;q9F7<=_{FoQpFh0+@U{}Q6k7()#w{-@ zL?R@|N3)0(737o@<(C%by(ub)3klN0QRWibeCke0(1j8famt+uzOc(zz4a zsR<9SU+=7{+OcKJq3-UFe7y5BGcO!D(zR{dH47GGr6-pc<(B1VR}|)i`};1OHmM*x z?emAqveNwGqMY|{N}k-gX0Fq9h@10++c#3<C`2V#-h1QJr_;fR9+3fZ!P{N3BP zIau}Ls9AJLt(rESF>zv9e*PgZFE=|ob-ec*G~nvv;E?b-)aUYrQ3LuK>vUT*YucNl z{6%wTa=?Nz@k6BZizL5MT5{5a@d(YUS1#dnL0j z>eOjYU^hiY95nyM^UJ2sGFOcg1%V2QI9fDDJKa!ohQ=L zL|4HKW1%5Msi{lFiJSeVylm*I{(PJR5yk>dvs z)**C^q9PEw9YK0!9wIP?kau3nj$l~Gn& zoRyxMnVwQwTpdG-r>;hUY7eDU0=k;4Z^hQF#TFG^2M zfV2+?@E<*Dgt0--#JJe^Z{HN=<`m`S=4DA+8;4%zcdlM4$j-Qa@tmujwZLrXx@ZdZ zmMyw#sC)M5egE$5b?a7*9y9#jy<0^ES$A(=)#;+a2~DqGy?k3vA?b~`d zJKXoVy>GAA?3q*d?AnIjFgqia@H80kFbMbu1QOs)K(cCx<=^@7PhvI!*tk;z3eTNd zc(}XVx^X2TD*Oxv2^OXd7`m7qq5M*0SM2w`!KE_r^DA1Dqob-1tE7L3kr<>kTt5PA zJg?zbHDfl}U;j@;6!{ZmF*6$Z$P?0R&_MbmnBYQ8^IranF)D^_$?W=zMBgC~6J z&tW!%IG0?ei-dp;fAn50lNvr&%~_7tSXo*6_Dy+tX;DQ<;rp`UxZt4f zZPmKAZ>Oc+&caZC<)ZnY-;{^F^y_7)*VozZ+NHB)MR`we-2$O?Y13xxz=6*m+-Jc* zxp%LPq2bvB2MY7D-xL?TEzT#al+fTa`*xR=6ud_q7G#$eX1^`V!%@Lfx7+wZ{hxW? zPK%A%wQ-|jJ;`ba!PgxBmj*-+P+z%Z(Z|XPREH}TEp&HsG}PAC?bvDBsL>U<`TI9- zbucz)N;>159+H+#3@+0=u<(b?8vS?xB&)&CKZQ)*Cxj$xFAD3g-u%KD0k3 zB*@vyQjOIH|H}GxRhuboSh*}KIRWz#BO3iCKBMe1)wiDseGX$K6wE}cD- zlbV7G)ZW6}pj%e}7$=ThJA0-yE9=(zbE=ISw`|lYY6isJwQRDSN`<`f+nvVZT+F(Zd=-ms=LKPN9O<=V;P z$*;rC96VsAuiLmmU5xAM{QR?Y+5r%}F4|C{u+)?63W>^wDON@f@$N&J@&c#^}~m+pTDHV#l0;oI&6a zrp;O^Hff=t(5zm)*62ggdZQ0jXn;K%TasqdQTC0|gG0NqR3I^ljk|N(rd*6RpFA?q z?D*{QD%{i4G{cCKIF+uFLkARoL6jbB<+ zP>`2>>EyAFt($jKZ)2>jrAO#e8Oes$lKja^qSs{VQD`^j2!SS|;pPIKFPJ?8W&M?l zr{BM?EG*0^EiDQR3Y;^0_UI8KD$2_~fBux0lT(nFo0gKYbnaX|txg+PElWy>eRSVv zm}g(|fnB6QNVMf#8=_9NRL z7^*=Gu2wA^?X9IFkX2ib8$CQGGVJrm_l9~p9q~Jr0Uk+aaLxU-=hapMvqWOA1Z_8SSv|C;aukC zIKfFuRVJzIl8pSx95^Rkk{eEAi~_jiul@@X->aa!%FMwUULgtt(E9a~PRJ6MB@`S(x@{ivp6_0BA>B_uTJUd|b@P5yPNNfLpMypf4I$o+nvV1#AMdA(yzSb_yeh9|GaT z#hB+Hxy1|S=I3O7{rK+dhqwE7Y@Io2{N=N!zJ7ZD_0xx6e);<8YiCZf)qim1QWrHIUundp zLY-RF3&A&g+T^&X(DkdAlx@ynL6>n{@p1_@i3aF z4(-Qzvx7==Yr~#t39+Bvl&8f-`&_-WecftYHaOz>@qHh@xozY6)=d;Sm#1apMzApm zcb0Bqd^~^h@J(q^Zz8B@bQtXFeBt;}_*f4IyUoj&W+f(^*zILwWPtoaVT1yUaRm?N z;%J9Bz_FBt9o!fn5k7zVG~uiYAYp0?hRVau70i~Gl?g7zVL`Mf8V4K@z-%^_7F1tM z3YrZ_3@?W<$^JcF%N8%Vd;5A(ZWd$d#Nh+s!GXsP?!(5NhHX@@Hj_*2T<8&|3FeC= z0O~mQ67r)i{=@ZZ^PCucFs?-LIC5ZrTvR096PPVw{g{)U5)~HA7%0ilA>1n{f&qz< zHeLMFKmNvq62_%s#&HK?v&501G&f}mS1K6(Du~`(w_^F04eQd=lD~fa%=}7Aiho;H zEKwOIMjdf4YS^F|#&6gFC^o_qL5w%{w)|Y`dRc@P06eAwBCO?}?c30vGp-!1t)Ndo zGf^wb%JOnbam-vv1zNDSuPWK}C>+X$kSOCr<+E!=I}u6C(~TS5mVA1;JOW-gL3d#!Yg= z1i^^F8l>mVo)H}AA0GP3YsZ$A%NG6e$ww_%z+qO{Zq}H-) zhqj&YJVm>TQ5=D4r6VS#NMEp6!R7EL%Ehyk2|NjZ5Yw#YH@RaA)|Sei+)36^%g2|Ce&aFi#c< zWZ$msg&AqDo;)(|p*^UdM?rQL1rG9mF>~TX+;-UPNEB#`=J43~RE7oxeE$5=-pWF* z7iLBy#pIanFHErhRlEKvX8R4&{7QfE{c1VzkrD#2Xk<*(BucZnaxY_p(%kHVjI;%_ zW-#F4PDPFQPD{?szzsw?0O;2!RSb2xG!Y4w)Bm)Kf>9)gn<$MmCRG(l(JZ{1cBmMg(wMc6cSllAO7G~Rg_mv|IvJ^eqS_# zD3$!V$egnOHiV?pB~BeXN*&LhJmKcz1nXF}yG6swizLtIk0w|)fB*GIGykXG|Mt~2 z{6w^yyviaWh7;`ubnor#SXowb`}#GE%@{2-Aa@1>dGclMyzcj7HioEZaAXTn1~AD$ z?}_U!BJcKmJ7tVfuTlw|#r#EG#?Pd3N6?J0@mJ-ulI2R`@lPECm2xoxwwun_!T zCT@@~`rWmbFPO^-#aGUpT)k-ise}6xBf`?-Von~|`@XdJ*j_L214u)e4Utmgfo?7- zNeRd@GDpo(SzdhV*ddlFHUgMM)von-BsCG+kl-_?O(nW@RK#mkS8J9p%S}(CK~Vh3 zB0S$^S!No-6g8=@0A_0@9a1UUC()y?b67S6kW=SFz&OB)NxcOKb+Q4|;UoRMLHFP}ewVFPji6&~EV-5HB? zWjF!ws-%X46y?1)uUtl0!>Ht@rj+I)qqEm6UF84dVPR(awX>%?wQ0?fSM6Ig1C<$d z(^@=dW=wR%J4yDIeE#&IvZUzXj&0rAx9!?a&AO*va%|M65ATYxNQ;fmOHRy5PMkhr zY-Ct)Mq2Wwb*q)?)ludAKHLYOCQzL;Q=-f-o;?C`*clqMS61RIgv+N-W@n|-&il7) zqS21-+6fdy+9Co%UOs>OrlKexL&X$C?csf1Feknb?!&XqpD`U|(x`47EZjiOta5-c zkKV42?%hpEh-bhvwpkYVlWzBJXzH;T!FrzsL|`^ro}Ym6{C%I{<#G1p@wmv>`6#N= zlFywy1~)<*5~CZvGa#QmIIP!C|M)u>sEjm&pFWa!=2j{kQBe;%j=qzDZ6Xiv-nj!P zIBER2#F$7FYH(JVRzA7!{pnq$1l`#}Hj?3IS?pz|9zzKDM?#=AB9O>2o3s+jY8U9| zTauT1@yzK5cfCJ-djIZS#k(sh6Bo*KaaF_Abd z9NFvjYurY6=3UzAzok(tXy>GrLF1&y33Kk$s7tE)HDKKMl z>$q#+@TQ{!V67LaXX(dH1jrI#>P6M;;*szvJuT#g2eCl(%B0u-$g|i>ty+H&J z=?jbpVC$@=>T2C9Jm_U*QNin%{`+=rTR3+Xw$qR#TmS+@H%&*gAY>QLo6Dgjpkixt zGu)Xm8jlGNdG^rfmA~JkyLaHe5THm*#d-~t8Z>Gu9dA$%5CzG`4r~1AQPRZ3ouO`R z5@aZPvzLYWeeXNCJrcr>YO)-6N+W{TjxOido;6dBhulrO{j%QqcMk>4G3nz{N zv4Cw*WNn)%kLuso=lYf0oUF^|&urVUHUs!tQgmXEmo`Rjs;!(&jnm>{fI24*?q4u< z^6iV~!Eg6&UC&5KOi7B{vSFGVBcvv{YLS>*L0+ zvXT?sY^}GfSe6kJeZp%OLE+lq=G?YTYHT!8`NV;}+t#kSd;Lmsbi|q^3qxK!j|vH% zH+>os5Pdf$f?yK%Adr>>Zy_uRkqK!-FdKIOD)btG3h|C1EDZY;FdHq;oz^DgV1S=5 zKM8*6Pav1e=T6gT*Dsxqj}AYy*NgUK%qZ5cg8~!!3$)gtzND{Yw+pNi&cbLr8sRk} z!)$^m1GDYjwG;C>&^T@&!2y1;5uqsK9^JbGH3SZ11PYa_U{jfQ{7`I{$ehW`bEcSJ z_Q06bf`HJlVHHJ%cw{8U#a5It-qR{eizqGd;OHJN4sBJ#xtpMNb!wv$MOn;UW(=T6 zJ5XN$DgmG+!#2f608lU+4#i+LxI5rV&~rbc=zM-t`L3jxF;JA9kscol$=13ly@q$B z#HtB+CZHO3T84@Ux=E01d;zkkzk6@!Yus4DzyPYs%JNU2KBC-zS6-G97dvy(L=^E{ zYIwfLEcpRE0<-a3IZgwr37$>BwyBfGVX+Up==o_irNZblVLv?Ft8tLQ!rahco=cl&m293zA`E#=*Ic8zW2N{ zk`vRC5-`_f1;AD6)5mvt`B??I8R>CRt7c9Evq?N#eB`so_eKr%Y}rhax`Sf{&xV2+ zm4?JaHdDgz9t%mx=e?UYbZe(}{Ln#K`18BBmBmGuPM^Zr2c0z+4pxp|D!YYn`A@r3!m358T5=&1e{`?VMCV|#imPv3YP#f;~L@Scc zUuJ^HC~?9nvh6}~hKOO6kfRzBLPq?dd)1#;P5+@xs(x9(2A+_cXatchY3fV81T}#V z9kt6&Pg}EcxlvC&)?u!y4Z`<-XL+95t+p@&R`I2#ZSmq2oCND5g~x8=|)ATRBdWz;^+}WA3yNPPEXmoVQq3; z6olKIYnS~VKltU-hmY^xLJj3-XQ8qzE5d99$AQAc&`{1VH|Wp-p>L+&W5endU*1)Q zJ$>w9X)(07%Z>AAO7pUPZ(P$NAZ^PQlSd4D{^$WR{nXywdg|@Fpi_{kn6zJglq88Zg_! zS<|7^Hm_Q4PUHl8+w;ec0QsKXy#t?i$ZLmWPen*-PEl{()ZNY|COj0_wsqZVdrLEx zeKL^*f8E-R8q|fgLAD}fX~222XJJZu^Xg?Y4B(ZT?DyK0o*W0&hSY{?<8(zNro?j8 zR{*o&ZUA88B2wJT=YC5T&PRtpkHE8WhqMtQ+uYOy-6(F492SNMo;`I6reYBxfj6&S zjE@TM?P$j$30mW42oWG$On5LX*4~}l4(#5U5+8HGYZr7%bHygj6*;*;in>g}!2sUZ zui=AmWbdBt9W~tS?Mn0T>Bz+&7Jzi&%qNUE}uFM@bh$Y*@_u_OwsYtF&i+C3(SU>J-Sr-S?E~^Ltr+X8={#J zC{Z*-IhJjT$%nbd%;M)HSh&cayLe85s&V1gQHi}-S!r@YTyWqE5D~_r1zG9rQvfZ- z+TGNN5`djECx&pE7{IJSeFhsgY(g&36ogNqtpsdiEP>guDuD(1fc;isf$#l$MOm5b zP0I6g(T#$ZIqOrkS>ra%(P&FDSHdK+OHgXUa+u)Sc>j zxIcS%AKmDv!Jcdh`#RZsZCW1_@w&XEI3qEktROEoH27^rX+eG##ujM_(MzXJ(rwpz z%Zi0536W19-5ovD6E|!cgffFR!JMou>_?b@lz;x584;ncl4Byh*01T=sbffhKNAhG z${o_XJ0UU&mq(cE=FRLa&5s{G@TQ`SvB7v?^F{G!Ov)^^@W0{ucVITb)JYsBW20#k zoJvLv8jzEkjJ5?^Wn#hzz(&1je=dyK z>7#7~p;Wc!Kl&(2BHEB< zfmRjkHU!JAZCi;QK`>Q`VUrp72@^qnLT>UGRl{u62Bf^HNwjaPI)4s_-V)C_dT@Ua z|7VZT*Z4ns3~TYrr}ucuZ&|k%TMj4zjIyw8uE@_zi;6Pn+*tx(ZCYdb02}k=t|H z-o3#T#P9xHNO&9xOAGUJ(^J80J{Qgzchnf`(dXGc$)0WFhBeSjSWUBT2yux$+p5J2 z1ZJ}|&~vx9JqGl{u$!*?)8BqI zMpBT4P$R4^5sZn|uTUSJ4a|1u`ZaqiOJ*Dz()6TQ;*ii3&mIy3+>9_ILO0r^enTY% z=o!gX5D!O8PcgWH4x&eRB56qL)<$rXGnftHE+HnGL%X2qCXXG1#|?@nFdJGt9Q)`+ zVWh{hKYrA3Om2=I+)HfFp`QK1g8Y4MT$ciUaE7O%5>Z5$_>2VJi=VaR*SUXRH;oP^ zx;+SN_o2K5VU2F|>eBmiZGzC* z=n6||xi!buw7JBq4C?Fdee)XQg1G3G zdOBKdT6?-UojZO6ZV&;wb9}ty_*7&@VMA z0@YPaSZGd4@`4%D8`Y_eZWPLh8Uesi`r|=~6+I!^80u7(=QJ;4p8W!tt*Y-WFb{YP zW+S2?`09brow+lnu2{SP2z2S}DNy?HL;H>OdjQz5XG3vGUoa^E=jbs7KgRqbfqw#k z4d#v+#CL#q9P$NbD=En5B3#(som)|ig4@At&|zY-u#d}KGxi{z6L z?8c~|*YKVOuzmUT5iRS1Jv$>qgD@Y>O-;t0jc7UgoL5EEL`<5SHC)IJi99k^WoV*Yicc&xT`2NV$4%) z0nCIHma2f?s0_0)vv>$-0eBF57JD|V*dPO+`#$x)eTyF9Es*VCwn?K$aq=l8ROkE} zm1bZzz?C4xh}?zf7gQVe_@FEx5NsQX@nc2=yzqVZwxXyYH#aBa>iKi!r6t4;VyQ__ zPT0PF4S=nydK+}3?OQej3PQC>M{LNBi6=wB+JS6br*hp{`{3hA3Ntlfb zHw1xss!Ee;g62mbtNx@~`bR(cOP*JK7a8)AD*Wl3h1Ub?0CN*m!<{HK$B!Hi^nZbX zW>>{_8#w~cCa5YF3Kj=mDhEY>A>{beS&5a3pMP5_o}eb6UTmDlj~R^=BZ#Yh4{e@^ zUAAaX(SYLT@?wa^@ZWuxzwTd2R4pWZRPCzz*MFK8#h@v`y0j7(B8>Q=*!CRSx0e72 z$O1q+Qhi1R{_rnyg)R2How9CejFS?1dqbpTu-;&Cl4RW z&dPlErV^syV?}v!R+gToriFI*ehzk1#*N0p{LAN$FYn*A)7NvivcxH#t?siM*E(YK zqS|VZyX*ZsxAHR6&mTV6T}{=ZTUS=XnPW$LU%K$IqU>#D`HuB#FrSEx41ZHv%nyNy zWMu?q>*s+XTwGk#%9Tr1RGK!Z{Szy;EG&isCsSi_$Io|eTnCNDUiEVU~2tki%#@tG>pyOC{X1$EG@ws^eo%N~1hX8E0W~L>%IjGpm@^gs%;B)OViqU2Y z^$ojeVa&FBO#R64hAX=h}B*G58kD0G~ucDJ#f z{rM{FENb8zg^6;@<~VVne|%qAR#9AFZJ>{viKnac#nUHpvoj`) z9JXQklFYQ^lLz;6Y9^Xl{mz;xk>MG!(UV3D!@kbb)hRkCpdd9F#VD9<#e(^S@cmWY zEF;a>!O@IwE6TuZtbr_sw4_l_{axF)zOSqRvx((`78Z?A_vfDo#7CDw%^lgl4~LG; z>sEu=Xj{&_0J9N{0*M1=qjSZKpkDyz!u*U*2cgx$@1T+7FUl7n*+6$@#zy=1?1ovw z4MAVK>)Mq|{hmBPH~RSA9l^8FWx#AaO=|yKi>z=6A}fAQ&dfoqR!EchbrEAzDWgVF zwO3Y@gMSD;!K{goeEs$Po3!{?kTyJ

{XmF^)FmrQD!Cx=|VjvKLJ#?ZC#C=?@m9 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∨Tivqmj?sg6jUPKVbm&ym*1b(z_Kt&I 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
  • nJ)-V+!HGn8NWDz#vE(%TD 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

    {BPaM#YA5ie{* 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

    1$9jnTPk?_D4|h*X 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

    d4u;y@pO(zTOz( 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 RF8pQ8Px~ATq(At<{{u18&KCdx diff --git a/examples/qwin-gui/game-gui/Res/BTN_UP.bmp b/examples/qwin-gui/game-gui/Res/BTN_UP.bmp deleted file mode 100644 index 1b023ae02a567379cfbb0ab18b2d33c87cdcb6de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14132 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 qoH&mj`b~zo%aQSUaQ1sJ*j>< zga82o1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk f1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z)#=;rh*Mj diff --git a/examples/qwin-gui/game-gui/Res/LED_OFF.bmp b/examples/qwin-gui/game-gui/Res/LED_OFF.bmp deleted file mode 100644 index a93ebd571bc859fe97a8dee3fa0f3cc85bf34774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmZ8f+m6yu6g|c#-+VO25AX~8025<;@Jl9|_yHPY9Jx%PP)e^*+5#=~!n6Yvh8Y<~ zpal&&j82RX>aV!kDw%k4&dy2JUhAyA+J{eX-z3R;fO;S27S3Iq8{`gZx?bEPBtHMv z^Sx*LZ{BA2vs8{sE*YUJyngxW$>T@ls6Sk-kXfR&16rKZ@nL+Uj}d8T#tQnRX*k=@5NY-0#=t5$8i(hHBIo)ioxs@LlFOI0(0;kkRDTtHPhh|UKyC{ z_Tu?=Gwi$ovuxxdNNkzSCq6;l`D_~|smV&U!cj?PJ04~*+XiVgbWxD#0*$HD+2K=F zRIAe=hSAZ~W*RAAgpM@KwrR9lBnU>n=c^43;o)Jv%IjM5(CzVTg={ak)9KVZ^z5!} q8m418!7we*gM;xxI+O<@xOFbTUExxL(bsr-gh5zxN*kKdx#3 diff --git a/examples/qwin-gui/game-gui/Res/LED_ON.bmp b/examples/qwin-gui/game-gui/Res/LED_ON.bmp deleted file mode 100644 index 50036a29f120249d100c7526a77f3b19895204d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmZ8fO=y!r5Zzk;>K}qwYgH7)pQ2EqCXrT42`Gw{D2R9{R8w-$mO=y%z354b7psTf zyr>6Jdhn!2Ay`mIF1ELt^dw@@OOuo@yZg=ab+!?4+4-2^&AfRt`=zh!Y&Ck4{2r&Z z(K=}@ri0&b^81ZhwdT3=;^lauko`J$vs}qkD%Z;8;e~I*pJp#kJu#0fixbuAP!yea zF6I1L=Q7sis?}_Zh4<< zVgv$4nw0#5F`ZgiN=GqStxIS?&K9i;Qj;R)wqn%%AC@2|u@um*7@Gx7h6&aM&QSMP z3$dQSNu3NfYBRQ^LoHm58EMWyd4V%%S;IIx6T{9zKekA6_MG>WC_dc!5-2!aT)ocR}0sX9-aDEUtqVLCMT-$bi=L^o7No$9IQ@}1& z&jILki`-~5%ybmp11s_g4?6P9HYVri%!2qY-hJ?H26&}+M&!M-&r3zKWP{{XwN0@(ln diff --git a/examples/qwin-gui/game-gui/Res/qp.ico b/examples/qwin-gui/game-gui/Res/qp.ico deleted file mode 100644 index 032e1307b5a64fadaea08a03d24c25171a25ee32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10134 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 ZC2(V((^t25{9Yk&%3Om4B=CO;`~m9RnhgK| diff --git a/examples/qwin-gui/game-gui/Res/seg0.bmp b/examples/qwin-gui/game-gui/Res/seg0.bmp deleted file mode 100644 index aff47d19749ca9e086f8841136c7e3cc63f26e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 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 diff --git a/examples/qwin-gui/game-gui/Res/seg1.bmp b/examples/qwin-gui/game-gui/Res/seg1.bmp deleted file mode 100644 index 168b85ba8dd770412ac24cf349925d02c8dea8c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 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 H_w@cBzF!+7 diff --git a/examples/qwin-gui/game-gui/Res/seg3.bmp b/examples/qwin-gui/game-gui/Res/seg3.bmp deleted file mode 100644 index b5212c2b73b1be8b13faf8343aeffc1f24d6ecb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 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 diff --git a/examples/qwin-gui/game-gui/Res/seg6.bmp b/examples/qwin-gui/game-gui/Res/seg6.bmp deleted file mode 100644 index 78988eb3c83899a15edb18a8e958f6d45567510c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 zcma)Adr;KZ6&Bq0gI)H$AcFV^F`}KRCN^4Q95s#BiCCS+m_Z~FCyJJgXo0E?Zk51_ zZ5l+KX#a>-5zq$B1bjq|Le*GNXUw!!0pEyLkOXCS*@b@Ro@HHFQSaQn+}H2B=XuY$ zOqwyl*iV#K(I((G0KeDq3+rb?+pnL(zb*#;#$vMRBJ>8mDRX(|>C|3rAwDGm#@T!MMaxsQh6|) zBSs|Fo;!;rug~Y{z;*(}@EHZ?Vs)*{-2PO-=PFbi7`Y7dpwwDFOB|^mu6U*6rIXR%B&o<=ks(!tkjQzzJA7bLMPL&L7a} z=Msw2QA8!$;_}dWbZbedr4g3-$eG z)@)$HKA8sm#jw8Nn#pLEN@Sx(j%scFkw_Isa{Ksk`>SKdYLr^s-ei-0O_BXuEjFlc z!i0&iWNhaB+%`8i4}bX;I9gonpxd|a^uh!I)83x0RqLW`1Hi1^Vn@prR|M!EH}02i zj|VIVW8z{N{d39#qN8H!uGRw+swZB2zIG8!=FNQ{t6)= zqqUk4aV!y9{gTB?s!vugU6!%!i@&i?F>D`L{%Pz%4>{h_rT*KPkrgueyYJ59O~?YB z&VogY(tr5j5@zs8w=9GI(j;yV7zy?q`S#lYh1^jplro8I!Gct*x?Cr zlPE%=f@dN$x{-;a9zLW*k^PriA&Lp(C&IPa<;m-k)trPABqqx36~ac+8n^7j*#ch z9XpY2+RS!9iSY5Fm@p3rtsuVuP%K8#Asrp8tW?S=8zD@}LjB00%=Vh0cpWaqof&|F zLv@H(L-mOhDg|XDf_F~v086TWc7ZYD7EKi{@7Gax+JEulMWG#_fygJAAo#hMxb0`n z64{6k*CyE~KP4I(>IcTe8FYxmRs?RLcOb)}oWLx;SC zv>%v6r=gov12PBuGe`xdMx`D5+So^rCs#2jkeCQA`8L;x3%9P~!Wo2cU zd1`@hFpvLoEdD6H7a)eP4M+)ootx{xHoRDouV(!|tMP6lhByKRw1a*Kgo{WUJdedw zu4MP_O-25cI{*$$(5X?Xkv@SiJi`x)S3Fb?DUe~2Wl;%4d$wUn9c%3_*Rr007|3kN zkSgS#G&8BgLr+?ehEE6wgT4#4VDTUOzWVI5zXph8-kDT9(1r{icJ>TCrV#QdS3?93 z5Z4DXB{*Im9vT76xVU(x6D>&9s5CLru_yWeLS&*;1mAr&E;sQ7ogyD#SY%4@4gpIJ n0)NqK@mx2qS-rZxp#kFRgSscvyayil-rRYKuO!k7-E99qQ@Iz< diff --git a/examples/qwin-gui/game-gui/Res/seg7.bmp b/examples/qwin-gui/game-gui/Res/seg7.bmp deleted file mode 100644 index 8e7398846b64f25603a756dc9b08699b0947939c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 zcmb`Ldr(wW9LGWS{bV0^A0UG0l8-cJDw`2SbH+zC&PdrGr3vYzqa%bP8tXG5Y8=Dz zg=P9*@(3-o%q)DBjuSTeSN_2!s7-=sD8tI`-o4BAJ?AW!mDgT3&)hwnd+xcP`}>{q zJHOxWFnd9cC4rWysK?zR;_|X4hmbf=x zy?Tu@gJ23l0qtKJ8scE4jT|*PJu}&8&dtpQ1WJc!2~wuV<4JX@50!P%qBo^6IjTFyS#S|KiFVG^8#n$U%ut_@xGgFwlE|dA z2oqS&%oz>Ijg42BoTyQlobD3$6Em?)W+JLusrl*D&p<(Uii8aiflIfSNn>KsnUI{7 zu9uy2sFa$cb;khV`CynXI)hhyS|O3yyNF~yIjarkB$p`c0KCK%1S9r z1_TY(ZnY2-b=p$k+duiZ{Bb6kgsQ4)DNIW1Gf{lPVM~!E%Ga+a-k9i43!Bdq$4^LM zVnv9kbS8=J7NWaCrd+XNC1bKp#F!T^UXsG>olGVwSuBUmp;D;dczqF=uuo=1_>0@- zmYY@!CzmN6f9o+d#Yf@{fN8fmv}$cm&Mdei02!0j9UUDL#!tjX6JH#(k>VJMey7bT zK81@g>XWmxX9Rd2Dn~QnSYCLZ@0 zFJEp%5LBzQLyeEwzpLW&a1Y{fm=D65h`YP~=XHl2@!Amc-GKwJ0q4w}4+yLs`4Tb* zmNm7t-pLr1VbB=|z7n$sZ_S@KKNKSQ5{YmK^E4zqc+lZ;WyNPs2AyHbUwUz>#bg~`Dg?EG1B?cfYfRSt`}ajA;u1u~tU`X#Hx7J}^?*sokmP|}G;=T+ zO{3D%o12>nlR9KHfW-8!UcCmPP^-}o1r#~75y7&6f)8E0MzT;gli2U9QCz$Mu>kQU z29rt%C(nj~h7AZw&YV35CbJ?m*wSy?w#{izk&TeYWQyvefeU9MwNm@T$&=AcxKZ4e zmzN{9#sp#jNAgcXqk*2oBtyIEs;X!v3?H{UckUdXsp;EgVj4!Hr`?&9DF3WtS2UB! zdGO$uh}W^?1O!4xGf9+3HnM5c=4d9H&u?mLV=~P~C~QaICR&?8Ch9xwPWbb}f+8^4 za-)Hx4eB!u4TGArD7kCwGf4ZvBytiUVWI&^lnT{5OY$g_#f?ZN=J7NQ&jcLX5P1Sj zJp!b1f{FMzZ_Ye0S$ad@>;Tf%1{sh8WVyzPvh{1=pn*IApT-4aCN*b=1;U}dJZm;k zVqu4xhn<}`dt#%dr;qN3ioV6_E9GhgS$3%uDve5)n2_iio8|5Dg2~(nOYggVK77|= zvJARX+dnK_U%cVi(POnWH8s^WwY6AMa-oe>^Z4=a-EQ}huaAJq^M2y&Q0V4|?zq&d z{>elB(!9F5I#I8F4JMe^`)Kv5HTT-@;VBG>_uCT@SnjtXMKy$7_hW3sONP7YK40L|4fIim3mf+St!SS*AJ))cnfx`kVh$CHtf z$>c;0QFR(!T59@lGy{ZQYyyeeLl=L5=ymGHQ~UQ<@_|6kjF}ph2D^h|iL}@+$@*lN g*48asnp;|cC87*l*qE-aF8rfu(!@zfXdRsMKRwMp=Kufz diff --git a/examples/qwin-gui/game-gui/Res/seg8.bmp b/examples/qwin-gui/game-gui/Res/seg8.bmp deleted file mode 100644 index 0de55b3d8da7a405ad02a94fedbcd359e794aec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4926 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 AWdHyG diff --git a/examples/qwin-gui/game-gui/Resource.rc b/examples/qwin-gui/game-gui/Resource.rc deleted file mode 100644 index ab8a55c491ab3522897113ee2eef5b0d673d4c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8826 zcmd^^YfmFL6o${|O8pOM_^@3y<&q18ej^FVMhzh)VHYGMv|Sb!i3LPJv{HY2+vm08 z&Lo-41VT}&%9`=`jD7t2Ts@w@{#>&)%h{e?+9$iS8yj+++dZ`R(1!M4AMJ`(-F~3t z?7}|VHP;>Vd+IZ2chnm9z|$w5bF{?m(r)RqYTw#7%(CX{6{y#|y`uM->zkh%ziMAB z?|N(GitBgo#)ZFchvzWAFf3mQ=t7;d z7IK-C@i|huv9GNE9_dI916F;+z0IoYtW)yXgZvk4%YzvToyk{jpGi&2N7YmZTJlKS4T^qGJ*!@g`8iI@-K#;N6O~ zJ?FJ`o|T7`e>JvEyF*KUegtLR`Lw@RtYX`)UA7WW;;L+Z%m`(#1})|9U1&|maR62E z#=qHv)^PlrM4273yhcUuo6LR$O}&q~{JRg1Ymc!#Vn=U`D)hY=e)01CJqOL8I3}c% zee+9z*08c6Fz%oZ|M4p1B@AlbCH zc~JWNqrIf?X|3YbM!I`W$_3kku1j`Mq%MQkBMw-!i)lJNDI3(7eL(THr9OH4g}tM) zp5_oH#ddMpgj0b__O*?56_}yoq!D<}yZ#QV4=b*-hR~jGjTMKZ>NK;#YCWooRiA_< z&&uTo2k;3i6_$uvfL=ou_mmqKHw&~S^L;G1>&7;mmwZ5OkzFf8tDmIWa}wKhSW6(S z&@PYerDx*ZNW?2CybRv0f6#8m(3YQsHrTSFj-uHz znOev;xXTxxZhdK(yd3B8HCey(DNOQ)MKH+{Tkr_-k@fhfUxzxcjJ(emk*lz5k0QbI zH0KdX<`E`goL^^>i=?T$bmk*R>6u!ag=cmx(Rq%(EgR_LSMc1T4`CR`F(C8lYgHL=l3UbX3`cy9Y%G4q8O=TU^b%M! z$802i|1vr6bbApbevUK@@vJsIcc3hWAwI`ESki1nmLKh11HQC6ZmrSIqMM=_pEc5W z`ge;U8R9_~nHbhnyyc}ZtY@OoNk)2EToN0ZD0J45UKU4D%tWE{jr6iOic%(uat4OQ zyu{mPITJ -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "game.hpp" -#include "bsp.hpp" - -#include "qwin_gui.h" // QWIN GUI -#include "resource.h" // GUI resource IDs generated by the resource editor - -#include "safe_std.h" // portable "safe" / facilities - -#ifdef Q_SPY - #define WIN32_LEAN_AND_MEAN - #include // Win32 API for multithreading - #include // for Windows network facilities -#endif - -//============================================================================ -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE - -// local variables ----------------------------------------------------------- -static HINSTANCE l_hInst; // this application instance -static HWND l_hWnd; // main window handle -static LPSTR l_cmdLine; // the command line string - -static GraphicDisplay l_lcd; // LCD display on EFM32-SLSTK3401A -static SegmentDisplay l_userLED0; // USER LED0 on EFM32-SLSTK3401A -static SegmentDisplay l_userLED1; // USER LED1 on EFM32-SLSTK3401A -static SegmentDisplay l_scoreBoard; // segment display for the score -static OwnerDrawnButton l_userBtn0; // USER Button0 on EFM32-SLSTK3401A -static OwnerDrawnButton l_userBtn1; // USER Button1 on EFM32-SLSTK3401A - -// (R,G,B) colors for the LCD display -static BYTE const c_onColor[3] = { 0x07U, 0x07U, 0x07U }; // dark grey -static BYTE const c_offColor[3] = { 0xA0U, 0xA0U, 0xA0U }; // light grey - -// LCD geometry and frame buffer -static uint32_t l_fb[BSP::SCREEN_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -// the walls buffer -static uint32_t l_walls[GAME_TUNNEL_HEIGHT + 1][BSP::SCREEN_WIDTH / 32U]; - -static unsigned l_rnd; // random seed - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h); -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h); -static void playerTrigger(void); - -#ifdef Q_SPY - enum QSUserRecords { - PLAYER_TRIGGER = QP::QS_USER, - COMMAND_STAT - }; - static SOCKET l_sock = INVALID_SOCKET; - - // QS source IDs - static QP::QSpyId const l_clock_tick = { 0U }; - static QP::QSpyId const l_mouse = { 0U }; -#endif - -} // unnamed namespace - -//============================================================================ -extern "C" { - -Q_NORETURN Q_onError(char const* const module, int_t const loc) { - QP::QF::stop(); // stop ticking - QS_ASSERTION(module, loc, 10000U); // report assertion to QS - - char message[80]; - SNPRINTF_S(message, Q_DIM(message) - 1, - "Assertion failed in module %s location %d", module, loc); - MessageBox(l_hWnd, message, "!!! ASSERTION !!!", - MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); - PostQuitMessage(-1); -} - -// Local functions ----------------------------------------------------------- -static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, - WPARAM wParam, LPARAM lParam); - -} // extern "C" - -//============================================================================ -// thread function for running the application main() -static DWORD WINAPI appThread(LPVOID par) { - (void)par; // unused parameter - return main_gui(); // run the QF application -} - -//============================================================================ -namespace BSP { - -//............................................................................ -void init() { - if (!QS_INIT(l_cmdLine)) { // QS initialization failed? - MessageBox(l_hWnd, - "Cannot connect to QSPY via TCP/IP\n" - "Please make sure that 'qspy -t' is running", - "QS_INIT() Error", - MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); - } - QS_OBJ_DICTIONARY(&l_clock_tick); // must be called *after* QF::init() - QS_USR_DICTIONARY(PLAYER_TRIGGER); - QS_USR_DICTIONARY(COMMAND_STAT); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); - QS_GLB_FILTER(-QP::QS_QF_TICK); -} -//............................................................................ -void terminate(std::int16_t result) { -#ifdef Q_SPY - if (l_sock != INVALID_SOCKET) { - closesocket(l_sock); - l_sock = INVALID_SOCKET; - } -#endif - QP::QF::stop(); // stop the main QF application and the ticker thread - - // cleanup all QWIN resources... - OwnerDrawnButton_xtor(&l_userBtn0); // cleanup the l_userBtn0 resources - OwnerDrawnButton_xtor(&l_userBtn1); // cleanup the l_userBtn1 resources - SegmentDisplay_xtor(&l_userLED0); // cleanup the l_userLED0 resources - SegmentDisplay_xtor(&l_userLED1); // cleanup the l_userLED1 resources - SegmentDisplay_xtor(&l_scoreBoard); // cleanup the scoreBoard resources - GraphicDisplay_xtor(&l_lcd); // cleanup the l_lcd resources - - // end the main dialog - EndDialog(l_hWnd, result); -} -//............................................................................ -void updateScreen(void) { - UINT x, y; - - // turn LED1 on - SegmentDisplay_setSegment(&l_userLED1, 0U, 1U); - - // map the LCD pixels to the GraphicDisplay pixels... - for (y = 0; y < SCREEN_HEIGHT; ++y) { - for (x = 0; x < SCREEN_WIDTH; ++x) { - uint32_t bits = l_fb[y][x >> 5]; - if ((bits & (1U << (x & 0x1FU))) != 0U) { - GraphicDisplay_setPixel(&l_lcd, x, y, c_onColor); - } - else { - GraphicDisplay_clearPixel(&l_lcd, x, y); - } - } - } - - GraphicDisplay_redraw(&l_lcd); // redraw the updated display - - // turn LED1 off - SegmentDisplay_setSegment(&l_userLED1, 0U, 0U); -} -//............................................................................ -void clearFB() { - uint_fast8_t y; - for (y = 0U; y < SCREEN_HEIGHT; ++y) { - l_fb[y][0] = 0U; - l_fb[y][1] = 0U; - l_fb[y][2] = 0U; - l_fb[y][3] = 0U; - } -} -//............................................................................ -void clearWalls() { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - l_walls[y][0] = 0U; - l_walls[y][1] = 0U; - l_walls[y][2] = 0U; - l_walls[y][3] = 0U; - } -} -//............................................................................ -bool isThrottle(void) { // is the throttle button depressed? - return OwnerDrawnButton_isDepressed(&l_userBtn1) != 0; -} -//............................................................................ -void paintString(uint8_t x, uint8_t y, char const *str) { - static uint8_t const font5x7[95][7] = { - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U }, // - { 0x04U, 0x04U, 0x04U, 0x04U, 0x00U, 0x00U, 0x04U }, // ! - { 0x0AU, 0x0AU, 0x0AU, 0x00U, 0x00U, 0x00U, 0x00U }, // " - { 0x0AU, 0x0AU, 0x1FU, 0x0AU, 0x1FU, 0x0AU, 0x0AU }, // # - { 0x04U, 0x1EU, 0x05U, 0x0EU, 0x14U, 0x0FU, 0x04U }, // $ - { 0x03U, 0x13U, 0x08U, 0x04U, 0x02U, 0x19U, 0x18U }, // % - { 0x06U, 0x09U, 0x05U, 0x02U, 0x15U, 0x09U, 0x16U }, // & - { 0x06U, 0x04U, 0x02U, 0x00U, 0x00U, 0x00U, 0x00U }, // ' - { 0x08U, 0x04U, 0x02U, 0x02U, 0x02U, 0x04U, 0x08U }, // ( - { 0x02U, 0x04U, 0x08U, 0x08U, 0x08U, 0x04U, 0x02U }, // ) - { 0x00U, 0x04U, 0x15U, 0x0EU, 0x15U, 0x04U, 0x00U }, // * - { 0x00U, 0x04U, 0x04U, 0x1FU, 0x04U, 0x04U, 0x00U }, // + - { 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x04U, 0x02U }, // , - { 0x00U, 0x00U, 0x00U, 0x1FU, 0x00U, 0x00U, 0x00U }, // - - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x06U, 0x06U }, // . - { 0x00U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x00U }, // / - { 0x0EU, 0x11U, 0x19U, 0x15U, 0x13U, 0x11U, 0x0EU }, // 0 - { 0x04U, 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // 1 - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x02U, 0x1FU }, // 2 - { 0x1FU, 0x08U, 0x04U, 0x08U, 0x10U, 0x11U, 0x0EU }, // 3 - { 0x08U, 0x0CU, 0x0AU, 0x09U, 0x1FU, 0x08U, 0x08U }, // 4 - { 0x1FU, 0x01U, 0x0FU, 0x10U, 0x10U, 0x11U, 0x0EU }, // 5 - { 0x0CU, 0x02U, 0x01U, 0x0FU, 0x11U, 0x11U, 0x0EU }, // 6 - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x02U, 0x02U }, // 7 - { 0x0EU, 0x11U, 0x11U, 0x0EU, 0x11U, 0x11U, 0x0EU }, // 8 - { 0x0EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x08U, 0x06U }, // 9 - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x06U, 0x00U }, // : - { 0x00U, 0x06U, 0x06U, 0x00U, 0x06U, 0x04U, 0x02U }, // ; - { 0x08U, 0x04U, 0x02U, 0x01U, 0x02U, 0x04U, 0x08U }, // < - { 0x00U, 0x00U, 0x1FU, 0x00U, 0x1FU, 0x00U, 0x00U }, // = - { 0x02U, 0x04U, 0x08U, 0x10U, 0x08U, 0x04U, 0x02U }, // > - { 0x0EU, 0x11U, 0x10U, 0x08U, 0x04U, 0x00U, 0x04U }, // ? - { 0x0EU, 0x11U, 0x10U, 0x16U, 0x15U, 0x15U, 0x0EU }, // @ - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U }, // A - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x11U, 0x11U, 0x0FU }, // B - { 0x0EU, 0x11U, 0x01U, 0x01U, 0x01U, 0x11U, 0x0EU }, // C - { 0x07U, 0x09U, 0x11U, 0x11U, 0x11U, 0x09U, 0x07U }, // D - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x1FU }, // E - { 0x1FU, 0x01U, 0x01U, 0x0FU, 0x01U, 0x01U, 0x01U }, // F - { 0x0EU, 0x11U, 0x01U, 0x1DU, 0x11U, 0x11U, 0x1EU }, // G - { 0x11U, 0x11U, 0x11U, 0x1FU, 0x11U, 0x11U, 0x11U }, // H - { 0x0EU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // I - { 0x1CU, 0x08U, 0x08U, 0x08U, 0x08U, 0x09U, 0x06U }, // J - { 0x11U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U, 0x11U }, // K - { 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x01U, 0x1FU }, // L - { 0x11U, 0x1BU, 0x15U, 0x15U, 0x11U, 0x11U, 0x11U }, // M - { 0x11U, 0x11U, 0x13U, 0x15U, 0x19U, 0x11U, 0x11U }, // N - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // O - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x01U, 0x01U, 0x01U }, // P - { 0x0EU, 0x11U, 0x11U, 0x11U, 0x15U, 0x09U, 0x16U }, // Q - { 0x0FU, 0x11U, 0x11U, 0x0FU, 0x05U, 0x09U, 0x11U }, // R - { 0x1EU, 0x01U, 0x01U, 0x0EU, 0x10U, 0x10U, 0x0FU }, // S - { 0x1FU, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // T - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0EU }, // U - { 0x11U, 0x11U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // V - { 0x11U, 0x11U, 0x11U, 0x15U, 0x15U, 0x15U, 0x0AU }, // W - { 0x11U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U, 0x11U }, // X - { 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U, 0x04U, 0x04U }, // Y - { 0x1FU, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U, 0x1FU }, // Z - { 0x0EU, 0x02U, 0x02U, 0x02U, 0x02U, 0x02U, 0x0EU }, // [ - { 0x00U, 0x01U, 0x02U, 0x04U, 0x08U, 0x10U, 0x00U }, // '\' - { 0x0EU, 0x08U, 0x08U, 0x08U, 0x08U, 0x08U, 0x0EU }, // ] - { 0x04U, 0x0AU, 0x11U, 0x00U, 0x00U, 0x00U, 0x00U }, // ^ - { 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x1FU }, // _ - { 0x02U, 0x04U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ` - { 0x00U, 0x00U, 0x0EU, 0x10U, 0x1EU, 0x11U, 0x1EU }, // a - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x0FU }, // b - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x01U, 0x11U, 0x0EU }, // c - { 0x10U, 0x10U, 0x16U, 0x19U, 0x11U, 0x11U, 0x1EU }, // d - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x1FU, 0x01U, 0x0EU }, // e - { 0x0CU, 0x12U, 0x02U, 0x07U, 0x02U, 0x02U, 0x02U }, // f - { 0x00U, 0x1EU, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // g - { 0x01U, 0x01U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // h - { 0x04U, 0x00U, 0x06U, 0x04U, 0x04U, 0x04U, 0x0EU }, // i - { 0x08U, 0x00U, 0x0CU, 0x08U, 0x08U, 0x09U, 0x06U }, // j - { 0x01U, 0x01U, 0x09U, 0x05U, 0x03U, 0x05U, 0x09U }, // k - { 0x06U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x0EU }, // l - { 0x00U, 0x00U, 0x0BU, 0x15U, 0x15U, 0x11U, 0x11U }, // m - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x11U, 0x11U, 0x11U }, // n - { 0x00U, 0x00U, 0x0EU, 0x11U, 0x11U, 0x11U, 0x0EU }, // o - { 0x00U, 0x00U, 0x0FU, 0x11U, 0x0FU, 0x01U, 0x01U }, // p - { 0x00U, 0x00U, 0x16U, 0x19U, 0x1EU, 0x10U, 0x10U }, // q - { 0x00U, 0x00U, 0x0DU, 0x13U, 0x01U, 0x01U, 0x01U }, // r - { 0x00U, 0x00U, 0x0EU, 0x01U, 0x0EU, 0x10U, 0x0FU }, // s - { 0x02U, 0x02U, 0x07U, 0x02U, 0x02U, 0x12U, 0x0CU }, // t - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x19U, 0x16U }, // u - { 0x00U, 0x00U, 0x11U, 0x11U, 0x11U, 0x0AU, 0x04U }, // v - { 0x00U, 0x00U, 0x11U, 0x11U, 0x15U, 0x15U, 0x0AU }, // w - { 0x00U, 0x00U, 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U }, // x - { 0x00U, 0x00U, 0x11U, 0x11U, 0x1EU, 0x10U, 0x0EU }, // y - { 0x00U, 0x00U, 0x1FU, 0x08U, 0x04U, 0x02U, 0x1FU }, // z - { 0x08U, 0x04U, 0x04U, 0x02U, 0x04U, 0x04U, 0x08U }, // { - { 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U, 0x04U }, // | - { 0x02U, 0x04U, 0x04U, 0x08U, 0x04U, 0x04U, 0x02U }, // } - { 0x02U, 0x15U, 0x08U, 0x00U, 0x00U, 0x00U, 0x00U }, // ~ - }; - - for (; *str != '\0'; ++str, x += 6) { - uint8_t const *ch = &font5x7[*str - ' '][0]; - paintBitsClear(x, y, ch, 7); - } -} - -//============================================================================ -typedef struct { // the auxiliary structure to hold const bitmaps - uint8_t const *bits; // the bits in the bitmap - uint8_t height; // the height of the bitmap -} Bitmap; - -// bitmap of the Ship: -// -// x.... -// xxx.. -// xxxxx -// -static uint8_t const ship_bits[] = { - 0x01U, 0x07U, 0x1FU -}; - -// bitmap of the Missile: -// -// xxxx -// -static uint8_t const missile_bits[] = { - 0x0FU -}; - -// bitmap of the Mine type-1: -// -// .x. -// xxx -// .x. -// -static uint8_t const mine1_bits[] = { - 0x02U, 0x07U, 0x02U -}; - -// bitmap of the Mine type-2: -// -// x..x -// .xx. -// .xx. -// x..x -// -static uint8_t const mine2_bits[] = { - 0x09U, 0x06U, 0x06U, 0x09U -}; - -// Mine type-2 is nastier than Mine type-1. The type-2 mine can -// hit the Ship with any of its "tentacles". However, it can be -// destroyed by the Missile only by hitting its center, defined as -// the following bitmap: -// -// .... -// .xx. -// .xx. -// -static uint8_t const mine2_missile_bits[] = { - 0x00U, 0x06U, 0x06U -}; - -// -// The bitmap of the explosion stage 0: -// -// ....... -// ...x... -// ..x.x.. -// ...x... -// -static uint8_t const explosion0_bits[] = { - 0x00U, 0x08U, 0x14U, 0x08U -}; - -// -// The bitmap of the explosion stage 1: -// -// ....... -// ..x.x.. -// ...x... -// ..x.x.. -// -static uint8_t const explosion1_bits[] = { - 0x00U, 0x14U, 0x08U, 0x14U -}; - -// -// The bitmap of the explosion stage 2: -// -// .x...x. -// ..x.x.. -// ...x... -// ..x.x.. -// .x...x. -// -static uint8_t const explosion2_bits[] = { - 0x11U, 0x0AU, 0x04U, 0x0AU, 0x11U -}; - -// -// The bitmap of the explosion stage 3: -// -// x..x..x -// .x.x.x. -// ..x.x.. -// xx.x.xx -// ..x.x.. -// .x.x.x. -// x..x..x -// -static uint8_t const explosion3_bits[] = { - 0x49, 0x2A, 0x14, 0x6B, 0x14, 0x2A, 0x49 -}; - -static Bitmap const l_bitmap[GAME::MAX_BMP] = { - { ship_bits, Q_DIM(ship_bits) }, - { missile_bits, Q_DIM(missile_bits) }, - { mine1_bits, Q_DIM(mine1_bits) }, - { mine2_bits, Q_DIM(mine2_bits) }, - { mine2_missile_bits, Q_DIM(mine2_missile_bits) }, - { explosion0_bits, Q_DIM(explosion0_bits) }, - { explosion1_bits, Q_DIM(explosion1_bits) }, - { explosion2_bits, Q_DIM(explosion2_bits) }, - { explosion3_bits, Q_DIM(explosion3_bits) } -}; - -//............................................................................ -void paintBitmap(uint8_t x, uint8_t y, uint8_t bmp_id) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - paintBits(x, y, bmp->bits, bmp->height); -} -//............................................................................ -void advanceWalls(uint8_t top, uint8_t bottom) { - uint_fast8_t y; - for (y = 0U; y < GAME_TUNNEL_HEIGHT; ++y) { - // shift the walls one pixel to the left - l_walls[y][0] = (l_walls[y][0] >> 1) | (l_walls[y][1] << 31); - l_walls[y][1] = (l_walls[y][1] >> 1) | (l_walls[y][2] << 31); - l_walls[y][2] = (l_walls[y][2] >> 1) | (l_walls[y][3] << 31); - l_walls[y][3] = (l_walls[y][3] >> 1); - - // add new column of walls at the end - if (y <= top) { - l_walls[y][3] |= (1U << 31); - } - if (y >= (GAME_TUNNEL_HEIGHT - bottom)) { - l_walls[y][3] |= (1U << 31); - } - - // copy the walls to the frame buffer - l_fb[y][0] = l_walls[y][0]; - l_fb[y][1] = l_walls[y][1]; - l_fb[y][2] = l_walls[y][2]; - l_fb[y][3] = l_walls[y][3]; - } -} -//............................................................................ -bool doBitmapsOverlap(uint8_t bmp_id1, uint8_t x1, uint8_t y1, - uint8_t bmp_id2, uint8_t x2, uint8_t y2) -{ - uint8_t y; - uint8_t y0; - uint8_t h; - uint32_t bits1; - uint32_t bits2; - Bitmap const *bmp1; - Bitmap const *bmp2; - - Q_REQUIRE((bmp_id1 < Q_DIM(l_bitmap)) && (bmp_id2 < Q_DIM(l_bitmap))); - - // are the bitmaps close enough in x? - if (x1 >= x2) { - if (x1 > x2 + 8U) { - return false; - } - x1 -= x2; - x2 = 0U; - } - else { - if (x2 > x1 + 8U) { - return false; - } - x2 -= x1; - x1 = 0U; - } - - bmp1 = &l_bitmap[bmp_id1]; - bmp2 = &l_bitmap[bmp_id2]; - if ((y1 <= y2) && (y1 + bmp1->height > y2)) { - y0 = y2 - y1; - h = y1 + bmp1->height - y2; - if (h > bmp2->height) { - h = bmp2->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y + y0] << x1); - bits2 = ((uint32_t)bmp2->bits[y] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - else { - if ((y1 > y2) && (y2 + bmp2->height > y1)) { - y0 = y1 - y2; - h = y2 + bmp2->height - y1; - if (h > bmp1->height) { - h = bmp1->height; - } - for (y = 0; y < h; ++y) { // scan over the overlapping rows - bits1 = ((uint32_t)bmp1->bits[y] << x1); - bits2 = ((uint32_t)bmp2->bits[y + y0] << x2); - if ((bits1 & bits2) != 0U) { // do the bits overlap? - return true; // yes! - } - } - } - } - return false; // the bitmaps do not overlap -} -//............................................................................ -bool isWallHit(uint8_t bmp_id, uint8_t x, uint8_t y) { - Bitmap const *bmp = &l_bitmap[bmp_id]; - uint32_t shift = (x & 0x1FU); - uint32_t *walls = &l_walls[y][x >> 5]; - for (y = 0; y < bmp->height; ++y, walls += (SCREEN_WIDTH >> 5)) { - if (*walls & ((uint32_t)bmp->bits[y] << shift)) { - return true; - } - if (shift > 24U) { - if (*(walls + 1) & ((uint32_t)bmp->bits[y] >> (32U - shift))) { - return true; - } - } - } - return false; -} - -//............................................................................ -void updateScore(uint16_t score) { - uint8_t seg[5]; - char str[5]; - - if (score == 0U) { - paintString(1U, SCREEN_HEIGHT - 8U, "SCORE:"); - } - - seg[0] = score % 10U; score /= 10U; - seg[1] = score % 10U; score /= 10U; - seg[2] = score % 10U; score /= 10U; - seg[3] = score % 10U; - - // update the SCORE area on the screeen - str[0] = seg[3] + '0'; - str[1] = seg[2] + '0'; - str[2] = seg[1] + '0'; - str[3] = seg[0] + '0'; - str[4] = '\0'; - paintString(6U*6U, SCREEN_HEIGHT - 8U, str); - - // update the score in the l_scoreBoard SegmentDisplay - SegmentDisplay_setSegment(&l_scoreBoard, 0U, (UINT)seg[0]); - SegmentDisplay_setSegment(&l_scoreBoard, 1U, (UINT)seg[1]); - SegmentDisplay_setSegment(&l_scoreBoard, 2U, (UINT)seg[2]); - SegmentDisplay_setSegment(&l_scoreBoard, 3U, (UINT)seg[3]); -} -//............................................................................ -void displayOn() { - SegmentDisplay_setSegment(&l_userLED0, 0U, 1U); -} -//............................................................................ -void displayOff() { - SegmentDisplay_setSegment(&l_userLED0, 0U, 0U); - GraphicDisplay_clear(&l_lcd); - GraphicDisplay_redraw(&l_lcd); -} -//............................................................................ -uint32_t random(void) { // a very cheap pseudo-random-number generator - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - l_rnd = l_rnd * (3U*7U*11U*13U*23U); - return l_rnd >> 8; -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} - -} // namespace BSP - -//============================================================================ -namespace { // unnamed local namespace - -static void paintBits(uint8_t x, uint8_t y, uint8_t const *bits, uint8_t h) { - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb |= ((uint32_t)bits[y] << shift); - if (shift > 24U) { - *(fb + 1) |= ((uint32_t)bits[y] >> (32U - shift)); - } - } -} -//............................................................................ -static void paintBitsClear(uint8_t x, uint8_t y, - uint8_t const *bits, uint8_t h) -{ - uint32_t *fb = &l_fb[y][x >> 5]; - uint32_t shift = (x & 0x1FU); - uint32_t mask1 = ~((uint32_t)0xFFU << shift); - uint32_t mask2; - if (shift > 24U) { - mask2 = ~(0xFFU >> (32U - shift)); - } - for (y = 0; y < h; ++y, fb += (BSP::SCREEN_WIDTH >> 5)) { - *fb = ((*fb & mask1) | ((uint32_t)bits[y] << shift)); - if (shift > 24U) { - *(fb + 1) = ((*(fb + 1) & mask2) - | ((uint32_t)bits[y] >> (32U - shift))); - } - } -} - -//............................................................................ -static void playerTrigger(void) { - static QP::QEvt const fireEvt(GAME::PLAYER_TRIGGER_SIG); -#ifdef Q_SPY - static QP::QSpyId const sender = { QP::QS_AP_ID }; -#endif - QP::QF::PUBLISH(&fireEvt, &sender); -} - -} // unnamed local namespace - -//============================================================================ -extern "C" { - -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE /*hPrevInst*/, - LPSTR cmdLine, int iCmdShow) -{ - l_hInst = hInst; // save the application instance - l_cmdLine = cmdLine; // save the command line string - - // create the main custom dialog window - HWND hWnd = CreateCustDialog(hInst, IDD_APPLICATION, NULL, - &WndProc, "MY_CLASS"); - ShowWindow(hWnd, iCmdShow); // show the main window - - // enter the message loop... - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - BSP::terminate(0); - - return msg.wParam; -} -//............................................................................ -static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, - WPARAM wParam, LPARAM lParam) -{ - switch (iMsg) { - - // Perform initialization upon creation of the main dialog window - // NOTE: Any child-windows are NOT created yet at this time, so - // the GetDlgItem() function can't be used (it will return NULL). - // - case WM_CREATE: { - l_hWnd = hWnd; // save the window handle - - // initialize the owner-drawn buttons... - // NOTE: must be done *before* the first drawing of the buttons, - // so WM_INITDIALOG is too late. - // - OwnerDrawnButton_init(&l_userBtn0, IDC_USER0, - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_UP)), - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_DWN)), - LoadCursor(NULL, IDC_HAND)); - OwnerDrawnButton_init(&l_userBtn1, IDC_USER1, - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_UP)), - LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_BTN_DWN)), - LoadCursor(NULL, IDC_HAND)); - return 0; - } - - // Perform initialization after all child windows have been created - case WM_INITDIALOG: { - GraphicDisplay_init(&l_lcd, 128, 128, IDC_LCD, c_offColor); - - SegmentDisplay_init(&l_userLED0, - 1U, // 1 "segment" (the LED0 itself) - 2U); // 2 bitmaps (for LED0 OFF/ON states) - SegmentDisplay_initSegment(&l_userLED0, 0U, IDC_LED0); - SegmentDisplay_initBitmap(&l_userLED0, - 0U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_LED_OFF))); - SegmentDisplay_initBitmap(&l_userLED0, - 1U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_LED_ON))); - - SegmentDisplay_init(&l_userLED1, - 1U, // 1 "segment" (the LED1 itself) - 2U); // 2 bitmaps (for LED1 OFF/ON states) - SegmentDisplay_initSegment(&l_userLED1, 0U, IDC_LED1); - SegmentDisplay_initBitmap(&l_userLED1, - 0U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_LED_OFF))); - SegmentDisplay_initBitmap(&l_userLED1, - 1U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_LED_ON))); - - SegmentDisplay_init(&l_scoreBoard, - 4U, // 4 "segments" (digits 0-3) - 10U); // 10 bitmaps (for 0-9 states) - SegmentDisplay_initSegment(&l_scoreBoard, 0U, IDC_SEG0); - SegmentDisplay_initSegment(&l_scoreBoard, 1U, IDC_SEG1); - SegmentDisplay_initSegment(&l_scoreBoard, 2U, IDC_SEG2); - SegmentDisplay_initSegment(&l_scoreBoard, 3U, IDC_SEG3); - SegmentDisplay_initBitmap(&l_scoreBoard, - 0U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG0))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 1U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG1))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 2U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG2))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 3U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG3))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 4U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG4))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 5U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG5))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 6U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG6))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 7U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG7))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 8U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG8))); - SegmentDisplay_initBitmap(&l_scoreBoard, - 9U, LoadBitmap(l_hInst, MAKEINTRESOURCE(IDB_SEG9))); - - BSP::updateScore(0U); - - // --> QP: spawn the application thread to run main_gui() - HANDLE hThr = CreateThread(NULL, 0, &appThread, NULL, 0, NULL); - Q_ASSERT(hThr != (HANDLE)0); - return 0; - } - - case WM_DESTROY: { - OutputDebugString("DESTROY\n"); - PostQuitMessage(0); - return 0; - } - - // commands from child controls and menus... - case WM_COMMAND: { - switch (wParam) { - case IDOK: - case IDCANCEL: { - OutputDebugString("QUIT\n"); - PostQuitMessage(0); - break; - } - case IDC_USER0: // owner-drawn buttons... - case IDC_USER1: { - SetFocus(hWnd); - break; - } - } - return 0; - } - - // drawing of owner-drawn buttons... - case WM_DRAWITEM: { - LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT)lParam; - switch (pdis->CtlID) { - case IDC_USER0: { // owner-drawn Button0 - OutputDebugString("USER0\n"); - switch (OwnerDrawnButton_draw(&l_userBtn0, pdis)) { - case BTN_DEPRESSED: { - playerTrigger(); - SegmentDisplay_setSegment(&l_userLED0, 0U, 1U); - break; - } - case BTN_RELEASED: { - SegmentDisplay_setSegment(&l_userLED0, 0U, 0U); - break; - } - default: { - break; - } - } - break; - } - case IDC_USER1: { // owner-drawn Button1 - OutputDebugString("USER1\n"); - switch (OwnerDrawnButton_draw(&l_userBtn1, pdis)) { - case BTN_DEPRESSED: { - break; - } - case BTN_RELEASED: { - break; - } - default: { - break; - } - } - break; - } - } - return 0; - } - - // mouse wheel input... - case WM_MOUSEWHEEL: { - OutputDebugString("MOUSEWHEEL\n"); - return 0; - } - - // keyboard input... - case WM_KEYDOWN: { - OutputDebugString("KEYDOWN\n"); - switch (wParam) { - case VK_SPACE: - playerTrigger(); - OwnerDrawnButton_set(&l_userBtn0, 1); - break; - } - return 0; - } - - case WM_KEYUP: { - OutputDebugString("KEYUP\n"); - switch (wParam) { - case VK_SPACE: - OwnerDrawnButton_set(&l_userBtn0, 0); - break; - } - return 0; - } - } - return DefWindowProc(hWnd, iMsg, wParam, lParam); -} - -} // extern "C" - -//============================================================================ - -namespace QP { - -//............................................................................ -void QF::onStartup(void) { - setTickRate(BSP::TICKS_PER_SEC, 30); // set the desired tick rate -} -//............................................................................ -void QF::onCleanup(void) { -} -//............................................................................ -void QF::onClockTick(void) { - static QP::QEvt const tickEvt(GAME::TIME_TICK_SIG); - QTimeEvt::TICK_X(0U, &l_clock_tick); // time events at rate 0 - QF::PUBLISH(&tickEvt, &l_clock_tick); // publish the tick event - - QS_RX_INPUT(); // handle the QS-RX input - QS_OUTPUT(); // handle the QS output -} - -//---------------------------------------------------------------------------- -#ifdef Q_SPY // define QS callbacks - -//............................................................................ -void QS::onCommand(uint8_t cmdId, uint32_t param1, - uint32_t param2, uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - diff --git a/examples/qwin-gui/game-gui/bsp.hpp b/examples/qwin-gui/game-gui/bsp.hpp deleted file mode 100644 index c6c134f0a..000000000 --- a/examples/qwin-gui/game-gui/bsp.hpp +++ /dev/null @@ -1,69 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example on EFM32-SLSTK3401A board -// Last updated for version 7.3.0 -// Last updated on 2023-09-06 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// https://state-machine.com -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr uint32_t TICKS_PER_SEC = static_cast(33); -constexpr uint32_t SCREEN_WIDTH = static_cast(128); -constexpr uint32_t SCREEN_HEIGHT = static_cast(128); - -void init(void); -void terminate(int16_t result); - -void updateScreen(void); -void clearFB(void); -void clearWalls(void); -void paintString(uint8_t x, uint8_t y, char const *str); -void paintBitmap(uint8_t x, uint8_t y, uint8_t bmp_id); -void advanceWalls(uint8_t top, uint8_t bottom); -void updateScore(uint16_t score); - -bool isThrottle(void); // is the throttle button depressed? -bool doBitmapsOverlap(uint8_t bmp_id1, uint8_t x1, uint8_t y1, - uint8_t bmp_id2, uint8_t x2, uint8_t y2); -bool isWallHit(uint8_t bmp_id, uint8_t x, uint8_t y); -void displayOn(void); -void displayOff(void); - -void randomSeed(uint32_t seed); // random seed -uint32_t random(void); // pseudo-random generator - -extern QP::QTicker *the_Ticker0; - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/qwin-gui/game-gui/game-gui.sln b/examples/qwin-gui/game-gui/game-gui.sln deleted file mode 100644 index 0886f8f5e..000000000 --- a/examples/qwin-gui/game-gui/game-gui.sln +++ /dev/null @@ -1,23 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game-gui", "game-gui.vcxproj", "{79027B25-0949-4F66-9765-4EFBCBBEFB94}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - QSpy|Win32 = QSpy|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Debug|Win32.ActiveCfg = Debug|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Debug|Win32.Build.0 = Debug|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Release|Win32.ActiveCfg = Release|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.Release|Win32.Build.0 = Release|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.QSpy|Win32.ActiveCfg = QSpy|Win32 - {79027B25-0949-4F66-9765-4EFBCBBEFB94}.QSpy|Win32.Build.0 = QSpy|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/qwin-gui/game-gui/game-gui.vcxproj b/examples/qwin-gui/game-gui/game-gui.vcxproj deleted file mode 100644 index 0289c6b03..000000000 --- a/examples/qwin-gui/game-gui/game-gui.vcxproj +++ /dev/null @@ -1,332 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - QSpy - Win32 - - - - {79027B25-0949-4F66-9765-4EFBCBBEFB94} - game-gui - 10.0 - - - - Application - false - NotSet - v142 - - - Application - false - NotSet - v142 - - - Application - false - NotSet - v142 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(Configuration)\ - $(Configuration)\ - false - false - $(Configuration)\ - $(Configuration)\ - false - false - $(Configuration)\ - $(Configuration)\ - false - false - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/game-gui.tlb - - - - - MaxSpeed - OnlyExplicitInline - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - NDEBUG;QWIN_GUI;_WINDOWS;%(PreprocessorDefinitions) - false - - - MultiThreaded - true - - - $(IntDir) - $(IntDir) - $(IntDir) - Level3 - true - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - %(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - Windows - false - - - MachineX86 - - - true - .\Release/game-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\QSpy/game-gui.tlb - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - Q_SPY;QWIN_GUI;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - - - $(IntDir) - $(IntDir) - $(IntDir) - true - Level3 - true - ProgramDatabase - Default - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - ws2_32.lib;%(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - true - false - - - Windows - false - - - MachineX86 - - - true - .\QSpy/game-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/game-gui.tlb - - - - - Disabled - .;../../../include;../../../ports/win32-qv;%(AdditionalIncludeDirectories) - QWIN_GUI;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Default - MultiThreaded - - - $(IntDir) - $(IntDir) - $(IntDir) - true - Level3 - true - ProgramDatabase - Default - - - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - %(AdditionalDependencies) - $(OutDir)$(ProjectName).exe - true - %(AdditionalLibraryDirectories) - true - false - - - Windows - false - - - MachineX86 - - - true - .\Debug/game-gui.bsc - - - cmd /c "del $(OutDir)qstamp.obj" - - - - - - true - - - true - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/qwin-gui/game-gui/game-gui.vcxproj.filters b/examples/qwin-gui/game-gui/game-gui.vcxproj.filters deleted file mode 100644 index aff5c9405..000000000 --- a/examples/qwin-gui/game-gui/game-gui.vcxproj.filters +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QP - - - QS - - - QS - - - QS - - - QS - - - QS - - - QS - - - QP - - - QP - - - QP - - - - - - - - - QP - - - QP - - - QP_port - - - QP - - - - - Res - - - Res - - - Res - - - Res - - - Res - - - Res - - - Res - - - - - - {c8d4d732-dcf8-4466-ad8e-3f15ab6fe204} - - - {4edf856c-7db0-4957-a143-44a72f59a0af} - - - {65d40db6-59fb-41d1-8a98-2187dc3217a1} - - - {c4527ddf-c49e-4957-bd70-77babf9183e2} - - - - - - \ No newline at end of file diff --git a/examples/qwin-gui/game-gui/game.hpp b/examples/qwin-gui/game-gui/game.hpp deleted file mode 100644 index 3df880ae9..000000000 --- a/examples/qwin-gui/game-gui/game.hpp +++ /dev/null @@ -1,171 +0,0 @@ -//$file${.::game.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::game.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::game.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef GAME_HPP_ -#define GAME_HPP_ - -namespace GAME { - -enum GameSignals : QP::QSignal { // signals used in the game - TIME_TICK_SIG = QP::Q_USER_SIG, // published from tick ISR - PLAYER_TRIGGER_SIG, // published by Player (ISR) to trigger the Missile - PLAYER_QUIT_SIG, // published by Player (ISR) to quit the game - GAME_OVER_SIG, // published by Ship when it finishes exploding - - // insert other published signals here ... - MAX_PUB_SIG, // the last published signal - - PLAYER_SHIP_MOVE_SIG, // posted by Player (ISR) to the Ship to move it - - BLINK_TIMEOUT_SIG, // signal for Tunnel's blink timeout event - SCREEN_TIMEOUT_SIG, // signal for Tunnel's screen timeout event - - TAKE_OFF_SIG, // from Tunnel to Ship to grant permission to take off - HIT_WALL_SIG, // from Tunnel to Ship when Ship hits the wall - HIT_MINE_SIG, // from Mine to Ship or Missile when it hits the mine - SHIP_IMG_SIG, // from Ship to the Tunnel to draw and check for hits - MISSILE_IMG_SIG, // from Missile the Tunnel to draw and check for hits - MINE_IMG_SIG, // sent by Mine to the Tunnel to draw the mine - MISSILE_FIRE_SIG, // sent by Ship to the Missile to fire - DESTROYED_MINE_SIG, // from Missile to Ship when Missile destroyed Mine - EXPLOSION_SIG, // from any exploding object to render the explosion - MINE_PLANT_SIG, // from Tunnel to the Mine to plant it - MINE_DISABLED_SIG, // from Mine to Tunnel when it becomes disabled - MINE_RECYCLE_SIG, // sent by Tunnel to Mine to recycle the mine - SCORE_SIG, // from Ship to Tunnel to display the score - - MAX_SIG // the last signal (keep always last) -}; - -#define GAME_TUNNEL_WIDTH BSP::SCREEN_WIDTH -#define GAME_TUNNEL_HEIGHT (BSP::SCREEN_HEIGHT - 10U) -#define GAME_MINES_MAX 5U -#define GAME_MINES_DIST_MIN 10U -#define GAME_SPEED_X 1U -#define GAME_MISSILE_SPEED_X 2U -#define GAME_SHIP_X 10U -#define GAME_SHIP_Y (GAME_TUNNEL_HEIGHT / 2U) -#define GAME_WALLS_GAP_Y 50U -#define GAME_WALLS_MIN_GAP_Y 20U - -enum GameBitmapIds { - SHIP_BMP, - MISSILE_BMP, - MINE1_BMP, - MINE2_BMP, - MINE2_MISSILE_BMP, - EXPLOSION0_BMP, - EXPLOSION1_BMP, - EXPLOSION2_BMP, - EXPLOSION3_BMP, - MAX_BMP -}; - -} // namespace GAME - -// Shared declarations -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::ObjectPosEvt} .................................................... -class ObjectPosEvt : public QP::QEvt { -public: - std::uint8_t x; - std::uint8_t y; - -public: - constexpr ObjectPosEvt( - QP::QSignal sig, - std::uint8_t const x0, - std::uint8_t const y0) - : QEvt(sig), - x(x0), - y(y0) - {} -}; // class ObjectPosEvt - -//${Shared::ObjectImageEvt} .................................................. -class ObjectImageEvt : public QP::QEvt { -public: - std::uint8_t x; - std::int8_t y; - std::uint8_t bmp; -}; // class ObjectImageEvt - -//${Shared::MineEvt} ......................................................... -class MineEvt : public QP::QEvt { -public: - std::uint8_t id; - -public: - constexpr MineEvt( - QP::QSignal sig, - std::uint8_t id_p) - : QEvt(sig), - id(id_p) - {} -}; // class MineEvt - -//${Shared::ScoreEvt} ........................................................ -class ScoreEvt : public QP::QEvt { -public: - std::uint16_t score; - -public: - constexpr ScoreEvt( - QP::QSignal sig, - std::uint16_t score_p) - : QEvt(sig), - score(score_p) - {} -}; // class ScoreEvt - -//${Shared::AO_Tunnel} ....................................................... -// opaque pointer -extern QP::QActive * const AO_Tunnel; - -//${Shared::AO_Ship} ......................................................... -// opaque pointer -extern QP::QActive * const AO_Ship; - -//${Shared::AO_Missile} ...................................................... -// opaque pointer -extern QP::QActive * const AO_Missile; - -//${Shared::Mine1_getInst} ................................................... -QP::QHsm * Mine1_getInst(std::uint8_t id); - -//${Shared::Mine2_getInst} ................................................... -QP::QHsm * Mine2_getInst(std::uint8_t id); - -} // namespace GAME -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#endif // GAME_HPP_ diff --git a/examples/qwin-gui/game-gui/game.qm b/examples/qwin-gui/game-gui/game.qm deleted file mode 100644 index b41e6bdf8..000000000 --- a/examples/qwin-gui/game-gui/game.qm +++ /dev/null @@ -1,1448 +0,0 @@ - - - "Fly 'n' Shoot" game model from Chapters 1 & 9 of PSiCC2 - - - - - - - - - - - - - - - - - - - : QEvt(sig), - x(x0), - y(y0) - - - - - - - - - - - - - - - - - - This constructor is called only for statically allocated MineEvt - - - - - : QEvt(sig), - id(id_p) - - - - - - - - - This constructor is called only for statically allocated MineEvt - - - - - : QEvt(sig), - score(score_p) - - - - - // opaque pointer - = &Tunnel::inst; - - - - // opaque pointer - = &Ship::inst; - - - - // opaque pointer - = &Missile::inst; - - - - - - Q_REQUIRE(id < Q_DIM(Mine1::inst)); -return &Mine1::inst[id]; - - - - - - Q_REQUIRE(id < Q_DIM(Mine2::inst)); -return &Mine2::inst[id]; - - - - - - - Tunnel Active Object - - - - - - - - - - - - - - - - - - - - - - - - - static instance (Singleton) - - - - : QActive(&initial), - m_blinkTimeEvt(this, BLINK_TIMEOUT_SIG, 0U), - m_screenTimeEvt(this, SCREEN_TIMEOUT_SIG, 0U), - m_last_mine_x(0U), m_last_mine_y(0U) - -for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n] = Mine1_getInst(n); // initialize mine1-type pool - m_mine2_pool[n] = Mine2_getInst(n); // initialize mine2-type pool - m_mines[n] = nullptr; // mine 'n' is unused -} - - - - uint32_t rnd = (BSP::random() & 0xFFU); - -// reduce the top wall thickness 18.75% of the time -if ((rnd < 48U) && (m_wall_thickness_top > 0U)) { - --m_wall_thickness_top; -} - -// reduce the bottom wall thickness 18.75% of the time -if ((rnd > 208U) && (m_wall_thickness_bottom > 0U)) { - --m_wall_thickness_bottom; -} - -rnd = (BSP::random() & 0xFFU); - -// grow the bottom wall thickness 19.14% of the time -if ((rnd < 49U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) -{ - ++m_wall_thickness_bottom; -} - -// grow the top wall thickness 19.14% of the time -if ((rnd > 207U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) -{ - ++m_wall_thickness_top; -} - -// advance the Tunnel by 1 game step to the left -// and copy the Tunnel layer to the main frame buffer -// -BSP::advanceWalls(m_wall_thickness_top, m_wall_thickness_bottom); - - - - uint32_t rnd = (BSP::random() & 0xFFU); - -if (m_last_mine_x > 0U) { - --m_last_mine_x; // shift the last Mine 1 position to the left -} -// last mine far enough? -if ((m_last_mine_x + GAME_MINES_DIST_MIN < GAME_TUNNEL_WIDTH) - && (rnd < 8U)) // place the mines only 5% of the time -{ - uint8_t n; - for (n = 0U; n < Q_DIM(m_mines); ++n) { // look for disabled mines - if (m_mines[n] == nullptr) { - break; - } - } - if (n < Q_DIM(m_mines)) { // a disabled Mine found? - rnd = (BSP::random() & 0xFFFFU); - - if ((rnd & 1U) == 0U) { // choose the type of the mine - m_mines[n] = m_mine1_pool[n]; - } - else { - m_mines[n] = m_mine2_pool[n]; - } - - // new Mine is planted by the end of the tunnel - m_last_mine_x = GAME_TUNNEL_WIDTH - 8U; - - // choose a random y-position for the Mine in the Tunnel - rnd %= (GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom - 4U); - m_last_mine_y = (uint8_t)(m_wall_thickness_top + 2U + rnd); - - // evt to dispatch to the Mine - ObjectPosEvt const ope(MINE_PLANT_SIG, m_last_mine_x, m_last_mine_y); - m_mines[n]->dispatch(&ope, getPrio()); // direct dispatch - } -} - - - - - - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - if (m_mines[n] != nullptr) { // is the mine used? - m_mines[n]->dispatch(e, getPrio()); - } -} - - - - - - for (uint8_t n = 0; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n]->init(getPrio()); // take the initial tran. for Mine1 - m_mine2_pool[n]->init(getPrio()); // take the initial tran. for Mine2 -} - -BSP::randomSeed(1234U); // seed the pseudo-random generator - -subscribe(TIME_TICK_SIG); -subscribe(PLAYER_TRIGGER_SIG); -subscribe(PLAYER_QUIT_SIG); - -// object dictionary for Tunnel object... -QS_OBJ_DICTIONARY(&Tunnel::inst.m_blinkTimeEvt); -QS_OBJ_DICTIONARY(&Tunnel::inst.m_screenTimeEvt); - -// local signals... -QS_SIG_DICTIONARY(BLINK_TIMEOUT_SIG, this); -QS_SIG_DICTIONARY(SCREEN_TIMEOUT_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); -QS_SIG_DICTIONARY(MINE_IMG_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(EXPLOSION_SIG, this); -QS_SIG_DICTIONARY(SCORE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - Q_ASSERT((Q_EVT_CAST(MineEvt)->id < GAME_MINES_MAX) - && (m_mines[Q_EVT_CAST(MineEvt)->id] != nullptr)); -m_mines[Q_EVT_CAST(MineEvt)->id] = nullptr; - - - - - - - - - - - - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 sec -m_blink_ctr = 0U; -BSP::paintString(24U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "Quantum LeAps"); -BSP::paintString(16U, (GAME_TUNNEL_HEIGHT / 2U) + 0U, "state-machine.com"); - -BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 18U, "Fire missile: BTN0"); -BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 10U, "Fly ship up: BTN1"); - -BSP::updateScreen(); - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); - - - - - - - - - m_blink_ctr ^= 1U; // toggle the blink counter - - - m_blink_ctr == 0U - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeAps"); -BSP::updateScreen(); - - - - - - - else - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeaPs"); -BSP::updateScreen(); - - - - - - - - - - - - - - - - m_last_mine_x = 0U; // last mine at right edge of the tunnel -m_last_mine_y = 0U; -// set the tunnel properties... -m_wall_thickness_top = 0U; -m_wall_thickness_bottom = 0U; -m_wall_gap = GAME_WALLS_GAP_Y; - -BSP::clearWalls(); // erase the tunnel walls - -m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*20U, 0U); // in 20 sec - -m_blink_ctr = 0U; // init the blink counter - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); - - - m_blink_ctr ^= 1U; /* toggle the blink counter */ - - - - - - - - - - - - - advance(); -if (m_blink_ctr != 0U) { - // add the text into the frame buffer - BSP::paintString((GAME_TUNNEL_WIDTH - 10U*6U)/2U, - (GAME_TUNNEL_HEIGHT - 4U)/2U, - "Press BTN0"); -} -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - static QP::QEvt const takeoff(TAKE_OFF_SIG); -m_wall_gap = GAME_WALLS_GAP_Y; -AO_Ship->POST(&takeoff, this); // post the TAKEOFF sig - static QP::QEvt const recycle(MINE_RECYCLE_SIG); -dispatchToAllMines(&recycle); // recycle all Mines - - - // render this frame on the display -BSP::updateScreen(); -advance(); -plantMine(); -dispatchToAllMines(e); - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - -// did the Ship/Missile hit the tunnel wall? -if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Ship->POST(&hit, this); -} -BSP::paintBitmap(x, y, bmp); -dispatchToAllMines(e); // let Mines check for hits - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - -// did the Ship/Missile hit the tunnel wall? -if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Missile->POST(&hit, this); -} -BSP::paintBitmap(x, y, bmp); -dispatchToAllMines(e); // let Mines check for hits - - - - - - - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - - - - - - - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - - - - - - - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); -// increase difficulty of the game: -// the tunnel gets narrower as the score goes up -// -m_wall_gap = (uint8_t)(GAME_WALLS_GAP_Y - - Q_EVT_CAST(ScoreEvt)->score/100U); -if (m_wall_gap < GAME_WALLS_MIN_GAP_Y) { - m_wall_gap = GAME_WALLS_MIN_GAP_Y; -} - - - - - - - BSP::clearWalls(); -BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); -BSP::updateScreen(); - - - - - - - - - - - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 se -m_blink_ctr = 0U; -BSP::paintString((GAME_TUNNEL_WIDTH - 6U * 9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - "Game Over"); -BSP::updateScreen(); - m_blinkTimeEvt.disarm(); -m_screenTimeEvt.disarm(); -BSP::updateScore(0U); // update the score on the display - - - m_blink_ctr ^= 1U; // toggle the blink counter -BSP::paintString((GAME_TUNNEL_WIDTH - 6U*9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - ((m_blink_ctr == 0U) - ? "Game Over" - : " ")); -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BSP::displayOff(); // power down the display -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*3U, 0U); // in 3 sec - m_screenTimeEvt.disarm(); -BSP::displayOn(); // power up the display - - - - - - - - - - - - - - BSP::clearFB(); // clear the screen frame buffer -uint32_t rnd = BSP::random(); -BSP::paintString((uint8_t)(rnd % (GAME_TUNNEL_WIDTH - 10U*6U)), - (uint8_t) (rnd % (GAME_TUNNEL_HEIGHT - 8U)), - "Press BTN0"); -BSP::updateScreen(); -m_screenTimeEvt.armX(BSP::TICKS_PER_SEC/3U, 0U); // in 1/3 sec - m_screenTimeEvt.disarm(); -BSP::clearFB(); -BSP::updateScreen(); - - - - - - - - - - - - - - - - - - BSP::clearFB(); -BSP::updateScreen(); -QP::QF::stop(); // stop QF and cleanup - - - - - - - - - - Ship Active Object - - - - - vertical position of the ship in the 8s2 fixed-point notation. - - - - - - - - static instance (Singleton) - - - - : QActive(&initial), - m_x(GAME_SHIP_X), - m_y(GAME_SHIP_Y << 2) - - - - - - subscribe(TIME_TICK_SIG); -subscribe(PLAYER_TRIGGER_SIG); - -// local signals... -QS_SIG_DICTIONARY(PLAYER_SHIP_MOVE_SIG, this); -QS_SIG_DICTIONARY(TAKE_OFF_SIG, this); -QS_SIG_DICTIONARY(HIT_WALL_SIG, this); -QS_SIG_DICTIONARY(HIT_MINE_SIG, this); -QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - - - - - - - - - - - - - - - - - m_score = 0U; // reset the score -ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); -sev->score = m_score; -AO_Tunnel->POST(sev, this); - -// launch the ship from the initial position -m_x = GAME_SHIP_X; -m_y = (GAME_SHIP_Y << 2); - - - if (BSP::isThrottle()) { - if (m_y > 0U) { - m_y -= 1U; - } -} -else { - if (m_y < (GAME_TUNNEL_HEIGHT << 2)) { - m_y += 1U; - } -} - -// tell the Tunnel to draw the Ship and test for hits -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG); -oie->x = m_x; -oie->y = m_y >> 2; -oie->bmp = SHIP_BMP; -AO_Tunnel->POST(oie, this); - -++m_score; // increment the score for surviving another tick - -if ((m_score % 10U) == 0U) { // is the score "round"? - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); -} - - - - - - - ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG); -ope->x = m_x; -ope->y = (m_y >> 2) + SHIP_HEIGHT - 1U; -AO_Missile->POST(ope, this); - - - - - - - m_score += Q_EVT_CAST(ScoreEvt)->score; -// the score will be sent to the Tunnel by the next TIME_TICK - - - - - - - - - - - - - - - - - - - - - - - m_exp_ctr = 0U; - - - - - m_exp_ctr < 15U - ++m_exp_ctr; -// tell the Tunnel to draw the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -oie->x = m_x; // x of explosion -oie->y = (int8_t)((int)(m_y >> 2) - 4U + SHIP_HEIGHT); -AO_Tunnel->POST(oie, this); - - - - - - - - ScoreEvt *gameOver = Q_NEW(ScoreEvt, GAME_OVER_SIG); -gameOver->score = m_score; -AO_Tunnel->POST(gameOver, this); - - - - - - - - - - - - - - - - - - - - Missile Active Object - - - - - - - - - static instance (Singleton) - - - - : QActive(&initial) - - - - - - subscribe( TIME_TICK_SIG); - -// local signals... -QS_SIG_DICTIONARY(MISSILE_FIRE_SIG, this); -QS_SIG_DICTIONARY(HIT_WALL_SIG, this); -QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - - - - - m_x + GAME_MISSILE_SPEED_X < GAME_TUNNEL_WIDTH - m_x += GAME_MISSILE_SPEED_X; -// tell the Tunnel to draw the Missile and test for wall hits -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MISSILE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MISSILE_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - AO_Ship->POST(e, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15U) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move the explosion by one step - -// tell the Tunnel to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 3U; // x-pos of explosion -oie->y = (int8_t)((int)m_y - 4U); // y-pos -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - The Mine1 orthogonal component - - - - - - - - - static instances (Singletons) - - - - : QHsm(&initial) - - - - - - static bool dict_sent = false; -if (!dict_sent) { - dict_sent = true; - - // object dictionaries for Mine1 pool... - QS_OBJ_DICTIONARY(&Mine1::inst[0]); - QS_OBJ_DICTIONARY(&Mine1::inst[1]); - QS_OBJ_DICTIONARY(&Mine1::inst[2]); - QS_OBJ_DICTIONARY(&Mine1::inst[3]); - QS_OBJ_DICTIONARY(&Mine1::inst[4]); - - // function dictionaries for Mine1 SM - QS_FUN_DICTIONARY(&Mine1::initial); - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::planted); - QS_FUN_DICTIONARY(&Mine1::exploding); -} -// local signals -QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - // tell the Tunnel that this mine is becoming disabled -MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); -mev->id = MINE_ID(this); -AO_Tunnel->POST(mev, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move explosion by 1 step - -// tell the Game to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 1U; // x of explosion -oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - - m_x >= GAME_SPEED_X - m_x -= GAME_SPEED_X; // move the mine 1 step -// tell the Tunnel to draw the Mine -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MINE1_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y) - static MineEvt const mine1_hit(HIT_MINE_SIG, 1U); -AO_Ship->POST(&mine1_hit, this); -// go straight to 'disabled' and let the Ship do -// the exploding - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y) - static ScoreEvt const mine1_destroyed(DESTROYED_MINE_SIG, 25U); -AO_Missile->POST(&mine1_destroyed, this); - - - - - - - - - - - - - - - - - - - - The Mine2 orthogonal component - - - - - - - - - static instances (Singletons) - - - - : QHsm(&initial) - - - - - - static bool dict_sent = false; -if (!dict_sent) { - dict_sent = true; - // object dictionaries for Mine2 pool... - QS_OBJ_DICTIONARY(&Mine2::inst[0]); - QS_OBJ_DICTIONARY(&Mine2::inst[1]); - QS_OBJ_DICTIONARY(&Mine2::inst[2]); - QS_OBJ_DICTIONARY(&Mine2::inst[3]); - QS_OBJ_DICTIONARY(&Mine2::inst[4]); - - // function dictionaries for Mine2 SM... - QS_FUN_DICTIONARY(&Mine2::initial); - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::planted); - QS_FUN_DICTIONARY(&Mine2::exploding); -} -// local signals... -QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); -QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); -QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); -QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); -QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - -(void)e; // unused parameter - - - - - - - - - m_x = Q_EVT_CAST(ObjectPosEvt)->x; -m_y = Q_EVT_CAST(ObjectPosEvt)->y; - - - - - - - - - // tell the Tunnel that this mine is becoming disabled -MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); -mev->id = MINE_ID(this); -AO_Tunnel->POST(mev, this); - - - - - - - - - m_exp_ctr = 0U; - - - - - (m_x >= GAME_SPEED_X) && (m_exp_ctr < 15) - ++m_exp_ctr; // advance the explosion counter -m_x -= GAME_SPEED_X; // move explosion by 1 step - -// tell the Game to render the current stage of Explosion -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); -oie->x = m_x + 1U; // x of explosion -oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion -oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - - - - - - - - - m_x >= GAME_SPEED_X - m_x -= GAME_SPEED_X; // move the mine 1 step -// tell the Tunnel to draw the Mine -ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); -oie->x = m_x; -oie->y = m_y; -oie->bmp = MINE2_BMP; -AO_Tunnel->POST(oie, this); - - - - - - - - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE2_BMP, m_x, m_y, bmp, x, y) - static MineEvt const mine2_hit(HIT_MINE_SIG, 2U); -AO_Ship->POST(&mine2_hit, this); -// go straight to 'disabled' and let the Ship do -// the exploding - - - - - - - - - - - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; -uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; -uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - - BSP::doBitmapsOverlap(MINE2_MISSILE_BMP, m_x, m_y, bmp, x, y) - static ScoreEvt const mine2_destroyed(DESTROYED_MINE_SIG, 45U); -AO_Missile->POST(&mine2_destroyed, this); - - - - - - - - - - - - - - - - - - - - - - - #ifndef GAME_HPP_ -#define GAME_HPP_ - -namespace GAME { - -enum GameSignals : QP::QSignal { // signals used in the game - TIME_TICK_SIG = QP::Q_USER_SIG, // published from tick ISR - PLAYER_TRIGGER_SIG, // published by Player (ISR) to trigger the Missile - PLAYER_QUIT_SIG, // published by Player (ISR) to quit the game - GAME_OVER_SIG, // published by Ship when it finishes exploding - - // insert other published signals here ... - MAX_PUB_SIG, // the last published signal - - PLAYER_SHIP_MOVE_SIG, // posted by Player (ISR) to the Ship to move it - - BLINK_TIMEOUT_SIG, // signal for Tunnel's blink timeout event - SCREEN_TIMEOUT_SIG, // signal for Tunnel's screen timeout event - - TAKE_OFF_SIG, // from Tunnel to Ship to grant permission to take off - HIT_WALL_SIG, // from Tunnel to Ship when Ship hits the wall - HIT_MINE_SIG, // from Mine to Ship or Missile when it hits the mine - SHIP_IMG_SIG, // from Ship to the Tunnel to draw and check for hits - MISSILE_IMG_SIG, // from Missile the Tunnel to draw and check for hits - MINE_IMG_SIG, // sent by Mine to the Tunnel to draw the mine - MISSILE_FIRE_SIG, // sent by Ship to the Missile to fire - DESTROYED_MINE_SIG, // from Missile to Ship when Missile destroyed Mine - EXPLOSION_SIG, // from any exploding object to render the explosion - MINE_PLANT_SIG, // from Tunnel to the Mine to plant it - MINE_DISABLED_SIG, // from Mine to Tunnel when it becomes disabled - MINE_RECYCLE_SIG, // sent by Tunnel to Mine to recycle the mine - SCORE_SIG, // from Ship to Tunnel to display the score - - MAX_SIG // the last signal (keep always last) -}; - -#define GAME_TUNNEL_WIDTH BSP::SCREEN_WIDTH -#define GAME_TUNNEL_HEIGHT (BSP::SCREEN_HEIGHT - 10U) -#define GAME_MINES_MAX 5U -#define GAME_MINES_DIST_MIN 10U -#define GAME_SPEED_X 1U -#define GAME_MISSILE_SPEED_X 2U -#define GAME_SHIP_X 10U -#define GAME_SHIP_Y (GAME_TUNNEL_HEIGHT / 2U) -#define GAME_WALLS_GAP_Y 50U -#define GAME_WALLS_MIN_GAP_Y 20U - -enum GameBitmapIds { - SHIP_BMP, - MISSILE_BMP, - MINE1_BMP, - MINE2_BMP, - MINE2_MISSILE_BMP, - EXPLOSION0_BMP, - EXPLOSION1_BMP, - EXPLOSION2_BMP, - EXPLOSION3_BMP, - MAX_BMP -}; - -} // namespace GAME - -// Shared declarations -$declare${Shared} - -#endif // GAME_HPP_ - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -$declare${AOs::Missile} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Missile} - -// Active object definition -------------------------------------------------- -$define${AOs::Missile} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -#define SHIP_WIDTH 5U -#define SHIP_HEIGHT 3U - -// encapsulated declaration of the Ship active object ------------------------ -$declare${AOs::Ship} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Ship} - -// Active object definition -------------------------------------------------- -$define${AOs::Ship} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" -#include <string.h> // for memmove() and memcpy() - -Q_DEFINE_THIS_FILE - -// declaration of the Tunnel AO ---------------------------------------------- -$declare${AOs::Tunnel} - -// Public-scope shared objects ----------------------------------------------- -$define${Shared::AO_Tunnel} - -// Active object definition ================================================== -$define${AOs::Tunnel} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine1 HSM --------------------------------- -$declare${AOs::Mine1} - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline uint8_t MINE_ID(Mine1 const * const me) { - return static_cast<uint8_t>(me - &Mine1::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -$define${Shared::Mine1_getInst} -$define${AOs::Mine1} - - - - #include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine2 HSM --------------------------------- -$declare${AOs::Mine2} - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline std::uint8_t MINE_ID(Mine2 const * const me) { - return static_cast<std::uint8_t>(me - &Mine2::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -$define${Shared::Mine2_getInst} -$define${AOs::Mine2} - - - diff --git a/examples/qwin-gui/game-gui/main.cpp b/examples/qwin-gui/game-gui/main.cpp deleted file mode 100644 index c2b210678..000000000 --- a/examples/qwin-gui/game-gui/main.cpp +++ /dev/null @@ -1,120 +0,0 @@ -//============================================================================ -// Product: "Fly 'n' Shoot" game example for Windows -// Last updated for version 7.3.0 -// Last updated on 2023-09-06 -// -// Q u a n t u m L e a P s -// --------------------------- -// innovating embedded systems -// -// Copyright (C) Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -// "fudge factor" for Windows, see NOTE1 -enum { WIN_FUDGE_FACTOR = 10 }; - -static QP::QTicker l_ticker0(0); // ticker for tick rate 0 - -QP::QTicker* BSP::the_Ticker0 = &l_ticker0; - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the Board Support Package - - // initialize the event pools... - //static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10*WIN_FUDGE_FACTOR]; - //QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - // NOTE: - // After new rounding up, the "small" memory pool has the same block-size - // as the next "medium" pool. If such "small" pool is initialized, - // the next "medium" pool will casuse an assertion (the same block-size - // pool already exists). - - static QF_MPOOL_EL(GAME::ObjectImageEvt) - medPoolSto[(2*GAME_MINES_MAX + 10)*WIN_FUDGE_FACTOR]; - QP::QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0])); - - // init publish-subscribe - static QP::QSubscrList subscrSto[GAME::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // object dictionaries for AOs... - QS_OBJ_DICTIONARY(GAME::AO_Missile); - QS_OBJ_DICTIONARY(GAME::AO_Ship); - QS_OBJ_DICTIONARY(GAME::AO_Tunnel); - - // signal dictionaries for globally published events... - QS_SIG_DICTIONARY(GAME::TIME_TICK_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::PLAYER_TRIGGER_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::PLAYER_QUIT_SIG, nullptr); - QS_SIG_DICTIONARY(GAME::GAME_OVER_SIG, nullptr); - - // start the active objects... - BSP::the_Ticker0->start(1U, // priority - 0, 0, 0, 0); - static QP::QEvt const *tunnelQueueSto[(GAME_MINES_MAX + 5)*WIN_FUDGE_FACTOR]; - GAME::AO_Tunnel ->start(2U, // priority - tunnelQueueSto, Q_DIM(tunnelQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - static QP::QEvt const *shipQueueSto[3*WIN_FUDGE_FACTOR]; - GAME::AO_Ship ->start(3U, // priority - shipQueueSto, Q_DIM(shipQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - static QP::QEvt const *missileQueueSto[2*WIN_FUDGE_FACTOR]; - GAME::AO_Missile->start(4U, // priority - missileQueueSto, Q_DIM(missileQueueSto), // evt queue - nullptr, 0U); // no per-thread stack - - return QP::QF::run(); // run the QF application -} - - -//============================================================================ -// NOTE1: -// Windows is not a deterministic real-time system, which means that the -// system can occasionally and unexpectedly "choke and freeze" for a number -// of seconds. The designers of Windows have dealt with these sort of issues -// by massively oversizing the resources available to the applications. For -// example, the default Windows GUI message queues size is 10,000 entries, -// which can dynamically grow to an even larger number. Also the stacks of -// Win32 threads can dynamically grow to several megabytes. -// -// In contrast, the event queues, event pools, and stack size inside the -// real-time embedded (RTE) systems can be (and must be) much smaller, -// because you typically can put an upper bound on the real-time behavior -// and the resulting delays. -// -// To be able to run the unmodified applications designed originally for -// RTE systems on Windows, and to reduce the odds of resource shortages in -// this case, the generous WIN_FUDGE_FACTOR is used to oversize the -// event queues and event pools. -// - diff --git a/examples/qwin-gui/game-gui/make.bat b/examples/qwin-gui/game-gui/make.bat deleted file mode 100644 index 80de968df..000000000 --- a/examples/qwin-gui/game-gui/make.bat +++ /dev/null @@ -1,24 +0,0 @@ -:: Batch file for building the specified PROJ (solution) prepared for -:: Microsoft Visual Studio -:: -:: usage: -:: make -:: -@setlocal - -:: specify project and build configuration (Debug|Release|Spy) -@set PROJ=game-gui -@set CONF=Debug - -:: adjust the MSBuild location for your system -@set MSBuild="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" - -:: execute the build... -%MSBuild% %PROJ%.sln -t:Build -p:Configuration=%CONF% -p:Platform=Win32 - -:: cleanup after the build... -::rmdir /S /Q %CONF%\%PROJ%.tlog -::del %CONF%\%PROJ%.vcxproj* %CONF%\%PROJ%.log %CONF%\*.obj %CONF%\*.pdb - -@endlocal - diff --git a/examples/qwin-gui/game-gui/mine1.cpp b/examples/qwin-gui/game-gui/mine1.cpp deleted file mode 100644 index c2170ed71..000000000 --- a/examples/qwin-gui/game-gui/mine1.cpp +++ /dev/null @@ -1,289 +0,0 @@ -//$file${.::mine1.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::mine1.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::mine1.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine1 HSM --------------------------------- -//$declare${AOs::Mine1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine1} .............................................................. -class Mine1 : public QP::QHsm { -private: - std::uint8_t m_x; - std::uint8_t m_y; - std::uint8_t m_exp_ctr; - -public: - static Mine1 inst[GAME_MINES_MAX]; - -public: - Mine1() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(unused); - Q_STATE_DECL(used); - Q_STATE_DECL(exploding); - Q_STATE_DECL(planted); -}; // class Mine1 - -} // namespace GAME -//$enddecl${AOs::Mine1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline uint8_t MINE_ID(Mine1 const * const me) { - return static_cast(me - &Mine1::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Mine1_getInst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::Mine1_getInst} ................................................... -QP::QHsm * Mine1_getInst(std::uint8_t id) { - Q_REQUIRE(id < Q_DIM(Mine1::inst)); - return &Mine1::inst[id]; -} - -} // namespace GAME -//$enddef${Shared::Mine1_getInst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Mine1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine1} .............................................................. -Mine1 Mine1::inst[GAME_MINES_MAX]; - -//${AOs::Mine1::SM} .......................................................... -Q_STATE_DEF(Mine1, initial) { - //${AOs::Mine1::SM::initial} - static bool dict_sent = false; - if (!dict_sent) { - dict_sent = true; - - // object dictionaries for Mine1 pool... - QS_OBJ_DICTIONARY(&Mine1::inst[0]); - QS_OBJ_DICTIONARY(&Mine1::inst[1]); - QS_OBJ_DICTIONARY(&Mine1::inst[2]); - QS_OBJ_DICTIONARY(&Mine1::inst[3]); - QS_OBJ_DICTIONARY(&Mine1::inst[4]); - - // function dictionaries for Mine1 SM - QS_FUN_DICTIONARY(&Mine1::initial); - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::planted); - QS_FUN_DICTIONARY(&Mine1::exploding); - } - // local signals - QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Mine1::unused); - QS_FUN_DICTIONARY(&Mine1::used); - QS_FUN_DICTIONARY(&Mine1::exploding); - QS_FUN_DICTIONARY(&Mine1::planted); - - return tran(&unused); -} - -//${AOs::Mine1::SM::unused} .................................................. -Q_STATE_DEF(Mine1, unused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::unused::MINE_PLANT} - case MINE_PLANT_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&planted); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used} .................................................... -Q_STATE_DEF(Mine1, used) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used} - case Q_EXIT_SIG: { - // tell the Tunnel that this mine is becoming disabled - MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); - mev->id = MINE_ID(this); - AO_Tunnel->POST(mev, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine1::SM::used::MINE_RECYCLE} - case MINE_RECYCLE_SIG: { - status_ = tran(&unused); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used::exploding} ......................................... -Q_STATE_DEF(Mine1, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine1::SM::used::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine1::SM::used::exploding::TIME_TICK::[stillonscreen?]} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move explosion by 1 step - - // tell the Game to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 1U; // x of explosion - oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine1::SM::used::exploding::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -//${AOs::Mine1::SM::used::planted} ........................................... -Q_STATE_DEF(Mine1, planted) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine1::SM::used::planted::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine1::SM::used::planted::TIME_TICK::[m_x>=GAME_SPEED_X]} - if (m_x >= GAME_SPEED_X) { - m_x -= GAME_SPEED_X; // move the mine 1 step - // tell the Tunnel to draw the Mine - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); - oie->x = m_x; - oie->y = m_y; - oie->bmp = MINE1_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine1::SM::used::planted::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - //${AOs::Mine1::SM::used::planted::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine1::SM::used::planted::SHIP_IMG::[collisionwithMINE1_BMP?]} - if (BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y)) { - static MineEvt const mine1_hit(HIT_MINE_SIG, 1U); - AO_Ship->POST(&mine1_hit, this); - // go straight to 'disabled' and let the Ship do - // the exploding - status_ = tran(&unused); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Mine1::SM::used::planted::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine1::SM::used::planted::MISSILE_IMG::[collisionwithMINE1_BMP?]} - if (BSP::doBitmapsOverlap(MINE1_BMP, m_x, m_y, bmp, x, y)) { - static ScoreEvt const mine1_destroyed(DESTROYED_MINE_SIG, 25U); - AO_Missile->POST(&mine1_destroyed, this); - status_ = tran(&exploding); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Mine1} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/game-gui/mine2.cpp b/examples/qwin-gui/game-gui/mine2.cpp deleted file mode 100644 index 71e5d3b58..000000000 --- a/examples/qwin-gui/game-gui/mine2.cpp +++ /dev/null @@ -1,288 +0,0 @@ -//$file${.::mine2.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::mine2.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::mine2.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -Q_DEFINE_THIS_FILE - -// encapsulated declaration of the Mine2 HSM --------------------------------- -//$declare${AOs::Mine2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine2} .............................................................. -class Mine2 : public QP::QHsm { -private: - std::uint8_t m_x; - std::uint8_t m_y; - std::uint8_t m_exp_ctr; - -public: - static Mine2 inst[GAME_MINES_MAX]; - -public: - Mine2() - : QHsm(&initial) - {} - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(unused); - Q_STATE_DECL(used); - Q_STATE_DECL(exploding); - Q_STATE_DECL(planted); -}; // class Mine2 - -} // namespace GAME -//$enddecl${AOs::Mine2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -namespace GAME { - -// helper function to provide the ID of this mine ............................ -static inline std::uint8_t MINE_ID(Mine2 const * const me) { - return static_cast(me - &Mine2::inst[0]); -} - -} // namespace GAME - -// Mine1 class definition ---------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::Mine2_getInst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::Mine2_getInst} ................................................... -QP::QHsm * Mine2_getInst(std::uint8_t id) { - Q_REQUIRE(id < Q_DIM(Mine2::inst)); - return &Mine2::inst[id]; -} - -} // namespace GAME -//$enddef${Shared::Mine2_getInst} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Mine2} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Mine2} .............................................................. -Mine2 Mine2::inst[GAME_MINES_MAX]; - -//${AOs::Mine2::SM} .......................................................... -Q_STATE_DEF(Mine2, initial) { - //${AOs::Mine2::SM::initial} - static bool dict_sent = false; - if (!dict_sent) { - dict_sent = true; - // object dictionaries for Mine2 pool... - QS_OBJ_DICTIONARY(&Mine2::inst[0]); - QS_OBJ_DICTIONARY(&Mine2::inst[1]); - QS_OBJ_DICTIONARY(&Mine2::inst[2]); - QS_OBJ_DICTIONARY(&Mine2::inst[3]); - QS_OBJ_DICTIONARY(&Mine2::inst[4]); - - // function dictionaries for Mine2 SM... - QS_FUN_DICTIONARY(&Mine2::initial); - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::planted); - QS_FUN_DICTIONARY(&Mine2::exploding); - } - // local signals... - QS_SIG_DICTIONARY(MINE_PLANT_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Mine2::unused); - QS_FUN_DICTIONARY(&Mine2::used); - QS_FUN_DICTIONARY(&Mine2::exploding); - QS_FUN_DICTIONARY(&Mine2::planted); - - return tran(&unused); -} - -//${AOs::Mine2::SM::unused} .................................................. -Q_STATE_DEF(Mine2, unused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::unused::MINE_PLANT} - case MINE_PLANT_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&planted); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used} .................................................... -Q_STATE_DEF(Mine2, used) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used} - case Q_EXIT_SIG: { - // tell the Tunnel that this mine is becoming disabled - MineEvt *mev = Q_NEW(MineEvt, MINE_DISABLED_SIG); - mev->id = MINE_ID(this); - AO_Tunnel->POST(mev, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine2::SM::used::MINE_RECYCLE} - case MINE_RECYCLE_SIG: { - status_ = tran(&unused); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used::exploding} ......................................... -Q_STATE_DEF(Mine2, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Mine2::SM::used::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine2::SM::used::exploding::TIME_TICK::[stillonscreen?]} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move explosion by 1 step - - // tell the Game to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 1U; // x of explosion - oie->y = (int8_t)((int)m_y - 4 + 2); // y of explosion - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine2::SM::used::exploding::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -//${AOs::Mine2::SM::used::planted} ........................................... -Q_STATE_DEF(Mine2, planted) { - QP::QState status_; - switch (e->sig) { - //${AOs::Mine2::SM::used::planted::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Mine2::SM::used::planted::TIME_TICK::[m_x>=GAME_SPEED_X]} - if (m_x >= GAME_SPEED_X) { - m_x -= GAME_SPEED_X; // move the mine 1 step - // tell the Tunnel to draw the Mine - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, MINE_IMG_SIG); - oie->x = m_x; - oie->y = m_y; - oie->bmp = MINE2_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Mine2::SM::used::planted::TIME_TICK::[else]} - else { - status_ = tran(&unused); - } - break; - } - //${AOs::Mine2::SM::used::planted::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine2::SM::used::planted::SHIP_IMG::[collisionwithMINE2_BMP?]} - if (BSP::doBitmapsOverlap(MINE2_BMP, m_x, m_y, bmp, x, y)) { - static MineEvt const mine2_hit(HIT_MINE_SIG, 2U); - AO_Ship->POST(&mine2_hit, this); - // go straight to 'disabled' and let the Ship do - // the exploding - status_ = tran(&unused); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Mine2::SM::used::planted::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - uint8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - //${AOs::Mine2::SM::used::planted::MISSILE_IMG::[collisionwithMINE2_MISSILE_BMP?~} - if (BSP::doBitmapsOverlap(MINE2_MISSILE_BMP, m_x, m_y, bmp, x, y)) { - static ScoreEvt const mine2_destroyed(DESTROYED_MINE_SIG, 45U); - AO_Missile->POST(&mine2_destroyed, this); - status_ = tran(&exploding); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - default: { - status_ = super(&used); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Mine2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/game-gui/missile.cpp b/examples/qwin-gui/game-gui/missile.cpp deleted file mode 100644 index a1660a57b..000000000 --- a/examples/qwin-gui/game-gui/missile.cpp +++ /dev/null @@ -1,212 +0,0 @@ -//$file${.::missile.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::missile.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::missile.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -//$declare${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Missile} ............................................................ -class Missile : public QP::QActive { -private: - std::uint8_t m_x; - std::uint8_t m_y; - uint8_t m_exp_ctr; - -public: - static Missile inst; - -public: - Missile(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(armed); - Q_STATE_DECL(flying); - Q_STATE_DECL(exploding); -}; // class Missile - -} // namespace GAME -//$enddecl${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Missile} ...................................................... -QP::QActive * const AO_Missile = &Missile::inst; - -} // namespace GAME -//$enddef${Shared::AO_Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition -------------------------------------------------- -//$define${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Missile} ............................................................ -Missile Missile::inst; - -//${AOs::Missile::Missile} ................................................... -Missile::Missile() - : QActive(&initial) -{} - -//${AOs::Missile::SM} ........................................................ -Q_STATE_DEF(Missile, initial) { - //${AOs::Missile::SM::initial} - subscribe( TIME_TICK_SIG); - - // local signals... - QS_SIG_DICTIONARY(MISSILE_FIRE_SIG, this); - QS_SIG_DICTIONARY(HIT_WALL_SIG, this); - QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Missile::armed); - QS_FUN_DICTIONARY(&Missile::flying); - QS_FUN_DICTIONARY(&Missile::exploding); - - return tran(&armed); -} - -//${AOs::Missile::SM::armed} ................................................. -Q_STATE_DEF(Missile, armed) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::armed::MISSILE_FIRE} - case MISSILE_FIRE_SIG: { - m_x = Q_EVT_CAST(ObjectPosEvt)->x; - m_y = Q_EVT_CAST(ObjectPosEvt)->y; - status_ = tran(&flying); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Missile::SM::flying} ................................................ -Q_STATE_DEF(Missile, flying) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::flying::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Missile::SM::flying::TIME_TICK::[m_x+GAME_MISSILE_SPEED_Xx = m_x; - oie->y = m_y; - oie->bmp = MISSILE_BMP; - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Missile::SM::flying::TIME_TICK::[else]} - else { - status_ = tran(&armed); - } - break; - } - //${AOs::Missile::SM::flying::HIT_WALL} - case HIT_WALL_SIG: { - status_ = tran(&exploding); - break; - } - //${AOs::Missile::SM::flying::DESTROYED_MINE} - case DESTROYED_MINE_SIG: { - AO_Ship->POST(e, this); - status_ = tran(&armed); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Missile::SM::exploding} ............................................. -Q_STATE_DEF(Missile, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Missile::SM::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Missile::SM::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Missile::SM::exploding::TIME_TICK::[(m_x>=GAME_SPEED_X)&&(m_exp_ctr~} - if ((m_x >= GAME_SPEED_X) && (m_exp_ctr < 15U)) { - ++m_exp_ctr; // advance the explosion counter - m_x -= GAME_SPEED_X; // move the explosion by one step - - // tell the Tunnel to render the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->x = m_x + 3U; // x-pos of explosion - oie->y = (int8_t)((int)m_y - 4U); // y-pos - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Missile::SM::exploding::TIME_TICK::[else]} - else { - status_ = tran(&armed); - } - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/game-gui/resource.h b/examples/qwin-gui/game-gui/resource.h deleted file mode 100644 index 5276d9546..000000000 --- a/examples/qwin-gui/game-gui/resource.h +++ /dev/null @@ -1,43 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Resource.rc -// -#define IDD_APPLICATION 101 -#define IDC_LCD 111 -#define IDC_LED0 112 -#define IDC_LED1 113 -#define IDC_USER0 114 -#define IDC_USER1 115 -#define IDB_BACKGROUND 120 -#define IDB_BTN_UP 137 -#define IDB_BTN_DWN 138 -#define IDB_LCD 142 -#define IDB_LED_OFF 144 -#define IDB_LED_ON 145 -#define IDB_SEG 146 -#define IDB_SEG0 150 -#define IDB_SEG1 151 -#define IDB_SEG2 152 -#define IDB_SEG3 153 -#define IDB_SEG4 154 -#define IDB_SEG5 155 -#define IDB_SEG6 156 -#define IDB_SEG7 157 -#define IDB_SEG8 158 -#define IDB_SEG9 159 -#define IDC_SEG0 1020 -#define IDC_SEG1 1021 -#define IDC_SEG2 1022 -#define IDC_SEG3 1023 -#define IDS_APP_TITLE 40000 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 111 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1002 -#define _APS_NEXT_SYMED_VALUE 123 -#endif -#endif diff --git a/examples/qwin-gui/game-gui/ship.cpp b/examples/qwin-gui/game-gui/ship.cpp deleted file mode 100644 index e69d2aaca..000000000 --- a/examples/qwin-gui/game-gui/ship.cpp +++ /dev/null @@ -1,279 +0,0 @@ -//$file${.::ship.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::ship.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::ship.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" - -//Q_DEFINE_THIS_FILE - -#define SHIP_WIDTH 5U -#define SHIP_HEIGHT 3U - -// encapsulated declaration of the Ship active object ------------------------ -//$declare${AOs::Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Ship} ............................................................... -class Ship : public QP::QActive { -private: - std::uint8_t m_x; - std::uint16_t m_y; - std::uint8_t m_exp_ctr; - std::uint16_t m_score; - -public: - static Ship inst; - -public: - Ship(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(parked); - Q_STATE_DECL(flying); - Q_STATE_DECL(exploding); -}; // class Ship - -} // namespace GAME -//$enddecl${AOs::Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Ship} ......................................................... -QP::QActive * const AO_Ship = &Ship::inst; - -} // namespace GAME -//$enddef${Shared::AO_Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition -------------------------------------------------- -//$define${AOs::Ship} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Ship} ............................................................... -Ship Ship::inst; - -//${AOs::Ship::Ship} ......................................................... -Ship::Ship() - : QActive(&initial), - m_x(GAME_SHIP_X), - m_y(GAME_SHIP_Y << 2) -{} - -//${AOs::Ship::SM} ........................................................... -Q_STATE_DEF(Ship, initial) { - //${AOs::Ship::SM::initial} - subscribe(TIME_TICK_SIG); - subscribe(PLAYER_TRIGGER_SIG); - - // local signals... - QS_SIG_DICTIONARY(PLAYER_SHIP_MOVE_SIG, this); - QS_SIG_DICTIONARY(TAKE_OFF_SIG, this); - QS_SIG_DICTIONARY(HIT_WALL_SIG, this); - QS_SIG_DICTIONARY(HIT_MINE_SIG, this); - QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Ship::active); - QS_FUN_DICTIONARY(&Ship::parked); - QS_FUN_DICTIONARY(&Ship::flying); - QS_FUN_DICTIONARY(&Ship::exploding); - - return tran(&active); -} - -//${AOs::Ship::SM::active} ................................................... -Q_STATE_DEF(Ship, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::initial} - case Q_INIT_SIG: { - status_ = tran(&parked); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::parked} ........................................... -Q_STATE_DEF(Ship, parked) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::parked::TAKE_OFF} - case TAKE_OFF_SIG: { - status_ = tran(&flying); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::flying} ........................................... -Q_STATE_DEF(Ship, flying) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::flying} - case Q_ENTRY_SIG: { - m_score = 0U; // reset the score - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); - - // launch the ship from the initial position - m_x = GAME_SHIP_X; - m_y = (GAME_SHIP_Y << 2); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::TIME_TICK} - case TIME_TICK_SIG: { - if (BSP::isThrottle()) { - if (m_y > 0U) { - m_y -= 1U; - } - } - else { - if (m_y < (GAME_TUNNEL_HEIGHT << 2)) { - m_y += 1U; - } - } - - // tell the Tunnel to draw the Ship and test for hits - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, SHIP_IMG_SIG); - oie->x = m_x; - oie->y = m_y >> 2; - oie->bmp = SHIP_BMP; - AO_Tunnel->POST(oie, this); - - ++m_score; // increment the score for surviving another tick - - if ((m_score % 10U) == 0U) { // is the score "round"? - ScoreEvt *sev = Q_NEW(ScoreEvt, SCORE_SIG); - sev->score = m_score; - AO_Tunnel->POST(sev, this); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - ObjectPosEvt *ope = Q_NEW(ObjectPosEvt, MISSILE_FIRE_SIG); - ope->x = m_x; - ope->y = (m_y >> 2) + SHIP_HEIGHT - 1U; - AO_Missile->POST(ope, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::DESTROYED_MINE} - case DESTROYED_MINE_SIG: { - m_score += Q_EVT_CAST(ScoreEvt)->score; - // the score will be sent to the Tunnel by the next TIME_TICK - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::flying::HIT_WALL} - case HIT_WALL_SIG: { - status_ = tran(&exploding); - break; - } - //${AOs::Ship::SM::active::flying::HIT_MINE} - case HIT_MINE_SIG: { - status_ = tran(&exploding); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Ship::SM::active::exploding} ........................................ -Q_STATE_DEF(Ship, exploding) { - QP::QState status_; - switch (e->sig) { - //${AOs::Ship::SM::active::exploding} - case Q_ENTRY_SIG: { - m_exp_ctr = 0U; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Ship::SM::active::exploding::TIME_TICK} - case TIME_TICK_SIG: { - //${AOs::Ship::SM::active::exploding::TIME_TICK::[m_exp_ctr<15U]} - if (m_exp_ctr < 15U) { - ++m_exp_ctr; - // tell the Tunnel to draw the current stage of Explosion - ObjectImageEvt *oie = Q_NEW(ObjectImageEvt, EXPLOSION_SIG); - oie->bmp = EXPLOSION0_BMP + (m_exp_ctr >> 2); - oie->x = m_x; // x of explosion - oie->y = (int8_t)((int)(m_y >> 2) - 4U + SHIP_HEIGHT); - AO_Tunnel->POST(oie, this); - status_ = Q_RET_HANDLED; - } - //${AOs::Ship::SM::active::exploding::TIME_TICK::[else]} - else { - ScoreEvt *gameOver = Q_NEW(ScoreEvt, GAME_OVER_SIG); - gameOver->score = m_score; - AO_Tunnel->POST(gameOver, this); - status_ = tran(&parked); - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Ship} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/qwin-gui/game-gui/tunnel.cpp b/examples/qwin-gui/game-gui/tunnel.cpp deleted file mode 100644 index 1c6447e0f..000000000 --- a/examples/qwin-gui/game-gui/tunnel.cpp +++ /dev/null @@ -1,674 +0,0 @@ -//$file${.::tunnel.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: game.qm -// File: ${.::tunnel.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::tunnel.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "game.hpp" -#include // for memmove() and memcpy() - -Q_DEFINE_THIS_FILE - -// declaration of the Tunnel AO ---------------------------------------------- -//$declare${AOs::Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Tunnel} ............................................................. -class Tunnel : public QP::QActive { -private: - QP::QTimeEvt m_blinkTimeEvt; - QP::QTimeEvt m_screenTimeEvt; - QP::QHsm * m_mines[GAME_MINES_MAX]; - QP::QHsm * m_mine1_pool[GAME_MINES_MAX]; - QP::QHsm * m_mine2_pool[GAME_MINES_MAX]; - std::uint8_t m_blink_ctr; - std::uint8_t m_last_mine_x; - std::uint8_t m_last_mine_y; - std::uint8_t m_wall_thickness_top; - std::uint8_t m_wall_thickness_bottom; - std::uint8_t m_wall_gap; - -public: - static Tunnel inst; - -public: - Tunnel(); - void advance(); - -private: - void plantMine(); - void dispatchToAllMines(QP::QEvt const * e); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(show_logo); - Q_STATE_DECL(demo); - Q_STATE_DECL(playing); - Q_STATE_DECL(game_over); - Q_STATE_DECL(screen_saver); - Q_STATE_DECL(screen_saver_hide); - Q_STATE_DECL(screen_saver_show); - Q_STATE_DECL(final); -}; // class Tunnel - -} // namespace GAME -//$enddecl${AOs::Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Public-scope shared objects ----------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${Shared::AO_Tunnel} ....................................................... -QP::QActive * const AO_Tunnel = &Tunnel::inst; - -} // namespace GAME -//$enddef${Shared::AO_Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -// Active object definition ================================================== -//$define${AOs::Tunnel} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace GAME { - -//${AOs::Tunnel} ............................................................. -Tunnel Tunnel::inst; - -//${AOs::Tunnel::Tunnel} ..................................................... -Tunnel::Tunnel() - : QActive(&initial), - m_blinkTimeEvt(this, BLINK_TIMEOUT_SIG, 0U), - m_screenTimeEvt(this, SCREEN_TIMEOUT_SIG, 0U), - m_last_mine_x(0U), m_last_mine_y(0U) -{ - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n] = Mine1_getInst(n); // initialize mine1-type pool - m_mine2_pool[n] = Mine2_getInst(n); // initialize mine2-type pool - m_mines[n] = nullptr; // mine 'n' is unused - } -} - -//${AOs::Tunnel::advance} .................................................... -void Tunnel::advance() { - uint32_t rnd = (BSP::random() & 0xFFU); - - // reduce the top wall thickness 18.75% of the time - if ((rnd < 48U) && (m_wall_thickness_top > 0U)) { - --m_wall_thickness_top; - } - - // reduce the bottom wall thickness 18.75% of the time - if ((rnd > 208U) && (m_wall_thickness_bottom > 0U)) { - --m_wall_thickness_bottom; - } - - rnd = (BSP::random() & 0xFFU); - - // grow the bottom wall thickness 19.14% of the time - if ((rnd < 49U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) - { - ++m_wall_thickness_bottom; - } - - // grow the top wall thickness 19.14% of the time - if ((rnd > 207U) - && ((GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom) > m_wall_gap)) - { - ++m_wall_thickness_top; - } - - // advance the Tunnel by 1 game step to the left - // and copy the Tunnel layer to the main frame buffer - // - BSP::advanceWalls(m_wall_thickness_top, m_wall_thickness_bottom); -} - -//${AOs::Tunnel::plantMine} .................................................. -void Tunnel::plantMine() { - uint32_t rnd = (BSP::random() & 0xFFU); - - if (m_last_mine_x > 0U) { - --m_last_mine_x; // shift the last Mine 1 position to the left - } - // last mine far enough? - if ((m_last_mine_x + GAME_MINES_DIST_MIN < GAME_TUNNEL_WIDTH) - && (rnd < 8U)) // place the mines only 5% of the time - { - uint8_t n; - for (n = 0U; n < Q_DIM(m_mines); ++n) { // look for disabled mines - if (m_mines[n] == nullptr) { - break; - } - } - if (n < Q_DIM(m_mines)) { // a disabled Mine found? - rnd = (BSP::random() & 0xFFFFU); - - if ((rnd & 1U) == 0U) { // choose the type of the mine - m_mines[n] = m_mine1_pool[n]; - } - else { - m_mines[n] = m_mine2_pool[n]; - } - - // new Mine is planted by the end of the tunnel - m_last_mine_x = GAME_TUNNEL_WIDTH - 8U; - - // choose a random y-position for the Mine in the Tunnel - rnd %= (GAME_TUNNEL_HEIGHT - - m_wall_thickness_top - - m_wall_thickness_bottom - 4U); - m_last_mine_y = (uint8_t)(m_wall_thickness_top + 2U + rnd); - - // evt to dispatch to the Mine - ObjectPosEvt const ope(MINE_PLANT_SIG, m_last_mine_x, m_last_mine_y); - m_mines[n]->dispatch(&ope, getPrio()); // direct dispatch - } - } -} - -//${AOs::Tunnel::dispatchToAllMines} ......................................... -void Tunnel::dispatchToAllMines(QP::QEvt const * e) { - for (uint8_t n = 0U; n < GAME_MINES_MAX; ++n) { - if (m_mines[n] != nullptr) { // is the mine used? - m_mines[n]->dispatch(e, getPrio()); - } - } -} - -//${AOs::Tunnel::SM} ......................................................... -Q_STATE_DEF(Tunnel, initial) { - //${AOs::Tunnel::SM::initial} - for (uint8_t n = 0; n < GAME_MINES_MAX; ++n) { - m_mine1_pool[n]->init(getPrio()); // take the initial tran. for Mine1 - m_mine2_pool[n]->init(getPrio()); // take the initial tran. for Mine2 - } - - BSP::randomSeed(1234U); // seed the pseudo-random generator - - subscribe(TIME_TICK_SIG); - subscribe(PLAYER_TRIGGER_SIG); - subscribe(PLAYER_QUIT_SIG); - - // object dictionary for Tunnel object... - QS_OBJ_DICTIONARY(&Tunnel::inst.m_blinkTimeEvt); - QS_OBJ_DICTIONARY(&Tunnel::inst.m_screenTimeEvt); - - // local signals... - QS_SIG_DICTIONARY(BLINK_TIMEOUT_SIG, this); - QS_SIG_DICTIONARY(SCREEN_TIMEOUT_SIG, this); - QS_SIG_DICTIONARY(SHIP_IMG_SIG, this); - QS_SIG_DICTIONARY(MISSILE_IMG_SIG, this); - QS_SIG_DICTIONARY(MINE_IMG_SIG, this); - QS_SIG_DICTIONARY(MINE_DISABLED_SIG, this); - QS_SIG_DICTIONARY(EXPLOSION_SIG, this); - QS_SIG_DICTIONARY(SCORE_SIG, this); - - (void)e; // unused parameter - - QS_FUN_DICTIONARY(&Tunnel::active); - QS_FUN_DICTIONARY(&Tunnel::show_logo); - QS_FUN_DICTIONARY(&Tunnel::demo); - QS_FUN_DICTIONARY(&Tunnel::playing); - QS_FUN_DICTIONARY(&Tunnel::game_over); - QS_FUN_DICTIONARY(&Tunnel::screen_saver); - QS_FUN_DICTIONARY(&Tunnel::screen_saver_hide); - QS_FUN_DICTIONARY(&Tunnel::screen_saver_show); - QS_FUN_DICTIONARY(&Tunnel::final); - - return tran(&show_logo); -} - -//${AOs::Tunnel::SM::active} ................................................. -Q_STATE_DEF(Tunnel, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::MINE_DISABLED} - case MINE_DISABLED_SIG: { - Q_ASSERT((Q_EVT_CAST(MineEvt)->id < GAME_MINES_MAX) - && (m_mines[Q_EVT_CAST(MineEvt)->id] != nullptr)); - m_mines[Q_EVT_CAST(MineEvt)->id] = nullptr; - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::PLAYER_QUIT} - case PLAYER_QUIT_SIG: { - status_ = tran(&final); - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::show_logo} ...................................... -Q_STATE_DEF(Tunnel, show_logo) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::show_logo} - case Q_ENTRY_SIG: { - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 sec - m_blink_ctr = 0U; - BSP::paintString(24U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "Quantum LeAps"); - BSP::paintString(16U, (GAME_TUNNEL_HEIGHT / 2U) + 0U, "state-machine.com"); - - BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 18U, "Fire missile: BTN0"); - BSP::paintString(1U, GAME_TUNNEL_HEIGHT - 10U, "Fly ship up: BTN1"); - - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::show_logo} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::show_logo::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&demo); - break; - } - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; // toggle the blink counter - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT::[m_blink_ctr==0U]} - if (m_blink_ctr == 0U) { - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeAps"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - } - //${AOs::Tunnel::SM::active::show_logo::BLINK_TIMEOUT::[else]} - else { - BSP::paintString(24U + 8U*6U, (GAME_TUNNEL_HEIGHT / 2U) - 8U, "LeaPs"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - } - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::demo} ........................................... -Q_STATE_DEF(Tunnel, demo) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::demo} - case Q_ENTRY_SIG: { - m_last_mine_x = 0U; // last mine at right edge of the tunnel - m_last_mine_y = 0U; - // set the tunnel properties... - m_wall_thickness_top = 0U; - m_wall_thickness_bottom = 0U; - m_wall_gap = GAME_WALLS_GAP_Y; - - BSP::clearWalls(); // erase the tunnel walls - - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*20U, 0U); // in 20 sec - - m_blink_ctr = 0U; // init the blink counter - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; /* toggle the blink counter */ - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver); - break; - } - //${AOs::Tunnel::SM::active::demo::TIME_TICK} - case TIME_TICK_SIG: { - advance(); - if (m_blink_ctr != 0U) { - // add the text into the frame buffer - BSP::paintString((GAME_TUNNEL_WIDTH - 10U*6U)/2U, - (GAME_TUNNEL_HEIGHT - 4U)/2U, - "Press BTN0"); - } - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::demo::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - status_ = tran(&playing); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::playing} ........................................ -Q_STATE_DEF(Tunnel, playing) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::playing} - case Q_ENTRY_SIG: { - static QP::QEvt const takeoff(TAKE_OFF_SIG); - m_wall_gap = GAME_WALLS_GAP_Y; - AO_Ship->POST(&takeoff, this); // post the TAKEOFF sig - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing} - case Q_EXIT_SIG: { - static QP::QEvt const recycle(MINE_RECYCLE_SIG); - dispatchToAllMines(&recycle); // recycle all Mines - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::TIME_TICK} - case TIME_TICK_SIG: { - // render this frame on the display - BSP::updateScreen(); - advance(); - plantMine(); - dispatchToAllMines(e); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::SHIP_IMG} - case SHIP_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - // did the Ship/Missile hit the tunnel wall? - if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Ship->POST(&hit, this); - } - BSP::paintBitmap(x, y, bmp); - dispatchToAllMines(e); // let Mines check for hits - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::MISSILE_IMG} - case MISSILE_IMG_SIG: { - uint8_t x = Q_EVT_CAST(ObjectImageEvt)->x; - int8_t y = Q_EVT_CAST(ObjectImageEvt)->y; - uint8_t bmp = Q_EVT_CAST(ObjectImageEvt)->bmp; - - // did the Ship/Missile hit the tunnel wall? - if (BSP::isWallHit(bmp, x, y)) { - static QP::QEvt const hit(HIT_WALL_SIG); - AO_Missile->POST(&hit, this); - } - BSP::paintBitmap(x, y, bmp); - dispatchToAllMines(e); // let Mines check for hits - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::MINE_IMG} - case MINE_IMG_SIG: { - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::EXPLOSION} - case EXPLOSION_SIG: { - BSP::paintBitmap(Q_EVT_CAST(ObjectImageEvt)->x, - Q_EVT_CAST(ObjectImageEvt)->y, - Q_EVT_CAST(ObjectImageEvt)->bmp); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::SCORE} - case SCORE_SIG: { - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); - // increase difficulty of the game: - // the tunnel gets narrower as the score goes up - // - m_wall_gap = (uint8_t)(GAME_WALLS_GAP_Y - - Q_EVT_CAST(ScoreEvt)->score/100U); - if (m_wall_gap < GAME_WALLS_MIN_GAP_Y) { - m_wall_gap = GAME_WALLS_MIN_GAP_Y; - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::playing::GAME_OVER} - case GAME_OVER_SIG: { - BSP::clearWalls(); - BSP::updateScore(Q_EVT_CAST(ScoreEvt)->score); - BSP::updateScreen(); - status_ = tran(&game_over); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::game_over} ...................................... -Q_STATE_DEF(Tunnel, game_over) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::game_over} - case Q_ENTRY_SIG: { - m_blinkTimeEvt.armX(BSP::TICKS_PER_SEC/2U, - BSP::TICKS_PER_SEC/2U); // every 1/2 sec - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*5U, 0U); // in 5 se - m_blink_ctr = 0U; - BSP::paintString((GAME_TUNNEL_WIDTH - 6U * 9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - "Game Over"); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over} - case Q_EXIT_SIG: { - m_blinkTimeEvt.disarm(); - m_screenTimeEvt.disarm(); - BSP::updateScore(0U); // update the score on the display - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over::BLINK_TIMEOUT} - case BLINK_TIMEOUT_SIG: { - m_blink_ctr ^= 1U; // toggle the blink counter - BSP::paintString((GAME_TUNNEL_WIDTH - 6U*9U) / 2U, - (GAME_TUNNEL_HEIGHT / 2U) - 4U, - ((m_blink_ctr == 0U) - ? "Game Over" - : " ")); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::game_over::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&demo); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver} ................................... -Q_STATE_DEF(Tunnel, screen_saver) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::initial} - case Q_INIT_SIG: { - status_ = tran(&screen_saver_hide); - break; - } - //${AOs::Tunnel::SM::active::screen_saver::PLAYER_TRIGGER} - case PLAYER_TRIGGER_SIG: { - status_ = tran(&demo); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} ................ -Q_STATE_DEF(Tunnel, screen_saver_hide) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} - case Q_ENTRY_SIG: { - BSP::displayOff(); // power down the display - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC*3U, 0U); // in 3 sec - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hide} - case Q_EXIT_SIG: { - m_screenTimeEvt.disarm(); - BSP::displayOn(); // power up the display - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_hid~::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver_show); - break; - } - default: { - status_ = super(&screen_saver); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} ................ -Q_STATE_DEF(Tunnel, screen_saver_show) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} - case Q_ENTRY_SIG: { - BSP::clearFB(); // clear the screen frame buffer - uint32_t rnd = BSP::random(); - BSP::paintString((uint8_t)(rnd % (GAME_TUNNEL_WIDTH - 10U*6U)), - (uint8_t) (rnd % (GAME_TUNNEL_HEIGHT - 8U)), - "Press BTN0"); - BSP::updateScreen(); - m_screenTimeEvt.armX(BSP::TICKS_PER_SEC/3U, 0U); // in 1/3 sec - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_show} - case Q_EXIT_SIG: { - m_screenTimeEvt.disarm(); - BSP::clearFB(); - BSP::updateScreen(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Tunnel::SM::active::screen_saver::screen_saver_sho~::SCREEN_TIMEOUT} - case SCREEN_TIMEOUT_SIG: { - status_ = tran(&screen_saver_hide); - break; - } - default: { - status_ = super(&screen_saver); - break; - } - } - return status_; -} - -//${AOs::Tunnel::SM::final} .................................................. -Q_STATE_DEF(Tunnel, final) { - QP::QState status_; - switch (e->sig) { - //${AOs::Tunnel::SM::final} - case Q_ENTRY_SIG: { - BSP::clearFB(); - BSP::updateScreen(); - QP::QF::stop(); // stop QF and cleanup - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace GAME -//$enddef${AOs::Tunnel} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp deleted file mode 100644 index f42af3f51..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp +++ /dev/null @@ -1,451 +0,0 @@ -//============================================================================ -// DPP example, EK-TM4C123GXL board, ThreadX RTOS -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_clock_tick = { QP::QS_AP_ID }; - - // ThreadX "idle" thread for QS output, see NOTE1 - static TX_THREAD idle_thread; - static ULONG idle_thread_stack[100]; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -static TX_TIMER l_tick_timer; // ThreadX timer to call QTimeEvt::TICKX_() -static VOID timer_expiration(ULONG id); // prototype -static VOID timer_expiration(ULONG id) { - QP::QTimeEvt::TICK_X(id, &l_clock_tick); // QF clock tick processing -} - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs and ThreadX IRS callbacks used in the application ==================== - -//............................................................................ -#ifdef Q_SPY - -//............................................................................ -static void idle_thread_fun(ULONG /*thread_input*/); // prototype -static void idle_thread_fun(ULONG /*thread_input*/) { // see NOTE1 - for (;;) { - QF_CRIT_STAT - - QF_CRIT_ENTRY(); - QP::QS::rxParse(); // parse all the received bytes - QF_CRIT_EXIT(); - - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_CRIT_ENTRY(); - std::uint8_t const *block = QP::QS::getBlock(&fifo); - QF_CRIT_EXIT(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } - - // no blocking in this "idle" thread; see NOTE1 - } -} - -//............................................................................ -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the or QP and is not disabled. Such ISRs don't cannot call any -// ThreadX or QP APIs. -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - uint32_t b = UART0->DR; - QP::QS::rxPut(b); - } -} - -#endif // Q_SPY - - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: VFP (hardware Floating Point) unit is configured by ThreadX - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - // seed the random number generator - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_clock_tick); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: l_rndSeed is SHARED among the Philo AOs, but does not need - // to be protected because all Philos have the same ThreadX preemption - // threshold, so they cannot preempt each other. - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // NOTE: - // This application uses the ThreadX timer to periodically call - // the QTimeEvt::TICK_X(0). Here, only the clock tick rate of 0 - // is used, but other timers can be used to call QTimeEvt::TICK_X(0) - // for other clock tick rates, if needed. - // - // The choice of a ThreadX timer is not the only option. Applications - // might choose to call QTimeEvt::TICK_X(0) directly from timer interrupts - // or from active object(s). - // - UINT tx_err = tx_timer_create(&l_tick_timer, // ThreadX timer object - const_cast("TICK0"), // name of the timer - &timer_expiration, // expiration function - 0U, // expiration function input (tick rate) - 1U, // initial ticks - 1U, // reschedule ticks - TX_AUTO_ACTIVATE); - Q_ASSERT(tx_err == TX_SUCCESS); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART0 interrupt used for QS-RX - - // start a ThreadX "idle" thread. See NOTE1... - tx_err = tx_thread_create(&idle_thread, // thread control block - const_cast("idle"), // thread name - &idle_thread_fun, // thread function - 0LU, // thread input (unused) - idle_thread_stack, // stack start - sizeof(idle_thread_stack), // stack size in bytes - TX_MAX_PRIORITIES - 1U, // ThreadX priority (LOWEST possible), NOTE1 - TX_MAX_PRIORITIES - 1U, // preemption threshold disabled - TX_NO_TIME_SLICE, - TX_AUTO_START); - Q_ASSERT(tx_err == TX_SUCCESS); -#endif // Q_SPY -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - std::uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TXE not set - while ((UART0->FR & UART_FR_TXFE) == 0U) { - } - // place the byte in the UART DR register - UART0->DR = b; - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// ThreadX apparently does not have a concept of an "idle" thread, but -// it can be emulated by a regular, but NON-BLOCKING ThreadX thread of -// the lowest priority. -// -// In the Q_SPY configuration, this "idle" thread is used to perform -// the QS data output to the host. This is not the only choice available, and -// other applications might choose to perform the QS output some other way. -// - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index a378531b1..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example, ThreadX RTOS -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -// embOS tick rate -constexpr std::uint32_t TICKS_PER_SEC {TX_TIMER_TICKS_PER_SECOND}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp deleted file mode 100644 index 5aec9d563..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm deleted file mode 100644 index aaf5381f4..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd deleted file mode 100644 index 69698eab4..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp deleted file mode 100644 index 419a52270..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp +++ /dev/null @@ -1,3836 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\threadx\qf_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - ThreadX - - common - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_high_level.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_kernel_enter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_kernel_setup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_flush.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_front_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_receive.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_send_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_entry_exit_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_identify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_preemption_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_relinquish.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_reset.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_shell_entry.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_sleep.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_analyze.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_error_handler.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_error_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_preempt_check.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_terminate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_time_slice.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_time_slice_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_timeout.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_wait_abort.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_time_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_time_set.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_expiration_process.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_system_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_system_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_thread_entry.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_buffer_full_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_disable.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_enable.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_event_filter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_event_unfilter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_interrupt_control.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_isr_enter_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_isr_exit_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_object_register.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_object_unregister.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_user_event_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_set.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_set_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_flush.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_front_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_receive.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_send_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_ceiling_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_put_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_entry_exit_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_preemption_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_relinquish.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_reset.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_terminate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_time_slice_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_wait_abort.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_info_get.c - - - - port - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_iar.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_initialize_low_level.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_context_restore.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_context_save.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_control.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_disable.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_restore.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_schedule.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_stack_build.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_system_return.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_timer_interrupt.s - - - - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww deleted file mode 100644 index 461ce6e06..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp.ewp - - - - - diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf deleted file mode 100644 index 0fdfc4b30..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 2048; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/main.cpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/main.cpp deleted file mode 100644 index a83cb143c..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//============================================================================ -// Product: DPP example for ThreadX -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - tx_kernel_enter(); // transfer control to the ThreadX RTOS - return 0; // tx_kernel_enter() does not return -} -//............................................................................ -void tx_application_define(void * /*first_unused_memory*/) { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the Board Support Package - - // init publish-subscribe - static QP::QSubscrList l_subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(l_subscrSto, Q_DIM(l_subscrSto)); - - // init event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static ULONG philoStk[APP::N_PHILO][200]; // stacks for the Philos - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->setAttr(QP::THREAD_NAME_ATTR, "Philo"); - APP::AO_Philo[n]->start( - n + 1U, - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - philoStk[n], sizeof(philoStk[n])); - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static ULONG tableStk[200]; // stack for the Table - APP::AO_Table->setAttr(QP::THREAD_NAME_ATTR, "Table"); - APP::AO_Table->start( - APP::N_PHILO + 1U, - tableQueueSto, Q_DIM(tableQueueSto), - tableStk, sizeof(tableStk)); - - (void)QP::QF::run(); // run the QF application -} diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/philo.cpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/table.cpp b/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/threadx/arm-cm/dpp_ek-tm4c123gxl/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.cpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.cpp deleted file mode 100644 index d2d04457c..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.cpp +++ /dev/null @@ -1,485 +0,0 @@ -//============================================================================ -// DPP example, STM32F429 Discovery, ThreadX RTOS -// Last updated for version 7.3.2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "stm32f4xx.h" // CMSIS-compliant header file for the MCU used -#include "stm32f4xx_exti.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_usart.h" -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// Local-scope objects ------------------------------------------------------- -#define LED_GPIO_PORT GPIOD -#define LED_GPIO_CLK RCC_AHB1Periph_GPIOD - -#define LED4_PIN GPIO_Pin_12 -#define LED3_PIN GPIO_Pin_13 -#define LED5_PIN GPIO_Pin_14 -#define LED6_PIN GPIO_Pin_15 - -#define BTN_GPIO_PORT GPIOA -#define BTN_GPIO_CLK RCC_AHB1Periph_GPIOA -#define BTN_B1 GPIO_Pin_0 - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const l_clock_tick = { QP::QS_AP_ID }; - - // ThreadX "idle" thread for QS output, see NOTE1 - static TX_THREAD idle_thread; - static ULONG idle_thread_stack[100]; - - QP::QSTimeCtr QS_tickTime_; - QP::QSTimeCtr QS_tickPeriod_; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -static TX_TIMER l_tick_timer; // ThreadX timer to call QTimeEvt::TICKX_() -static VOID timer_expiration(ULONG id); // prototype -static VOID timer_expiration(ULONG id) { - QP::QTimeEvt::TICK_X(id, &l_clock_tick); // QF clock tick processing - -#ifdef Q_SPY - std::uint32_t volatile tmp = SysTick->CTRL; // clear SysTick_CTRL_COUNTFLAG - QS_tickTime_ += QS_tickPeriod_; // account for the clock rollover -#endif -} - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // turn LED on - LED_GPIO_PORT->BSRRL = LED4_PIN; - // for debugging, hang on in an endless loop... - for (;;) { - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// ISRs and ThreadX IRS callbacks used in the application ==================== - -//............................................................................ -#ifdef Q_SPY - -//............................................................................ -static void idle_thread_fun(ULONG /*thread_input*/); // prototype -static void idle_thread_fun(ULONG /*thread_input*/) { // see NOTE1 - for (;;) { - QF_CRIT_STAT - - QF_CRIT_ENTRY(); - // turn the LED6 on an off to visualize the QS activity - LED_GPIO_PORT->BSRRL = LED6_PIN; // turn LED on - __NOP(); // wait a little to actually see the LED glow - __NOP(); - __NOP(); - __NOP(); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - - QP::QS::rxParse(); // parse all the received bytes - QF_CRIT_EXIT(); - - if ((USART2->SR & 0x80U) != 0U) { // is TXE empty? - QF_CRIT_ENTRY(); - std::uint16_t b = QP::QS::getByte(); - QF_CRIT_EXIT(); - - if (b != QS_EOD) { // not End-Of-Data? - USART2->DR = b; // put into the DR register - } - } - - // no blocking in this "idle" thread; see NOTE1 - } -} - -//............................................................................ -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the or QP and is not disabled. Such ISRs don't cannot call any -// ThreadX or QP APIs. -// -//TBD... - -#endif // Q_SPY - - -} // extern "C" - -// BSP functions ============================================================= -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: VFP (hardware Floating Point) unit is configured by ThreadX - - // Initialize port for the LEDs - RCC_AHB1PeriphClockCmd(LED_GPIO_CLK , ENABLE); - - // GPIO Configuration for the LEDs... - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Mode = GPIO_Mode_OUT; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_struct.GPIO_Pin = LED3_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED4_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED5_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED off - - GPIO_struct.GPIO_Pin = LED6_PIN; - GPIO_Init(LED_GPIO_PORT, &GPIO_struct); - LED_GPIO_PORT->BSRRH = LED6_PIN; // turn LED off - - // Initialize thr port for Button - RCC_AHB1PeriphClockCmd(BTN_GPIO_CLK , ENABLE); - - // GPIO Configuration for the Button... - GPIO_struct.GPIO_Pin = BTN_B1; - GPIO_struct.GPIO_Mode = GPIO_Mode_IN; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(BTN_GPIO_PORT, &GPIO_struct); - - // seed the random number generator - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_clock_tick); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'h') { - LED_GPIO_PORT->BSRRL = LED3_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED3_PIN; // turn LED off - } - if (stat[0] == 'e') { - LED_GPIO_PORT->BSRRL = LED5_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED5_PIN; // turn LED on - } - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - if (paused) { - LED_GPIO_PORT->BSRRL = LED4_PIN; // turn LED on - } - else { - LED_GPIO_PORT->BSRRH = LED4_PIN; // turn LED off - } - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // NOTE: l_rndSeed is SHARED among the Philo AOs, but does not need - // to be protected because all Philos have the same ThreadX preemption - // threshold, so they cannot preempt each other. - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void ledOn() { - LED_GPIO_PORT->BSRRL = LED3_PIN; -} -//............................................................................ -void ledOff() { - LED_GPIO_PORT->BSRRH = LED3_PIN; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // NOTE: - // This application uses the ThreadX timer to periodically call - // the QTimeEvt::TICK_X(0). Here, only the clock tick rate of 0 - // is used, but other timers can be used to call QTimeEvt::TICK_X(0) - // for other clock tick rates, if needed. - // - // The choice of a ThreadX timer is not the only option. Applications - // might choose to call QTimeEvt::TICK_X(0) directly from timer interrupts - // or from active object(s). - // - UINT tx_err = tx_timer_create(&l_tick_timer, // ThreadX timer object - const_cast("TICK0"), // name of the timer - &timer_expiration, // expiration function - 0U, // expiration function input (tick rate) - 1U, // initial ticks - 1U, // reschedule ticks - TX_AUTO_ACTIVATE); - Q_ASSERT(tx_err == TX_SUCCESS); - -#ifdef Q_SPY - //TBD: enable the UART ISR for receiving bytes... - - // start a ThreadX "idle" thread. See NOTE1... - tx_err = tx_thread_create(&idle_thread, // thread control block - const_cast("idle"), // thread name - &idle_thread_fun, // thread function - 0LU, // thread input (unused) - idle_thread_stack, // stack start - sizeof(idle_thread_stack), // stack size in bytes - TX_MAX_PRIORITIES - 1U, // ThreadX priority (LOWEST possible), NOTE1 - TX_MAX_PRIORITIES - 1U, // preemption threshold disabled - TX_NO_TIME_SLICE, - TX_AUTO_START); - Q_ASSERT(tx_err == TX_SUCCESS); -#endif // Q_SPY -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - //TBD initialize the QS-RX channel... - - // enable peripheral clock for USART2 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - - // GPIOA clock enable - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - // GPIOA Configuration: USART2 TX on PA2 - GPIO_InitTypeDef GPIO_struct; - GPIO_struct.GPIO_Pin = GPIO_Pin_2; - GPIO_struct.GPIO_Mode = GPIO_Mode_AF; - GPIO_struct.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_struct.GPIO_OType = GPIO_OType_PP; - GPIO_struct.GPIO_PuPd = GPIO_PuPd_UP ; - GPIO_Init(GPIOA, &GPIO_struct); - - // Connect USART2 pins to AF2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX = PA2 - GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX = PA3 - - USART_InitTypeDef USART_struct; - USART_struct.USART_BaudRate = 115200U; - USART_struct.USART_WordLength = USART_WordLength_8b; - USART_struct.USART_StopBits = USART_StopBits_1; - USART_struct.USART_Parity = USART_Parity_No; - USART_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_struct.USART_Mode = USART_Mode_Tx; - USART_Init(USART2, &USART_struct); - - USART_Cmd(USART2, ENABLE); // enable USART2 - - // configure UART interrupts (for the RX channel) - //TBD... - - QS_tickPeriod_ = SystemCoreClock / BSP::TICKS_PER_SEC; - QS_tickTime_ = QS_tickPeriod_; // to start the timestamp at zero - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) { // not set? - return QS_tickTime_ - (QSTimeCtr)SysTick->VAL; - } - else { // the rollover occurred, but the SysTick_ISR did not run yet - return QS_tickTime_ + QS_tickPeriod_ - (QSTimeCtr)SysTick->VAL; - } -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TXE not set - while ((USART2->SR & USART_FLAG_TXE) == 0U) { - } - // place the byte in the UART DR register - USART2->DR = b; - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// ThreadX apparently does not have a concept of an "idle" thread, but -// it can be emulated by a regular, but NON-BLOCKING ThreadX thread of -// the lowest priority. -// -// In the Q_SPY configuration, this "idle" thread is used to perform -// the QS data output to the host. This is not the only choice available, and -// other applications might choose to perform the QS output some other way. -// - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.hpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.hpp deleted file mode 100644 index a378531b1..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: BSP for DPP example, ThreadX RTOS -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -// embOS tick rate -constexpr std::uint32_t TICKS_PER_SEC {TX_TIMER_TICKS_PER_SECOND}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.hpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.qm b/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewd b/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewd deleted file mode 100644 index 7ca73910e..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewp deleted file mode 100644 index 8ae9d81bd..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.ewp +++ /dev/null @@ -1,3857 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\threadx\qf_port.cpp - - - $PROJ_DIR$\..\..\..\..\..\ports\threadx\qp_port.hpp - - - $PROJ_DIR$\..\..\..\..\..\ports\threadx\qs_port.hpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - stm32f4-discovery - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\iar\startup_stm32f4xx.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\stm32f4xx.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_exti.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_gpio.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_rcc.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\src\stm32f4xx_usart.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\stm32f4-discovery\system_stm32f4xx.h - - - - ThreadX - - common - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_block_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_high_level.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_kernel_enter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_initialize_kernel_setup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_mutex_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_cleanup.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_flush.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_front_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_receive.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_queue_send_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_entry_exit_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_identify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_preemption_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_relinquish.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_reset.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_shell_entry.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_sleep.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_analyze.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_error_handler.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_stack_error_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_preempt_check.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_system_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_terminate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_time_slice.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_time_slice_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_timeout.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_thread_wait_abort.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_time_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_time_set.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_expiration_process.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_performance_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_performance_system_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_system_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_system_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_timer_thread_entry.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_buffer_full_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_disable.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_enable.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_event_filter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_event_unfilter.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_initialize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_interrupt_control.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_isr_enter_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_isr_exit_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_object_register.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_object_unregister.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\tx_trace_user_event_insert.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_block_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_allocate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_pool_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_byte_release.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_set.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_event_flags_set_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_mutex_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_flush.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_front_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_receive.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_send.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_queue_send_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_ceiling_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_prioritize.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_put.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_semaphore_put_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_entry_exit_notify.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_info_get.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_preemption_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_priority_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_relinquish.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_reset.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_resume.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_suspend.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_terminate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_time_slice_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_thread_wait_abort.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_activate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_change.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_create.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_deactivate.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_delete.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\common\src\txe_timer_info_get.c - - - - port - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_iar.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_initialize_low_level.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_context_restore.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_context_save.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_control.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_disable.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_interrupt_restore.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_schedule.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_stack_build.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_thread_system_return.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\threadx\ports\cortex_m4\iar\src\tx_timer_interrupt.s - - - - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.eww b/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.eww deleted file mode 100644 index 461ce6e06..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp.ewp - - - - - diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.icf b/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.icf deleted file mode 100644 index 371a08a70..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/iar/dpp.icf +++ /dev/null @@ -1,31 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 512; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/main.cpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/main.cpp deleted file mode 100644 index a83cb143c..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//============================================================================ -// Product: DPP example for ThreadX -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-22 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" -#include "dpp.hpp" -#include "bsp.hpp" - -//............................................................................ -int main() { - tx_kernel_enter(); // transfer control to the ThreadX RTOS - return 0; // tx_kernel_enter() does not return -} -//............................................................................ -void tx_application_define(void * /*first_unused_memory*/) { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the Board Support Package - - // init publish-subscribe - static QP::QSubscrList l_subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(l_subscrSto, Q_DIM(l_subscrSto)); - - // init event pools... - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // start the active objects... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static ULONG philoStk[APP::N_PHILO][200]; // stacks for the Philos - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->setAttr(QP::THREAD_NAME_ATTR, "Philo"); - APP::AO_Philo[n]->start( - n + 1U, - philoQueueSto[n], Q_DIM(philoQueueSto[n]), - philoStk[n], sizeof(philoStk[n])); - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static ULONG tableStk[200]; // stack for the Table - APP::AO_Table->setAttr(QP::THREAD_NAME_ATTR, "Table"); - APP::AO_Table->start( - APP::N_PHILO + 1U, - tableQueueSto, Q_DIM(tableQueueSto), - tableStk, sizeof(tableStk)); - - (void)QP::QF::run(); // run the QF application -} diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/philo.cpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/threadx/arm-cm/dpp_stm32f429-discovery/table.cpp b/examples/threadx/arm-cm/dpp_stm32f429-discovery/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/threadx/arm-cm/dpp_stm32f429-discovery/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/uc-os2/arm-cm/README.txt b/examples/uc-os2/arm-cm/README.txt deleted file mode 100644 index 0a71f1ade..000000000 --- a/examples/uc-os2/arm-cm/README.txt +++ /dev/null @@ -1,31 +0,0 @@ -About uC-OS2 for ARM Cortex-M Examples -======================================= -This folder contains examples for uC-OS2 V2.93 running on ARM Cortex-M. -This uC-OS2 version has been released under the permissive Apache License, -Version 2.0 (see GitHub https://github.com/SiliconLabs/uC-OS2 ). - - -The Blinky Example ------------------- -The sub-folder blinky_ek-tm4c123gxl contains a simple "Blinky" example for -the EK-TM4C123GLX board (Cortex-M4F). This example shows a bare-bones -application coded by hand and without many features. The example contains -projects for the ARM (MDK-ARM) compiler and the IAR compiler. - - -The DPP Examples ----------------- -The sub-folders dpp_ek-tm4c123gxl and dpp_nucleo-l152re demonstrate -the Dining Philosopher Problem (DPP) for EK-TM4C123GLX board (Cortex-M4F) -and the STM32 NUCLEO-L152RE (Cortex-M3) boards, respectively. The DPP -example showcases most of the QP features and much of its code has been -generated automatically by the QM graphical modeling tool. The DPP examples -contain projects for the ARM (MDK-ARM) compiler and the IAR compiler. - - -uC-OS2 Source and QP-Port -========================= -The QP-Port to uC-OS2 is located in qpc\ports\uC-OS2 - -The uC-OS2 source code and ports are located in 3rd_party\uC-OS2. -Please make sure to read the README.md file found in that directory. diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/README.txt b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/README.txt deleted file mode 100644 index 732c9614e..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/README.txt +++ /dev/null @@ -1,36 +0,0 @@ -About this Example -================== -This directory contains the "Dining Philosophers Problem" (DPP) example -for uC/OS-II application running on the EK-TM4C123GXL board, a.k.a. TivaC -LauchPad (ARM Cortex-M4F). This directory contains portable code that -should compile with any C compiler for ARM Cortex-M. - -The sub-directories contain code and project files, which are specific to -the particular ARM toolchains, such as ARM (MDK-ARM) and IAR. - -Please refer to the README files in the sub-directories for specific -instructions how to use and customize the example to your needs. - - -Support Code for EK-TM4C123GXL Board -==================================== -The directory qpc\3rd_party\ek-tm4c123gxl contains the CMSIS-compliant -device code for the TM4C123GH6PM MCU (ARM Cortex-M4F). Please see the -README.txt file in this folder for more details. - - -QS Software Tracing Instrumentation -=================================== -This example provides the "Spy" build configuration, which outputs the QS -(Quantum Spy) software tracing data through UART0, which is connected to -the virtual COM port of the TI Stellaris debugger. - -The output is generated at 115200 baud rate. - -Here is an example invocation of the QSPY host application to receive -the QS data from EK-TM4C123GXL: - -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. diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/app_cfg.h b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/app_cfg.h deleted file mode 100644 index 411393e87..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/app_cfg.h +++ /dev/null @@ -1,113 +0,0 @@ -/*============================================================================ -* -* Quantum Leaps, LLC. www.state-machine.com -* Customized for EK-TM4C123GXL (ARM Cortex-M4F) -* 2020-06-08 -*===========================================================================*/ -/* -********************************************************************************************************* -* EXAMPLE CODE -* -* This file is provided as an example on how to use Micrium products. -* -* Please feel free to use any application code labeled as 'EXAMPLE CODE' in -* your application products. Example code may be used as is, in whole or in -* part, or may be used as a reference only. This file can be modified as -* required to meet the end-product requirements. -* -********************************************************************************************************* -*/ - -/* -********************************************************************************************************* -* -* APPLICATION CONFIGURATION -* -* EXAMPLE CODE -* -* Filename : app_cfg.h -********************************************************************************************************* -*/ - -#ifndef _APP_CFG_H_ -#define _APP_CFG_H_ - - -/* -********************************************************************************************************* -* INCLUDE FILES -********************************************************************************************************* -*/ - -#include -#include - - -/* -********************************************************************************************************* -* MODULE ENABLE / DISABLE -********************************************************************************************************* -*/ - - -/* -********************************************************************************************************* -* TASK PRIORITIES -********************************************************************************************************* -*/ - -#define APP_CFG_STARTUP_TASK_PRIO 3u - -#define OS_TASK_TMR_PRIO (OS_LOWEST_PRIO - 2u) - - -/* -********************************************************************************************************* -* TASK STACK SIZES -* Size of the task stacks (# of OS_STK entries) -********************************************************************************************************* -*/ - -#define APP_CFG_STARTUP_TASK_STK_SIZE 128u - - -/* -********************************************************************************************************* -* TRACE / DEBUG CONFIGURATION -********************************************************************************************************* -*/ - -#ifndef TRACE_LEVEL_OFF -#define TRACE_LEVEL_OFF 0u -#endif - -#ifndef TRACE_LEVEL_INFO -#define TRACE_LEVEL_INFO 1u -#endif - -#ifndef TRACE_LEVEL_DBG -#define TRACE_LEVEL_DBG 2u -#endif - -#define APP_TRACE_LEVEL TRACE_LEVEL_OFF -#define APP_TRACE printf - -#define APP_TRACE_INFO(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_INFO) ? (void)(APP_TRACE x) : (void)0) -#define APP_TRACE_DBG(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_DBG) ? (void)(APP_TRACE x) : (void)0) - - -/* -********************************************************************************************************* -* CPU PORT CONFIGURATION -********************************************************************************************************* -*/ -#define CPU_CFG_KA_IPL_BOUNDARY 4u -#define CPU_CFG_NVIC_PRIO_BITS 3u - -/* -********************************************************************************************************* -* MODULE END -********************************************************************************************************* -*/ - -#endif /* End of module include. */ diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx deleted file mode 100644 index 9cca7ce3d..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvoptx +++ /dev/null @@ -1,1191 +0,0 @@ - - - - 1.0 - -

    ### uVision Project, (C) Keil Software
    - - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp - 0 - - - - 0 - 0 - - - - dpp-dbg - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\dbg\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 0 - 1 - OSTCBPrioTbl - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-rel - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\rel\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 8 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E10259B -O4622 -S4 -FO61 - - - 0 - UL2CM3 - -O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - dpp-spy - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 1 - 0 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\spy\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 0 - - 4 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 19 - - - - - - - - - - - BIN\lmidk-agdi.dll - - - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - UL2CM3 - UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC1000 -FD20000000 -FF0TM4C123_256 -FL040000 -FS00 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM) - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - lmidk-agdi - -U0E2006F4 -O4622 -S4 -FO61 - - - - - - 1 - 2 - 0x20000200 - 0 - - - - - 2 - 0 - 0x400 - 0 - - - - 0 - - - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - - - - Applicatioin - 1 - 0 - 0 - 0 - - 1 - 1 - 5 - 0 - 0 - 0 - ..\app_cfg.h - app_cfg.h - 0 - 0 - - - 1 - 2 - 5 - 0 - 0 - 0 - ..\os_cfg.h - os_cfg.h - 0 - 0 - - - 1 - 3 - 8 - 0 - 0 - 0 - ..\bsp.cpp - bsp.cpp - 0 - 0 - - - 1 - 4 - 5 - 0 - 0 - 0 - ..\bsp.hpp - bsp.hpp - 0 - 0 - - - 1 - 5 - 5 - 0 - 0 - 0 - ..\dpp.hpp - dpp.hpp - 0 - 0 - - - 1 - 6 - 8 - 0 - 0 - 0 - ..\main.cpp - main.cpp - 0 - 0 - - - 1 - 7 - 8 - 0 - 0 - 0 - ..\philo.cpp - philo.cpp - 0 - 0 - - - 1 - 8 - 8 - 0 - 0 - 0 - ..\table.cpp - table.cpp - 0 - 0 - - - - - ek-tm4c123gxl - 1 - 0 - 0 - 0 - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - system_TM4C123GH6PM.c - 0 - 0 - - - 2 - 10 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - TM4C123GH6PM.h - 0 - 0 - - - 2 - 11 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - gpio.h - 0 - 0 - - - 2 - 12 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - rom.h - 0 - 0 - - - 2 - 13 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - sysctl.h - 0 - 0 - - - 2 - 14 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - system_TM4C123GH6PM.h - 0 - 0 - - - 2 - 15 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - startup_TM4C123GH6PM.s - 0 - 0 - - - - - QP - 1 - 0 - 0 - 0 - - 3 - 16 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_hsm.cpp - qep_hsm.cpp - 0 - 0 - - - 3 - 17 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qep_msm.cpp - qep_msm.cpp - 0 - 0 - - - 3 - 18 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_act.cpp - qf_act.cpp - 0 - 0 - - - 3 - 19 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_defer.cpp - qf_defer.cpp - 0 - 0 - - - 3 - 20 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_dyn.cpp - qf_dyn.cpp - 0 - 0 - - - 3 - 21 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_mem.cpp - qf_mem.cpp - 0 - 0 - - - 3 - 22 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_ps.cpp - qf_ps.cpp - 0 - 0 - - - 3 - 23 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qact.cpp - qf_qact.cpp - 0 - 0 - - - 3 - 24 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qeq.cpp - qf_qeq.cpp - 0 - 0 - - - 3 - 25 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_qmact.cpp - qf_qmact.cpp - 0 - 0 - - - 3 - 26 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qf\qf_time.cpp - qf_time.cpp - 0 - 0 - - - - - QP_port - 1 - 0 - 0 - 0 - - 4 - 27 - 8 - 0 - 0 - 0 - ..\..\..\..\..\ports\uc-os2\qf_port.cpp - qf_port.cpp - 0 - 0 - - - - - QS - 1 - 0 - 0 - 0 - - 5 - 28 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs.cpp - qs.cpp - 0 - 0 - - - 5 - 29 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_64bit.cpp - qs_64bit.cpp - 0 - 0 - - - 5 - 30 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_fp.cpp - qs_fp.cpp - 0 - 0 - - - 5 - 31 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qs_rx.cpp - qs_rx.cpp - 0 - 0 - - - 5 - 32 - 8 - 0 - 0 - 0 - ..\..\..\..\..\src\qs\qstamp.cpp - qstamp.cpp - 0 - 0 - - - - - ucos-ii - 1 - 0 - 0 - 0 - - 6 - 33 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - os_core.c - 0 - 0 - - - 6 - 34 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - os_task.c - 0 - 0 - - - 6 - 35 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - os_flag.c - 0 - 0 - - - 6 - 36 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - os_mbox.c - 0 - 0 - - - 6 - 37 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - os_mem.c - 0 - 0 - - - 6 - 38 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - os_mutex.c - 0 - 0 - - - 6 - 39 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - os_q.c - 0 - 0 - - - 6 - 40 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - os_sem.c - 0 - 0 - - - 6 - 41 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - os_time.c - 0 - 0 - - - 6 - 42 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - os_tmr.c - 0 - 0 - - - - - ucos-ii_port - 1 - 0 - 0 - 0 - - 7 - 43 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - os_cpu_c.c - 0 - 0 - - - 7 - 44 - 5 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu.h - os_cpu.h - 0 - 0 - - - 7 - 45 - 2 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu_a.asm - os_cpu_a.asm - 0 - 0 - - - 7 - 46 - 1 - 0 - 0 - 0 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_dbg.c - os_dbg.c - 0 - 0 - - - - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx deleted file mode 100644 index ea6bd223d..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/armclang/dpp.uvprojx +++ /dev/null @@ -1,2078 +0,0 @@ - - - - 2.1 - -
    ### uVision Project, (C) Keil Software
    - - - - dpp-dbg - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\dbg\ - dpp - 1 - 0 - 0 - 1 - 1 - .\dbg\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\dbg\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\dbg\dpp.bin .\dbg\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\uc-os2;..\..\..\..\..\3rd_party\uC-OS2\Source;..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - app_cfg.h - 5 - ..\app_cfg.h - - - os_cfg.h - 5 - ..\os_cfg.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\uc-os2\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - ucos-ii - - - os_core.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - - - os_task.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - - - os_flag.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - - - os_mbox.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - - - os_mem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - - - os_mutex.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - - - os_q.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - - - os_sem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - - - os_time.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - - - os_tmr.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - - - - - ucos-ii_port - - - os_cpu_c.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - - - os_cpu.h - 5 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu.h - - - os_cpu_a.asm - 2 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu_a.asm - - - os_dbg.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_dbg.c - - - - - - - dpp-rel - 0x4 - ARM-ADS - 6130001::V6.13.1::.\ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\rel\ - dpp - 1 - 0 - 0 - 0 - 0 - .\rel\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\rel\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\rel\dpp.bin .\rel\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - NDEBUG - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\uc-os2;..\..\..\..\..\3rd_party\uC-OS2\Source;..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - dpp-qv.sct - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - app_cfg.h - 5 - ..\app_cfg.h - - - os_cfg.h - 5 - ..\os_cfg.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\uc-os2\qf_port.cpp - - - - - QS - - - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - - - - - - - - - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - - - - - - - - - - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - ucos-ii - - - os_core.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - - - os_task.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - - - os_flag.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - - - os_mbox.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - - - os_mem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - - - os_mutex.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - - - os_q.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - - - os_sem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - - - os_time.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - - - os_tmr.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - - - - - ucos-ii_port - - - os_cpu_c.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - - - os_cpu.h - 5 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu.h - - - os_cpu_a.asm - 2 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu_a.asm - - - os_dbg.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_dbg.c - - - - - - - dpp-spy - 0x4 - ARM-ADS - 6160000::V6.16::ARMCLANG - 1 - - - TM4C123GH6PM - Texas Instruments - Keil.TM4C_DFP.1.1.0 - http://www.keil.com/pack/ - IROM(0x00000000,0x040000) IRAM(0x20000000,0x008000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C123_256 -FS00 -FL040000 -FP0($$Device:TM4C123GH6PM$Flash\TM4C123_256.FLM)) - 0 - $$Device:TM4C123GH6PM$Device\Include\TM4C123\TM4C123.h - - - - - - - - - - $$Device:TM4C123GH6PM$SVD\TM4C123\TM4C123GH6PM.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\spy\ - dpp - 1 - 0 - 0 - 1 - 1 - .\spy\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - cmd /c "del .\spy\qstamp.o" - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf --bin --output .\spy\dpp.bin .\spy\dpp.axf - - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4097 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 1 - 0x0 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - - - - 0 - 7 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 3 - 0 - 1 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - - - Q_SPY - - ..;..\..\..\..\..\include;..\..\..\..\..\ports\uc-os2;..\..\..\..\..\3rd_party\uC-OS2\Source;..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 4 - - - Stack_Size=2048 Heap_Size=16 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - - - - --entry Reset_Handler - - - - - - - - Applicatioin - - - app_cfg.h - 5 - ..\app_cfg.h - - - os_cfg.h - 5 - ..\os_cfg.h - - - bsp.cpp - 8 - ..\bsp.cpp - - - bsp.hpp - 5 - ..\bsp.hpp - - - dpp.hpp - 5 - ..\dpp.hpp - - - main.cpp - 8 - ..\main.cpp - - - philo.cpp - 8 - ..\philo.cpp - - - table.cpp - 8 - ..\table.cpp - - - - - ek-tm4c123gxl - - - system_TM4C123GH6PM.c - 1 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - gpio.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - rom.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - sysctl.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - system_TM4C123GH6PM.h - 5 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - startup_TM4C123GH6PM.s - 2 - ..\..\..\..\..\3rd_party\ek-tm4c123gxl\arm\startup_TM4C123GH6PM.s - - - - - QP - - - qep_hsm.cpp - 8 - ..\..\..\..\..\src\qf\qep_hsm.cpp - - - qep_msm.cpp - 8 - ..\..\..\..\..\src\qf\qep_msm.cpp - - - qf_act.cpp - 8 - ..\..\..\..\..\src\qf\qf_act.cpp - - - qf_defer.cpp - 8 - ..\..\..\..\..\src\qf\qf_defer.cpp - - - qf_dyn.cpp - 8 - ..\..\..\..\..\src\qf\qf_dyn.cpp - - - qf_mem.cpp - 8 - ..\..\..\..\..\src\qf\qf_mem.cpp - - - qf_ps.cpp - 8 - ..\..\..\..\..\src\qf\qf_ps.cpp - - - qf_qact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qact.cpp - - - qf_qeq.cpp - 8 - ..\..\..\..\..\src\qf\qf_qeq.cpp - - - qf_qmact.cpp - 8 - ..\..\..\..\..\src\qf\qf_qmact.cpp - - - qf_time.cpp - 8 - ..\..\..\..\..\src\qf\qf_time.cpp - - - - - QP_port - - - qf_port.cpp - 8 - ..\..\..\..\..\ports\uc-os2\qf_port.cpp - - - - - QS - - - qs.cpp - 8 - ..\..\..\..\..\src\qs\qs.cpp - - - qs_64bit.cpp - 8 - ..\..\..\..\..\src\qs\qs_64bit.cpp - - - qs_fp.cpp - 8 - ..\..\..\..\..\src\qs\qs_fp.cpp - - - qs_rx.cpp - 8 - ..\..\..\..\..\src\qs\qs_rx.cpp - - - qstamp.cpp - 8 - ..\..\..\..\..\src\qs\qstamp.cpp - - - - - ucos-ii - - - os_core.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - - - os_task.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - - - os_flag.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - - - os_mbox.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - - - os_mem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - - - os_mutex.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - - - os_q.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - - - os_sem.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - - - os_time.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - - - os_tmr.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - - - - - ucos-ii_port - - - os_cpu_c.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - - - os_cpu.h - 5 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu.h - - - os_cpu_a.asm - 2 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_cpu_a.asm - - - os_dbg.c - 1 - ..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\ARM\os_dbg.c - - - - - - - - - - - - - -
    diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp deleted file mode 100644 index 496926e37..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.cpp +++ /dev/null @@ -1,498 +0,0 @@ -//============================================================================ -// Product: DPP example, EK-TM4C123GXL board, uC-OS2 RTOS kernel -// Last updated for @ref qpcpp_7_3_2 -// Last updated on 2023-12-13 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// 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: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include "TM4C123GH6PM.h" // the device specific header (TI) -#include "rom.h" // the built-in ROM functions (TI) -#include "sysctl.h" // system control driver (TI) -#include "gpio.h" // GPIO driver (TI) -// add other drivers if necessary... - -//============================================================================ -namespace { // unnamed namespace for local stuff with internal linkage - -Q_DEFINE_THIS_FILE - -// LEDs on the board -constexpr std::uint32_t LED_RED {1U << 1U}; -constexpr std::uint32_t LED_GREEN {1U << 3U}; -constexpr std::uint32_t LED_BLUE {1U << 2U}; - -// Buttons on the board -constexpr std::uint32_t BTN_SW1 {1U << 4U}; -constexpr std::uint32_t BTN_SW2 {1U << 0U}; - -static std::uint32_t l_rndSeed; - -#ifdef Q_SPY - - // QSpy source IDs - QP::QSpyId const l_tickHook = { 0U }; - - constexpr std::uint32_t UART_BAUD_RATE {115200U}; - constexpr std::uint32_t UART_FR_TXFE {1U << 7U}; - constexpr std::uint32_t UART_FR_RXFE {1U << 4U}; - constexpr std::uint32_t UART_TXFIFO_DEPTH {16U}; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed namespace - -//============================================================================ -// Error handler -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int const id) { - // NOTE: this implementation of the error handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); // report assertion to QS - -#ifndef NDEBUG - // light up all LEDs - GPIOF_AHB->DATA_Bits[LED_GREEN | LED_RED | LED_BLUE] = 0xFFU; - for (;;) { // for debugging, hang on in an endless loop... - } -#else - NVIC_SystemReset(); - for (;;) { // explicitly "no-return" - } -#endif -} -//............................................................................ -void assert_failed(char const * const module, int const id); // prototype -void assert_failed(char const * const module, int const id) { - Q_onError(module, id); -} - -// uCOS-II application hooks =============================================== - -void App_TimeTickHook(void) { - - QP::QTimeEvt::TICK_X(0U, &l_tickHook); // time events at rate 0 - - // Perform the debouncing of buttons. The algorithm for debouncing - // adapted from the book "Embedded Systems Dictionary" by Jack Ganssle - // and Michael Barr, page 71. - static struct { - std::uint32_t depressed; - std::uint32_t previous; - } buttons = { 0U, 0U }; - - std::uint32_t current = ~GPIOF_AHB->DATA_Bits[BTN_SW1 | BTN_SW2]; - std::uint32_t tmp = buttons.depressed; // save the depressed buttons - buttons.depressed |= (buttons.previous & current); // set depressed - buttons.depressed &= (buttons.previous | current); // clear released - buttons.previous = current; // update the history - tmp ^= buttons.depressed; // changed debounced depressed - current = buttons.depressed; - - if ((tmp & BTN_SW1) != 0U) { // debounced SW1 state changed? - if ((current & BTN_SW1) != 0U) { // is SW1 depressed? - static QP::QEvt const pauseEvt(APP::PAUSE_SIG); - QP::QActive::PUBLISH(&pauseEvt, &l_tickHook); - } - else { // the button is released - static QP::QEvt const serveEvt(APP::SERVE_SIG); - QP::QActive::PUBLISH(&serveEvt, &l_tickHook); - } - } -} -//............................................................................ -void App_TaskCreateHook (OS_TCB *ptcb) { (void)ptcb; } -void App_TaskDelHook (OS_TCB *ptcb) { (void)ptcb; } -//............................................................................ -void App_TaskIdleHook(void) { - // toggle the User LED on and then off, see NOTE3 - QF_CRIT_STAT - QF_CRIT_ENTRY(); - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0xFFU; // turn the Blue LED on - GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U; // turn the Blue LED off - QF_CRIT_EXIT(); - - // Some floating point code is to exercise the VFP... - float volatile x = 1.73205F; - x = x * 1.73205F; - -#ifdef Q_SPY - QF_CRIT_ENTRY(); - QP::QS::rxParse(); // parse all the received bytes - QF_CRIT_EXIT(); - - if ((UART0->FR & UART_FR_TXFE) != 0U) { // TX done? - std::uint16_t fifo = UART_TXFIFO_DEPTH; // max bytes we can accept - - QF_CRIT_ENTRY(); - std::uint8_t const *block = QP::QS::getBlock(&fifo); - QF_CRIT_EXIT(); - - while (fifo-- != 0U) { // any bytes in the block? - UART0->DR = *block++; // put into the FIFO - } - } -#elif defined NDEBUG - // Put the CPU and peripherals to the low-power mode. - // you might need to customize the clock management for your application, - // see the datasheet for your particular Cortex-M MCU. - __WFI(); // Wait-For-Interrupt -#endif -} -//............................................................................ -void App_TaskReturnHook (OS_TCB *ptcb) { (void)ptcb; } -void App_TaskStatHook (void) {} -void App_TaskSwHook (void) {} -void App_TCBInitHook (OS_TCB *ptcb) { (void)ptcb; } - -// ISRs used in the application ============================================ - -#ifdef Q_SPY -// ISR for receiving bytes from the QSPY Back-End -// NOTE: This ISR is "kernel-unaware" meaning that it does not interact with -// the QF/RTOS and is not disabled. Such ISRs cannot post or publish events. - -void UART0_IRQHandler(void); // prototype -void UART0_IRQHandler(void) { - std::uint32_t status = UART0->RIS; // get the raw interrupt status - UART0->ICR = status; // clear the asserted interrupts - - while ((UART0->FR & UART_FR_RXFE) == 0U) { // while RX FIFO NOT empty - std::uint8_t b = (uint8_t)UART0->DR; - QP::QS::rxPut(b); - } -} -#endif // Q_SPY - -} // extern "C" - -//============================================================================ - -namespace BSP { - -void init() { - // Configure the MPU to prevent NULL-pointer dereferencing ... - MPU->RBAR = 0x0U // base address (NULL) - | MPU_RBAR_VALID_Msk // valid region - | (MPU_RBAR_REGION_Msk & 7U); // region #7 - MPU->RASR = (7U << MPU_RASR_SIZE_Pos) // 2^(7+1) region - | (0x0U << MPU_RASR_AP_Pos) // no-access region - | MPU_RASR_ENABLE_Msk; // region enable - MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk // enable background region - | MPU_CTRL_ENABLE_Msk; // enable the MPU - __ISB(); - __DSB(); - - // enable the MemManage_Handler for MPU exception - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - // NOTE: SystemInit() has been already called from the startup code - // but SystemCoreClock needs to be updated - SystemCoreClockUpdate(); - - // NOTE: The VFP (hardware Floating Point) unit is configured by the RTOS - - // enable clock for to the peripherals used by this application... - SYSCTL->RCGCGPIO |= (1U << 5U); // enable Run mode for GPIOF - SYSCTL->GPIOHBCTL |= (1U << 5U); // enable AHB for GPIOF - __ISB(); - __DSB(); - - // configure LEDs (digital output) - GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN); - GPIOF_AHB->DATA_Bits[LED_RED | LED_BLUE | LED_GREEN] = 0U; - - // configure switches... - - // unlock access to the SW2 pin because it is PROTECTED - GPIOF_AHB->LOCK = 0x4C4F434BU; // unlock GPIOCR register for SW2 - // commit the write (cast const away) - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x01U; - - GPIOF_AHB->DIR &= ~(BTN_SW1 | BTN_SW2); // input - GPIOF_AHB->DEN |= (BTN_SW1 | BTN_SW2); // digital enable - GPIOF_AHB->PUR |= (BTN_SW1 | BTN_SW2); // pull-up resistor enable - - *(uint32_t volatile *)&GPIOF_AHB->CR = 0x00U; - GPIOF_AHB->LOCK = 0x0; // lock GPIOCR register for SW2 - - // seed the random number generator - BSP::randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - // dictionaries... - QS_OBJ_DICTIONARY(&l_tickHook); - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the clock tick -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - // NOTE: The QP priorities don't start at 1 because - // the lowest priority levels are reserved for the internal - // uC-OS2 tasks. - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static OS_STK philoStack[APP::N_PHILO][128]; // stacks for the Philos - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - Q_PRIO(n + 1U, n + 4U), // QP-prio., uC-OS2 prio. - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStack[n], // stack storage - sizeof(philoStack[n])); // stack size [bytes] - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static OS_STK tableStack[128]; // stack for the Table - APP::AO_Table->start( - Q_PRIO(APP::N_PHILO + 1U, APP::N_PHILO + 4U), // QP-prio., uC-OS2 prio. - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStack, // stack storage - sizeof(tableStack)); // stack size [bytes] -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - GPIOF_AHB->DATA_Bits[LED_GREEN] = ((stat[0] == 'e') ? LED_GREEN : 0U); - - // app-specific trace record... - QS_BEGIN_ID(PHILO_STAT, APP::AO_Table->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t const paused) { - GPIOF_AHB->DATA_Bits[LED_BLUE] = ((paused != 0U) ? LED_BLUE : 0U); - - // application-specific trace record - QS_BEGIN_ID(PAUSED_STAT, APP::AO_Table->getPrio()) - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -void randomSeed(std::uint32_t const seed) { - l_rndSeed = seed; -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // Some floating point code is to exercise the VFP... - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - OSSchedLock(); // lock uC-OS2 scheduler - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - std::uint32_t rnd = l_rndSeed * (3U*7U*11U*13U*23U); - l_rndSeed = rnd; // set for the next time - OSSchedUnlock(); // unlock uC-OS2 scheduler - - return (rnd >> 8U); -} -//............................................................................ -void ledOn() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0xFFU; -} -//............................................................................ -void ledOff() { - GPIOF_AHB->DATA_Bits[LED_RED] = 0x00U; -} -//............................................................................ -void terminate(int16_t result) { - Q_UNUSED_PAR(result); -} - -} // namespace BSP - -//============================================================================ - -namespace QP { - -// QF callbacks -------------------------------------------------------------- - -void QF::onStartup() { - // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate - // NOTE: do NOT call OS_CPU_SysTickInit() from uC/OS-II - SysTick_Config(SystemCoreClock / BSP::TICKS_PER_SEC); - - // assign all priority bits for preemption-prio. and none to sub-prio. - NVIC_SetPriorityGrouping(0U); - - // set priorities of ALL ISRs used in the system, see NOTE1 - NVIC_SetPriority(UART0_IRQn, 0U); // kernel unaware interrupt - NVIC_SetPriority(SysTick_IRQn, CPU_CFG_KA_IPL_BOUNDARY + 0U); - -#ifdef Q_SPY - NVIC_EnableIRQ(UART0_IRQn); // UART interrupt used for QS-RX -#endif -} -//............................................................................ -void QF::onCleanup() { -} - -// QS callbacks -------------------------------------------------------------- -#ifdef Q_SPY -namespace QS { - -//............................................................................ -bool onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[100]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // enable clock for UART0 and GPIOA (used by UART0 pins) - SYSCTL->RCGCUART |= (1U << 0U); // enable Run mode for UART0 - SYSCTL->RCGCGPIO |= (1U << 0U); // enable Run mode for GPIOA - - // configure UART0 pins for UART operation - std::uint32_t tmp = (1U << 0U) | (1U << 1U); - GPIOA->DIR &= ~tmp; - GPIOA->SLR &= ~tmp; - GPIOA->ODR &= ~tmp; - GPIOA->PUR &= ~tmp; - GPIOA->PDR &= ~tmp; - GPIOA->AMSEL &= ~tmp; // disable analog function on the pins - GPIOA->AFSEL |= tmp; // enable ALT function on the pins - GPIOA->DEN |= tmp; // enable digital I/O on the pins - GPIOA->PCTL &= ~0x00U; - GPIOA->PCTL |= 0x11U; - - // configure the UART for the desired baud rate, 8-N-1 operation - tmp = (((SystemCoreClock * 8U) / UART_BAUD_RATE) + 1U) / 2U; - UART0->IBRD = tmp / 64U; - UART0->FBRD = tmp % 64U; - UART0->LCRH = (0x3U << 5U); // configure 8-N-1 operation - UART0->LCRH |= (0x1U << 4U); // enable FIFOs - UART0->CTL = (1U << 0U) // UART enable - | (1U << 8U) // UART TX enable - | (1U << 9U); // UART RX enable - - // configure UART interrupts (for the RX channel) - UART0->IM |= (1U << 4U) | (1U << 6U); // enable RX and RX-TO interrupt - UART0->IFLS |= (0x2U << 2U); // interrupt on RX FIFO half-full - // NOTE: do not enable the UART0 interrupt yet. Wait till QF_onStartup() - - // configure TIMER5 to produce QS time stamp - SYSCTL->RCGCTIMER |= (1U << 5U); // enable run mode for Timer5 - TIMER5->CTL = 0U; // disable Timer1 output - TIMER5->CFG = 0x0U; // 32-bit configuration - TIMER5->TAMR = (1U << 4U) | 0x02U; // up-counting periodic mode - TIMER5->TAILR= 0xFFFFFFFFU; // timer interval - TIMER5->ICR = 0x1U; // TimerA timeout flag bit clears - TIMER5->CTL |= (1U << 0U); // enable TimerA module - - return true; // return success -} -//............................................................................ -void onCleanup() { -} -//............................................................................ -QSTimeCtr onGetTime() { // NOTE: invoked with interrupts DISABLED - return TIMER5->TAV; -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void onFlush() { - for (;;) { - std::uint16_t b = getByte(); - if (b != QS_EOD) { // NOT end-of-data - // busy-wait as long as TX FIFO has data to transmit - while ((UART0->FR & UART_FR_TXFE) == 0U) { - } - UART0->DR = b; // put into the DR register - } - else { - break; // break out of the loop - } - } -} -//............................................................................ -void onReset() { - NVIC_SystemReset(); -} -//............................................................................ -void onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -} // namespace QS -#endif // Q_SPY -//---------------------------------------------------------------------------- - -} // namespace QP - -//============================================================================ -// NOTE1: -// All ISRs that make system calls MUST be prioritized as "kernel-aware". -// On Cortex-M3/4/7 this means ISR priorities with numerical values higher -// or equal CPU_CFG_KA_IPL_BOUNDARY. - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp deleted file mode 100644 index 78665dbd3..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example, uC-OS2 RTOS -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-30 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -// embOS tick rate -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(); // pseudo-random generator - -// for testing... -void ledOn(); -void ledOff(); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile deleted file mode 100644 index 0a602706f..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/Makefile +++ /dev/null @@ -1,326 +0,0 @@ -############################################################################## -# Product: Makefile for QP/C++ on EK-TM4C123GXL, uC/OS-II kernel, GNU-ARM -# Last Updated for Version: 7.0.1 -# Date of the Last Update: 2022-05-23 -# -# Q u a n t u m L e a P s -# ------------------------ -# Modern Embedded Software -# -# Copyright (C) 2005-2021 Quantum Leaps, LLC. All rights reserved. -# -# This program is open source software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Alternatively, this program may be distributed and modified under the -# terms of Quantum Leaps commercial licenses, which expressly supersede -# the GNU General Public License and are specifically designed for -# licensees interested in retaining the proprietary status of their code. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Contact information: -# -# -############################################################################## -# examples of invoking this Makefile: -# building configurations: Debug (default), Release, and Spy -# make -# make CONF=rel -# make CONF=spy -# -# cleaning configurations: Debug (default), Release, and Spy -# make clean -# make CONF=rel clean -# make CONF=spy clean -# -# NOTE: -# To use this Makefile on Windows, you will need the GNU make utility, which -# is included in the Qtools collection for Windows, see: -# https://sourceforge.net/projects/qpc/files/QTools/ -# - -#----------------------------------------------------------------------------- -# project name -# -PROJECT := dpp - -#----------------------------------------------------------------------------- -# project directories -# - -# location of the QP/C++ framework (if not provided in an environment var.) -ifeq ($(QPCPP),) -QPCPP := ../../../../.. -endif - -# QP port used in this project -QP_PORT_DIR := $(QPCPP)/ports/uc-os2 - -# list of all source directories used by this project -VPATH = \ - .. \ - $(QPCPP)/src/qf \ - $(QPCPP)/src/qs \ - $(QP_PORT_DIR) \ - $(QPCPP)/3rd_party/uC-OS2/Source \ - $(QPCPP)/3rd_party/uC-OS2/Ports/ARM-Cortex-M/ARMv7-M \ - $(QPCPP)/3rd_party/uC-OS2/Ports/ARM-Cortex-M/ARMv7-M/GNU \ - $(QPCPP)/3rd_party/ek-tm4c123gxl \ - $(QPCPP)/3rd_party/ek-tm4c123gxl/gnu - -# list of all include directories needed by this project -INCLUDES = \ - -I.. \ - -I$(QPCPP)/include \ - -I$(QP_PORT_DIR) \ - -I$(QPCPP)/3rd_party/uC-OS2/Source \ - -I$(QPCPP)/3rd_party/uC-OS2/Ports/ARM-Cortex-M/ARMv7-M/GNU \ - -I$(QPCPP)/3rd_party/CMSIS/Include \ - -I$(QPCPP)/3rd_party/ek-tm4c123gxl - -#----------------------------------------------------------------------------- -# files -# - -# assembler source files -ASM_SRCS := \ - os_cpu_a.s - -# C source files -C_SRCS := \ - system_TM4C123GH6PM.c \ - startup_TM4C123GH6PM.c - -# C++ source files -CPP_SRCS := \ - bsp.cpp \ - main.cpp \ - philo.cpp \ - table.cpp - -OUTPUT := $(PROJECT) -LD_SCRIPT := $(PROJECT).ld - -QP_SRCS := \ - qep_hsm.cpp \ - qep_msm.cpp \ - qf_act.cpp \ - qf_defer.cpp \ - qf_dyn.cpp \ - qf_mem.cpp \ - qf_ps.cpp \ - qf_qact.cpp \ - qf_qeq.cpp \ - qf_qmact.cpp \ - qf_time.cpp \ - qf_port.cpp - -RTOS_SRCS := \ - os_core.c \ - os_flag.c \ - os_mbox.c \ - os_mem.c \ - os_mutex.c \ - os_q.c \ - os_sem.c \ - os_task.c \ - os_time.c \ - os_tmr.c \ - os_dbg.c \ - os_cpu_c.c - -QS_SRCS := \ - qs.cpp \ - qs_rx.cpp \ - qs_fp.cpp - -LIB_DIRS := -LIBS := - -# defines -DEFINES := - -# ARM CPU, ARCH, FPU, and Float-ABI types... -# ARM_CPU: [cortex-m0 | cortex-m0plus | cortex-m1 | cortex-m3 | cortex-m4] -# ARM_FPU: [ | vfp] -# FLOAT_ABI: [ | soft | softfp | hard] -# -ARM_CPU := -mcpu=cortex-m4 -ARM_FPU := -mfpu=vfp -FLOAT_ABI := -mfloat-abi=softfp -ASM_FPU := - -#----------------------------------------------------------------------------- -# GNU-ARM toolset (NOTE: You need to adjust to your machine) -# see https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads -# -ifeq ($(GNU_ARM),) -GNU_ARM := $(QTOOLS)/gnu_arm-none-eabi -endif - -# make sure that the GNU-ARM toolset exists... -ifeq ("$(wildcard $(GNU_ARM))","") -$(error GNU_ARM toolset not found. Please adjust the Makefile) -endif - -CC := $(GNU_ARM)/bin/arm-none-eabi-gcc -CPP := $(GNU_ARM)/bin/arm-none-eabi-g++ -AS := $(GNU_ARM)/bin/arm-none-eabi-as -LINK := $(GNU_ARM)/bin/arm-none-eabi-g++ -BIN := $(GNU_ARM)/bin/arm-none-eabi-objcopy - - -############################################################################## -# Typically, you should not need to change anything below this line - -# basic utilities (included in Qtools for Windows), see: -# http://sourceforge.net/projects/qpc/files/Qtools - -MKDIR := mkdir -RM := rm - -#----------------------------------------------------------------------------- -# build options for various configurations for ARM Cortex-M -# - -# combine all the sources... -CPP_SRCS += $(QP_SRCS) -ASM_SRCS += $(QP_ASMS) -C_SRCS += $(RTOS_SRCS) - -ifeq (rel, $(CONF)) # Release configuration .................................. - -BIN_DIR := rel - -ASFLAGS = $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -CPPFLAGS = -c $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O1 $(INCLUDES) $(DEFINES) -DNDEBUG - -else ifeq (spy, $(CONF)) # Spy configuration ................................ - -BIN_DIR := spy - -CPP_SRCS += $(QS_SRCS) - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) -DQ_SPY - -else # default Debug configuration .......................................... - -BIN_DIR := dbg - -ASFLAGS = -g $(ARM_CPU) $(ARM_FPU) $(ASM_CPU) $(ASM_FPU) - -CFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections \ - -O $(INCLUDES) $(DEFINES) - -CPPFLAGS = -c -g $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb -Wall \ - -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions \ - -O $(INCLUDES) $(DEFINES) - -endif # ...................................................................... - - -LINKFLAGS = -T$(LD_SCRIPT) $(ARM_CPU) $(ARM_FPU) $(FLOAT_ABI) -mthumb \ - -specs=nosys.specs -specs=nano.specs \ - -Wl,-Map,$(BIN_DIR)/$(OUTPUT).map,--cref,--gc-sections $(LIB_DIRS) - - -ASM_OBJS := $(patsubst %.s,%.o, $(notdir $(ASM_SRCS))) -C_OBJS := $(patsubst %.c,%.o, $(notdir $(C_SRCS))) -CPP_OBJS := $(patsubst %.cpp,%.o,$(notdir $(CPP_SRCS))) - -TARGET_BIN := $(BIN_DIR)/$(OUTPUT).bin -TARGET_ELF := $(BIN_DIR)/$(OUTPUT).elf -ASM_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(ASM_OBJS)) -C_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(C_OBJS)) -C_DEPS_EXT := $(patsubst %.o, %.d, $(C_OBJS_EXT)) -CPP_OBJS_EXT := $(addprefix $(BIN_DIR)/, $(CPP_OBJS)) -CPP_DEPS_EXT := $(patsubst %.o, %.d, $(CPP_OBJS_EXT)) - -# create $(BIN_DIR) if it does not exist -ifeq ("$(wildcard $(BIN_DIR))","") -$(shell $(MKDIR) $(BIN_DIR)) -endif - -#----------------------------------------------------------------------------- -# rules -# - -all: $(TARGET_BIN) -#all: $(TARGET_ELF) - -$(TARGET_BIN): $(TARGET_ELF) - $(BIN) -O binary $< $@ - -$(TARGET_ELF) : $(ASM_OBJS_EXT) $(C_OBJS_EXT) $(CPP_OBJS_EXT) - $(CPP) $(CPPFLAGS) $(QPCPP)/src/qs/qstamp.cpp -o $(BIN_DIR)/qstamp.o - $(LINK) $(LINKFLAGS) -o $@ $^ $(BIN_DIR)/qstamp.o $(LIBS) - -$(BIN_DIR)/%.d : %.c - $(CC) -MM -MT $(@:.d=.o) $(CFLAGS) $< > $@ - -$(BIN_DIR)/%.d : %.cpp - $(CPP) -MM -MT $(@:.d=.o) $(CPPFLAGS) $< > $@ - -$(BIN_DIR)/%.o : %.s - $(AS) $(ASFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.c - $(CC) $(CFLAGS) $< -o $@ - -$(BIN_DIR)/%.o : %.cpp - $(CPP) $(CPPFLAGS) $< -o $@ - -# include dependency files only if our goal depends on their existence -ifneq ($(MAKECMDGOALS),clean) - ifneq ($(MAKECMDGOALS),show) --include $(C_DEPS_EXT) $(CPP_DEPS_EXT) - endif -endif - - -.PHONY : clean -clean: - -$(RM) $(BIN_DIR)/*.o \ - $(BIN_DIR)/*.d \ - $(BIN_DIR)/*.bin \ - $(BIN_DIR)/*.elf \ - $(BIN_DIR)/*.map - -show: - @echo PROJECT = $(PROJECT) - @echo CONF = $(CONF) - @echo DEFINES = $(DEFINES) - @echo ASM_FPU = $(ASM_FPU) - @echo ASM_SRCS = $(ASM_SRCS) - @echo C_SRCS = $(C_SRCS) - @echo CPP_SRCS = $(CPP_SRCS) - @echo ASM_OBJS_EXT = $(ASM_OBJS_EXT) - @echo C_OBJS_EXT = $(C_OBJS_EXT) - @echo C_DEPS_EXT = $(C_DEPS_EXT) - @echo CPP_DEPS_EXT = $(CPP_DEPS_EXT) - @echo TARGET_ELF = $(TARGET_ELF) diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt deleted file mode 100644 index 80fe048b4..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/README.txt +++ /dev/null @@ -1,71 +0,0 @@ -About this Example -================== -This example can be built from the command prompt with the provided -Makefile. The example can also be imported as a Makefile-based -project into Eclipse-based IDEs. - - -The Makefile -============ -The provided Makefile should be easy to adapt for your own projects. -It contains three build configurations: Debug (default), Release, and -Spy. - -Also, the Makefile has been specifically designed to work as an external -Makefile with the Eclipse CDT. - -The various build configurations are built as follows: - -make -make CONF=rel -make CONF=spy - -make clean -make CONF=rel clean -make CONF=spy clean - -*** -NOTE: -The installation folder of the GNU-ARM toolset on YOUR machine needs -to be adjusted in the provided Makefile, by editing the symbol: GNU_ARM. -As described in the comment for this symbol, the GNU-ARM toolset is taken -from: http://gnutoolchains.com/arm-eabi - -It is highly recommended to use the same GNU-ARM distribution, especially -for ARM Cortex-M4F projects, due to the support for the hardware FPU -(float-abi=hard). -*** - - -Adjusting Stack and Heap Sizes -============================== -The stack and heap sizes are determined in this project by the GNU linker -script (.ld file), which provides a template of the recommended GNU linker -script for QP applications. - - -Startup Code -============ -The startup code for the TM4C123GH6PM MCU used in this project is -located in the "3rd_party" folder in the following location: - -3rd_party\ek-tm4c123gxl\gnu\startup_TM4C123GH6PM.c - -The file startup_TM4C123GH6PM.c provides a template of the recommended -startup for QP applications and should be easily customizable for other -ARM Cortex-M microcontrollers. - -The startup file typically does not need to be modified or adapted for -applications. It provides only weak definitions of all exception and -interrupt handlers, as well as the assert_failed() function. - -The weak function assert_failed() defined in this file might be re-defined -in the application to customize it for the application-specific error- -handling policy. - -*** -NOTE: The function assert_failed() typically should NOT use the stack, -because stack might be corrupted by the time this function is called. -Also, assert_failed() is intended to handle catastrophic errors and -should NOT return. -*** diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld deleted file mode 100644 index 472861bf9..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/dpp.ld +++ /dev/null @@ -1,139 +0,0 @@ -/***************************************************************************** -* Product: Linker script for for DPP on EK-TM4C123GXL, GNU-ARM -* Last Updated for Version: 5.9.8 -* Date of the Last Update: 2017-09-13 -* -* Q u a n t u m L e a P s -* --------------------------- -* innovating embedded systems -* -* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved. -* -* This program is open source software: you can redistribute it and/or -* modify it under the terms of the GNU General Public License as published -* by the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Alternatively, this program may be distributed and modified under the -* terms of Quantum Leaps commercial licenses, which expressly supersede -* the GNU General Public License and are specifically designed for -* licensees interested in retaining the proprietary status of their code. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* Contact information: -* https://state-machine.com -* mailto:info@state-machine.com -*****************************************************************************/ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") -OUTPUT_ARCH(arm) -ENTRY(Reset_Handler) /* entry Point */ - -MEMORY { /* memory map of Tiva TM4C123GH6PM */ - ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -} - -/* The size of the stack used by the application. NOTE: you need to adjust */ -STACK_SIZE = 2048; - -/* The size of the heap used by the application. NOTE: you need to adjust */ -HEAP_SIZE = 0; - -SECTIONS { - - .isr_vector : { /* the vector table goes FIRST into ROM */ - KEEP(*(.isr_vector)) /* vector table */ - . = ALIGN(4); - } >ROM - - .text : { /* code and constants */ - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - } >ROM - - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ROM - - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ROM - - .fini_array : { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ROM - - _etext = .; /* global symbols at end of code */ - - .stack : { - __stack_start__ = .; - . = . + STACK_SIZE; - . = ALIGN(4); - __stack_end__ = .; - } >RAM - - .data : AT (_etext) { - __data_load = LOADADDR (.data); - __data_start = .; - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - __data_end__ = .; - _edata = __data_end__; - } >RAM - - .bss : { - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = .; - } >RAM - - __exidx_start = .; - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >RAM - __exidx_end = .; - - PROVIDE ( end = _ebss ); - PROVIDE ( _end = _ebss ); - PROVIDE ( __end__ = _ebss ); - - .heap : { - __heap_start__ = .; - . = . + HEAP_SIZE; - . = ALIGN(4); - __heap_end__ = .; - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } -} diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat deleted file mode 100644 index cb2a3886e..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/gnu/flash.bat +++ /dev/null @@ -1,33 +0,0 @@ -::============================================================================ -:: Batch file to program the flash of EK-TM4C123GXL -:: -:: NOTE: requires the LMFlash programmer (included in QTools for Windows) -:: -@echo off -setlocal - -@echo Load a given binary file to the flash of EK-TM4C123GXL -@echo usage: flash binary-file -@echo example: flash dbg\blinky-qk.bin - -::---------------------------------------------------------------------------- -:: NOTE: The following symbol LMFLASH assumes that LMFlash.exe can -:: be found on the PATH. You might need to adjust this symbol to the -:: location of the LMFlash utility on your machine -:: -set LMFLASH=LMFlash.exe - -if ["%~1"]==[""] ( - @echo The binary file missing - @goto end -) -if not exist %~s1 ( - @echo The binary file '%1' does not exist - @goto end -) - -%LMFLASH% -q ek-tm4c123gxl -e -v -r %1 - -:end - -endlocal \ No newline at end of file diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd deleted file mode 100644 index 13d732d4d..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewd +++ /dev/null @@ -1,4654 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 32 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 0 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 0 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 0 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 0 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 0 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Spy - - ARM - - 1 - - C-SPY - 2 - - 32 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 1 - - - - - - - - CADI_ID - 2 - - 0 - 1 - 1 - - - - - - - - - CMSISDAP_ID - 2 - - 4 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 1 - - - - - - - - - - - IJET_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - NULINK_ID - 2 - - 0 - 1 - 1 - - - - - - - PEMICRO_ID - 2 - - 3 - 1 - 1 - - - - - - - - STLINK_ID - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - TIFET_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - XDS100_ID - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp deleted file mode 100644 index 90d1f551a..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.ewp +++ /dev/null @@ -1,3422 +0,0 @@ - - - 3 - - Debug - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 35 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - Coder - 0 - - - - - Spy - - ARM - - 1 - - General - 3 - - 35 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - cmd /c "if exist $OBJ_DIR$\qstamp.o del $OBJ_DIR$\qstamp.o" - - - - - ILINK - 0 - - 27 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - Coder - 0 - - - - - Application - - $PROJ_DIR$\..\app_cfg.h - - - $PROJ_DIR$\..\bsp.cpp - - - $PROJ_DIR$\..\bsp.hpp - - - $PROJ_DIR$\..\dpp.hpp - - - $PROJ_DIR$\..\main.cpp - - - $PROJ_DIR$\..\os_cfg.h - - - $PROJ_DIR$\..\philo.cpp - - - $PROJ_DIR$\..\table.cpp - - - - ek-tm4c123gxl - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\gpio.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\rom.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\iar\startup_TM4C123GH6PM.s - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\sysctl.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\system_TM4C123GH6PM.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\ek-tm4c123gxl\TM4C123GH6PM.h - - - - QP - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_hsm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qep_msm.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_act.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_defer.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_dyn.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_mem.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_ps.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qeq.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_qmact.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qf\qf_time.cpp - - - - QP_port - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\app_cfg.h - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\os_cfg.h - - - $PROJ_DIR$\..\..\..\..\..\ports\uc-os2\qf_port.cpp - - - - QS - - Debug - Release - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_64bit.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_fp.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qs_rx.cpp - - - $PROJ_DIR$\..\..\..\..\..\src\qs\qstamp.cpp - - - - uC-OS2 - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_core.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_flag.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mbox.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mem.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_mutex.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_q.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_sem.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_task.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_time.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\os_tmr.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Source\ucos_ii.h - - - - uC-OS2_Port - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_cpu.h - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_cpu_a.asm - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.c - - - $PROJ_DIR$\..\..\..\..\..\3rd_party\uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\IAR\os_dbg.c - - - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww deleted file mode 100644 index 461ce6e06..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\dpp.ewp - - - - - diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf deleted file mode 100644 index da0bc0539..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/iar/dpp.icf +++ /dev/null @@ -1,29 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20007FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 512; -define symbol __ICFEDIT_size_heap__ = 0; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; -place in ROM_region { readonly }; -place at start of RAM_region {block CSTACK }; -place in RAM_region { readwrite, block HEAP }; \ No newline at end of file diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/main.cpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/main.cpp deleted file mode 100644 index 509568b09..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework and the underlying RT kernel - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/os_cfg.h b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/os_cfg.h deleted file mode 100644 index 07fa17f73..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/os_cfg.h +++ /dev/null @@ -1,154 +0,0 @@ -/* -********************************************************************************************************* -* uC/OS-II -* The Real-Time Kernel -* -* Copyright 1992-2020 Silicon Laboratories Inc. www.silabs.com -* -* SPDX-License-Identifier: APACHE-2.0 -* -* This software is subject to an open source license and is distributed by -* Silicon Laboratories Inc. pursuant to the terms of the Apache License, -* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0. -* -********************************************************************************************************* -*/ - - -/* -********************************************************************************************************* -* -* uC/OS-II Configuration File for V2.9x -* -* Filename : os_cfg.h -* Version : V2.93.00 -********************************************************************************************************* -*/ - -#ifndef OS_CFG_H -#define OS_CFG_H - - - /* ---------------------- MISCELLANEOUS ----------------------- */ -#define OS_APP_HOOKS_EN 1u /* Application-defined hooks are called from the uC/OS-II hooks */ -#define OS_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */ -#define OS_CPU_HOOKS_EN 1u /* uC/OS-II hooks are found in the processor port files */ - -#define OS_DEBUG_EN 1u /* Enable(1) debug variables */ - -#define OS_EVENT_MULTI_EN 0u /* Include code for OSEventPendMulti() */ -#define OS_EVENT_NAME_EN 1u /* Enable names for Sem, Mutex, Mbox and Q */ - -#define OS_LOWEST_PRIO 63u /* Defines the lowest priority that can be assigned ... */ - /* ... MUST NEVER be higher than 254! */ - -#define OS_MAX_EVENTS 10u /* Max. number of event control blocks in your application */ -#define OS_MAX_FLAGS 5u /* Max. number of Event Flag Groups in your application */ -#define OS_MAX_MEM_PART 5u /* Max. number of memory partitions */ -#define OS_MAX_QS 20u /* Max. number of queue control blocks in your application */ -#define OS_MAX_TASKS 20u /* Max. number of tasks in your application, MUST be >= 2 */ - -#define OS_SCHED_LOCK_EN 1u /* Include code for OSSchedLock() and OSSchedUnlock() */ - -#define OS_TICK_STEP_EN 1u /* Enable tick stepping feature for uC/OS-View */ -#define OS_TICKS_PER_SEC 100u /* Set the number of ticks in one second */ - -#define OS_TLS_TBL_SIZE 0u /* Size of Thread-Local Storage Table */ - - - /* --------------------- TASK STACK SIZE ---------------------- */ -#define OS_TASK_TMR_STK_SIZE 128u /* Timer task stack size (# of OS_STK wide entries) */ -#define OS_TASK_STAT_STK_SIZE 128u /* Statistics task stack size (# of OS_STK wide entries) */ -#define OS_TASK_IDLE_STK_SIZE 128u /* Idle task stack size (# of OS_STK wide entries) */ - - - /* --------------------- TASK MANAGEMENT ---------------------- */ -#define OS_TASK_CHANGE_PRIO_EN 0u /* Include code for OSTaskChangePrio() */ -#define OS_TASK_CREATE_EN 1u /* Include code for OSTaskCreate() */ -#define OS_TASK_CREATE_EXT_EN 1u /* Include code for OSTaskCreateExt() */ -#define OS_TASK_DEL_EN 1u /* Include code for OSTaskDel() */ -#define OS_TASK_NAME_EN 1u /* Enable task names */ -#define OS_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling */ -#define OS_TASK_QUERY_EN 1u /* Include code for OSTaskQuery() */ -#define OS_TASK_REG_TBL_SIZE 1u /* Size of task variables array (#of INT32U entries) */ -#define OS_TASK_STAT_EN 1u /* Enable (1) or Disable(0) the statistics task */ -#define OS_TASK_STAT_STK_CHK_EN 1u /* Check task stacks from statistic task */ -#define OS_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume() */ -#define OS_TASK_SW_HOOK_EN 1u /* Include code for OSTaskSwHook() */ - - - /* ----------------------- EVENT FLAGS ------------------------ */ -#define OS_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */ -#define OS_FLAG_ACCEPT_EN 1u /* Include code for OSFlagAccept() */ -#define OS_FLAG_DEL_EN 1u /* Include code for OSFlagDel() */ -#define OS_FLAG_NAME_EN 1u /* Enable names for event flag group */ -#define OS_FLAG_QUERY_EN 1u /* Include code for OSFlagQuery() */ -#define OS_FLAG_WAIT_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS */ -#define OS_FLAGS_NBITS 16u /* Size in #bits of OS_FLAGS data type (8, 16 or 32) */ - - - /* -------------------- MESSAGE MAILBOXES --------------------- */ -#define OS_MBOX_EN 1u /* Enable (1) or Disable (0) code generation for MAILBOXES */ -#define OS_MBOX_ACCEPT_EN 1u /* Include code for OSMboxAccept() */ -#define OS_MBOX_DEL_EN 1u /* Include code for OSMboxDel() */ -#define OS_MBOX_PEND_ABORT_EN 1u /* Include code for OSMboxPendAbort() */ -#define OS_MBOX_POST_EN 1u /* Include code for OSMboxPost() */ -#define OS_MBOX_POST_OPT_EN 1u /* Include code for OSMboxPostOpt() */ -#define OS_MBOX_QUERY_EN 1u /* Include code for OSMboxQuery() */ - - - /* --------------------- MEMORY MANAGEMENT -------------------- */ -#define OS_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */ -#define OS_MEM_NAME_EN 1u /* Enable memory partition names */ -#define OS_MEM_QUERY_EN 1u /* Include code for OSMemQuery() */ - - - /* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */ -#define OS_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */ -#define OS_MUTEX_ACCEPT_EN 1u /* Include code for OSMutexAccept() */ -#define OS_MUTEX_DEL_EN 1u /* Include code for OSMutexDel() */ -#define OS_MUTEX_QUERY_EN 1u /* Include code for OSMutexQuery() */ - - - /* ---------------------- MESSAGE QUEUES ---------------------- */ -#define OS_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */ -#define OS_Q_ACCEPT_EN 1u /* Include code for OSQAccept() */ -#define OS_Q_DEL_EN 1u /* Include code for OSQDel() */ -#define OS_Q_FLUSH_EN 1u /* Include code for OSQFlush() */ -#define OS_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort() */ -#define OS_Q_POST_EN 1u /* Include code for OSQPost() */ -#define OS_Q_POST_FRONT_EN 1u /* Include code for OSQPostFront() */ -#define OS_Q_POST_OPT_EN 1u /* Include code for OSQPostOpt() */ -#define OS_Q_QUERY_EN 1u /* Include code for OSQQuery() */ - - - /* ------------------------ SEMAPHORES ------------------------ */ -#define OS_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */ -#define OS_SEM_ACCEPT_EN 1u /* Include code for OSSemAccept() */ -#define OS_SEM_DEL_EN 1u /* Include code for OSSemDel() */ -#define OS_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort() */ -#define OS_SEM_QUERY_EN 1u /* Include code for OSSemQuery() */ -#define OS_SEM_SET_EN 1u /* Include code for OSSemSet() */ - - - /* --------------------- TIME MANAGEMENT ---------------------- */ -#define OS_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */ -#define OS_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */ -#define OS_TIME_GET_SET_EN 1u /* Include code for OSTimeGet() and OSTimeSet() */ -#define OS_TIME_TICK_HOOK_EN 1u /* Include code for OSTimeTickHook() */ - - - /* --------------------- TIMER MANAGEMENT --------------------- */ -#define OS_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS */ -#define OS_TMR_CFG_MAX 16u /* Maximum number of timers */ -#define OS_TMR_CFG_NAME_EN 1u /* Determine timer names */ -#define OS_TMR_CFG_WHEEL_SIZE 7u /* Size of timer wheel (#Spokes) */ -#define OS_TMR_CFG_TICKS_PER_SEC 10u /* Rate at which timer management task runs (Hz) */ - - - /* ---------------------- TRACE RECORDER ---------------------- */ -#define OS_TRACE_EN 0u /* Enable (1) or Disable (0) uC/OS-II Trace instrumentation */ -#define OS_TRACE_API_ENTER_EN 0u /* Enable (1) or Disable (0) uC/OS-II Trace API enter instrum. */ -#define OS_TRACE_API_EXIT_EN 0u /* Enable (1) or Disable (0) uC/OS-II Trace API exit instrum. */ - -#endif diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.cpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.cpp b/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/uc-os2/arm-cm/dpp_ek-tm4c123gxl/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/zephyr/blinky/CMakeLists.txt b/examples/zephyr/blinky/CMakeLists.txt deleted file mode 100644 index 5903d36db..000000000 --- a/examples/zephyr/blinky/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -# QPCPP Zephyr example -# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial - -cmake_minimum_required(VERSION 3.20.0) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) - -project(blinky) - -target_sources(app PRIVATE - src/main.cpp - src/bsp.cpp - src/blinky.cpp -) - -# QPCPP framework directory -# NOTE: -# Adjust this path for a different relative path -# between your project and the QPCPP folder -# -set(QPCPP_DIR ../../..) - -# option to turn QSPY software tracing ON or OFF -# NOTE: change of the option might require re-building the project -# -option(QSPY "QSPY software tracing" OFF) - -# QPCPP framework includes and sources... -zephyr_include_directories( - ${QPCPP_DIR}/include - ${QPCPP_DIR}/zephyr - ./src -) -target_sources(app PRIVATE - ${QPCPP_DIR}/src/qf/qep_hsm.cpp - ${QPCPP_DIR}/src/qf/qep_msm.cpp - ${QPCPP_DIR}/src/qf/qf_act.cpp - ${QPCPP_DIR}/src/qf/qf_qact.cpp - ${QPCPP_DIR}/src/qf/qf_defer.cpp - ${QPCPP_DIR}/src/qf/qf_dyn.cpp - ${QPCPP_DIR}/src/qf/qf_mem.cpp - ${QPCPP_DIR}/src/qf/qf_ps.cpp - ${QPCPP_DIR}/src/qf/qf_qact.cpp - ${QPCPP_DIR}/src/qf/qf_qeq.cpp - ${QPCPP_DIR}/src/qf/qf_qmact.cpp - ${QPCPP_DIR}/src/qf/qf_time.cpp - ${QPCPP_DIR}/zephyr/qf_port.cpp -) - -# QPCPP configuration with QSPY... -if(QSPY) - -add_compile_definitions(Q_SPY) - -target_sources(app PRIVATE - ${QPCPP_DIR}/src/qs/qs.cpp - ${QPCPP_DIR}/src/qs/qs_rx.cpp - ${QPCPP_DIR}/src/qs/qs_fp.cpp - ${QPCPP_DIR}/src/qs/qutest.cpp - ${QPCPP_DIR}/src/qs/qs_64bit.cpp - ${QPCPP_DIR}/src/qs/qstamp.cpp -) - -endif() - diff --git a/examples/zephyr/blinky/README.md b/examples/zephyr/blinky/README.md deleted file mode 100644 index 2554d7d72..000000000 --- a/examples/zephyr/blinky/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Blinky example - -# Overview - -Blinks an on-board LED once per second. The blinking is performed - by an Active Object (Blinky) with a state machine. - - -# Building and Running (Linux) - -Open a terminal in the directory of this example (`qpcpp/examples/zephry/blinky`). - -Depending on your Zephyr installation, you might need to shell the script -to configure Zephyr environment: - -``` -source ~/zephyrproject/zephyr/zephyr-env.sh -``` - -To build the example, type: -``` -west build -b -``` -where `` is one of the -[boards supported by Zephyr](https://docs.zephyrproject.org/latest/boards/index.html). -The `dpp` example has been tested with the following boards: - -``` -nucleo_l152re -nucleo_h743zi -``` - -To flush the board, type: -``` -west flash -``` - -# Sample Output -The application also produces ASCII output to the serial terminal -(if supported by the board): - -``` -*** Booting Zephyr OS build v2.6.0-rc2-88-g3d39f72a88b3 *** -BSP_ledOff -QF_onStartup -BSP_ledOn -BSP_ledOff -BSP_ledOn -BSP_ledOff -``` - diff --git a/examples/zephyr/blinky/prj.conf b/examples/zephyr/blinky/prj.conf deleted file mode 100644 index 25408c33e..000000000 --- a/examples/zephyr/blinky/prj.conf +++ /dev/null @@ -1,12 +0,0 @@ -# QPCPP Zephyr application -# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial - -CONFIG_CPLUSPLUS=y -CONFIG_NUM_COOP_PRIORITIES=29 -CONFIG_NUM_PREEMPT_PRIORITIES=40 -CONFIG_THREAD_NAME=y -CONFIG_REBOOT=y - -# for QSPY... -CONFIG_SERIAL=y -CONFIG_UART_INTERRUPT_DRIVEN=y diff --git a/examples/zephyr/blinky/src/blinky.cpp b/examples/zephyr/blinky/src/blinky.cpp deleted file mode 100644 index 59d24191e..000000000 --- a/examples/zephyr/blinky/src/blinky.cpp +++ /dev/null @@ -1,123 +0,0 @@ -//============================================================================ -// QP/C++ Real-Time Embedded Framework (RTEF) -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -//! @date Last updated on: 2022-08-25 -//! @version Last updated Zephyr 3.1.99 and @ref qpcpp_7_1_0 -//! -//! @file -//! @brief Blinky example -//! -#include "qpcpp.hpp" -#include "bsp.hpp" -#include "blinky.hpp" - -// unnamed namespace for local definitions with internal linkage -namespace { - -//Q_DEFINE_THIS_FILE - -} // unnamed namespace - -namespace APP { - -//............................................................................ -class Blinky : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - -public: - Blinky(); - static Blinky inst; - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(off); - Q_STATE_DECL(on); -}; - -// local objects -------------------------------------------------------------- -Blinky Blinky::inst; - -// global objects ------------------------------------------------------------ -QP::QActive * const AO_Blinky = &Blinky::inst; // opaque pointer - -//............................................................................ -Blinky::Blinky() - : QP::QActive(&initial), - m_timeEvt(this, TIMEOUT_SIG, 0U) -{ - // empty -} - -// HSM definition ------------------------------------------------------------ -Q_STATE_DEF(Blinky, initial) { - (void)e; // unused parameter - - // arm the time event to expire in half a second and every half second - m_timeEvt.armX(BSP::TICKS_PER_SEC/2U, BSP::TICKS_PER_SEC/2U); - return tran(&off); -} -//............................................................................ -Q_STATE_DEF(Blinky, off) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOff(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&on); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} -//............................................................................ -Q_STATE_DEF(Blinky, on) { - QP::QState status; - switch (e->sig) { - case Q_ENTRY_SIG: { - BSP::ledOn(); - status = Q_RET_HANDLED; - break; - } - case TIMEOUT_SIG: { - status = tran(&off); - break; - } - default: { - status = super(&top); - break; - } - } - return status; -} - -} // namespace APP - diff --git a/examples/zephyr/blinky/src/blinky.hpp b/examples/zephyr/blinky/src/blinky.hpp deleted file mode 100644 index 205c41ed1..000000000 --- a/examples/zephyr/blinky/src/blinky.hpp +++ /dev/null @@ -1,53 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ - -#ifndef BLINKY_HPP_ -#define BLINKY_HPP_ - -namespace APP { - -enum AppSignals : QP::QSignal { - DUMMY_SIG = QP::Q_USER_SIG, - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, - MAX_SIG // the last signal -}; - -// opaque pointer to the Blinky AO -extern QP::QActive * const AO_Blinky; - -} // namespace APP - -#endif // BLINKY_HPP_ diff --git a/examples/zephyr/blinky/src/bsp.cpp b/examples/zephyr/blinky/src/bsp.cpp deleted file mode 100644 index 9294b858a..000000000 --- a/examples/zephyr/blinky/src/bsp.cpp +++ /dev/null @@ -1,153 +0,0 @@ -//============================================================================ -// Product: Blinky example, Zephyr RTOS kernel -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // Blinky Application interface -#include "bsp.hpp" // Board Support Package - -#include -#include -// add other drivers if necessary... - -// The devicetree node identifier for the "led0" alias. -#define LED0_NODE DT_ALIAS(led0) - -#ifdef Q_SPY - #error Simple Blinky Application does not provide Spy build configuration -#endif - -// Local-scope objects ----------------------------------------------------- -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE // define the name of this file for assertions - -static struct gpio_dt_spec const l_led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios); -static struct k_timer zephyr_tick_timer; - -} // unnamed local namespace - -//============================================================================ -// Error handler - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - Q_PRINTK("\nERROR in %s:%d\n", module, id); - -#ifndef NDEBUG - k_panic(); // debug build: halt the system for error search... -#else - sys_reboot(SYS_REBOOT_COLD); // release build: reboot the system -#endif - for (;;) { // explicitly no-return - } -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -//............................................................................ -static void zephyr_tick_function(struct k_timer *tid); // prototype -static void zephyr_tick_function(struct k_timer *tid) { - Q_UNUSED_PAR(tid); - - QP::QTimeEvt::TICK_X(0U, &timerID); -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - int ret = gpio_pin_configure_dt(&l_led0, GPIO_OUTPUT_ACTIVE); - Q_ASSERT(ret >= 0); - - k_timer_init(&zephyr_tick_timer, &zephyr_tick_function, nullptr); -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - - static QP::QEvt const *blinkyQueueSto[10]; - static K_THREAD_STACK_DEFINE(blinkyStack, 1024); - APP::AO_Blinky->start( - 1U, // QP prio. of the AO - blinkyQueueSto, // event queue storage - Q_DIM(blinkyQueueSto), // queue length [events] - blinkyStack, // private stack for embOS - K_THREAD_STACK_SIZEOF(blinkyStack), // stack size [Zephyr] - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - gpio_pin_set_dt(&l_led0, true); -} -//............................................................................ -void ledOff() { - gpio_pin_set_dt(&l_led0, false); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -//............................................................................ -void QF::onStartup() { - k_timer_start(&zephyr_tick_timer, K_MSEC(1), K_MSEC(1)); - Q_PRINTK("QF::onStartup\n"); -} -//............................................................................ -void QF::onCleanup() { - Q_PRINTK("QF::onCleanup\n"); -} - -} // namespace QP - diff --git a/examples/zephyr/blinky/src/bsp.hpp b/examples/zephyr/blinky/src/bsp.hpp deleted file mode 100644 index b9a8a7e1b..000000000 --- a/examples/zephyr/blinky/src/bsp.hpp +++ /dev/null @@ -1,50 +0,0 @@ -//============================================================================ -// Blinky example -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void terminate(std::int16_t const result); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/zephyr/blinky/src/main.cpp b/examples/zephyr/blinky/src/main.cpp deleted file mode 100644 index b30685b92..000000000 --- a/examples/zephyr/blinky/src/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "blinky.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/zephyr/blinky/src/qp_config.hpp b/examples/zephyr/blinky/src/qp_config.hpp deleted file mode 100644 index 3bac92e2c..000000000 --- a/examples/zephyr/blinky/src/qp_config.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-26 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// This QP configuration header file must be provided in the QP applications -// for the Zephyr RTOS. This file might be empty, if the default settings of -// the QP framework are adequate. The configuration options for QP framework -// ared documented at: https://www.state-machine.com/qpcpp/qp__config_8hpp.html - -#endif // QP_CONFIG_HPP_ diff --git a/examples/zephyr/dpp/CMakeLists.txt b/examples/zephyr/dpp/CMakeLists.txt deleted file mode 100644 index 160a27f06..000000000 --- a/examples/zephyr/dpp/CMakeLists.txt +++ /dev/null @@ -1,65 +0,0 @@ -# QPCPP Zephyr example -# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial - -cmake_minimum_required(VERSION 3.20.0) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) - -project(dpp) - -target_sources(app PRIVATE - src/main.cpp - src/bsp.cpp - src/philo.cpp - src/table.cpp -) - -# QPCPP framework directory -# NOTE: -# Adjust this path for a different relative path -# between your project and the QPCPP folder -# -set(QPCPP_DIR ../../..) - -# option to turn QSPY software tracing ON or OFF -# NOTE: change of the option might require re-building the project -# -option(QSPY "QSPY software tracing" OFF) - -# QPCPP framework includes and sources... -zephyr_include_directories( - ${QPCPP_DIR}/include - ${QPCPP_DIR}/zephyr - ./src -) -target_sources(app PRIVATE - ${QPCPP_DIR}/src/qf/qep_hsm.cpp - ${QPCPP_DIR}/src/qf/qep_msm.cpp - ${QPCPP_DIR}/src/qf/qf_act.cpp - ${QPCPP_DIR}/src/qf/qf_qact.cpp - ${QPCPP_DIR}/src/qf/qf_defer.cpp - ${QPCPP_DIR}/src/qf/qf_dyn.cpp - ${QPCPP_DIR}/src/qf/qf_mem.cpp - ${QPCPP_DIR}/src/qf/qf_ps.cpp - ${QPCPP_DIR}/src/qf/qf_qact.cpp - ${QPCPP_DIR}/src/qf/qf_qeq.cpp - ${QPCPP_DIR}/src/qf/qf_qmact.cpp - ${QPCPP_DIR}/src/qf/qf_time.cpp - ${QPCPP_DIR}/zephyr/qf_port.cpp -) - -# QPCPP configuration with QSPY... -if(QSPY) - -add_compile_definitions(Q_SPY) - -target_sources(app PRIVATE - ${QPCPP_DIR}/src/qs/qs.cpp - ${QPCPP_DIR}/src/qs/qs_rx.cpp - ${QPCPP_DIR}/src/qs/qs_fp.cpp - ${QPCPP_DIR}/src/qs/qutest.cpp - ${QPCPP_DIR}/src/qs/qs_64bit.cpp - ${QPCPP_DIR}/src/qs/qstamp.cpp -) - -endif() - diff --git a/examples/zephyr/dpp/README.md b/examples/zephyr/dpp/README.md deleted file mode 100644 index 4ba621cea..000000000 --- a/examples/zephyr/dpp/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# DPP example - -# Overview -Dining Philosophers Problem (DPP) example with multiple -active objects. - - -# Building and Running (Linux) -Open a terminal in the directory of this example (`qpcpp/examples/zephry/dpp`). - -Depending on your Zephyr installation, you might need to shell the script -to configure Zephyr environment: - -``` -source ~/zephyrproject/zephyr/zephyr-env.sh -``` - -To build the example, type: -``` -west build -b -``` -where `` is one of the -[boards supported by Zephyr](https://docs.zephyrproject.org/latest/boards/index.html). -The `dpp` example has been tested with the following boards. - -Specific example for the `nucleo_h743zi` board: - -``` -west build -b nucleo_h743zi -``` - -## QP/Spy Build Configuration -The [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html) -is supported in this example and can be enabled by providing the command-line -option `-DQSPY=ON` to the build process: - -Specific example -``` -west build -b nucleo_h743zi -- -DQSPY=ON -``` - -> NOTE: The QP/Spy software tracing uses the Zephyr's console UART. -This means that the Zephyr `printk()` facility cannot be used while -QP/Spy is configured. - - -# Flashing the Board -To flush the board, type: -``` -west flash -``` - diff --git a/examples/zephyr/dpp/prj.conf b/examples/zephyr/dpp/prj.conf deleted file mode 100644 index 25408c33e..000000000 --- a/examples/zephyr/dpp/prj.conf +++ /dev/null @@ -1,12 +0,0 @@ -# QPCPP Zephyr application -# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial - -CONFIG_CPLUSPLUS=y -CONFIG_NUM_COOP_PRIORITIES=29 -CONFIG_NUM_PREEMPT_PRIORITIES=40 -CONFIG_THREAD_NAME=y -CONFIG_REBOOT=y - -# for QSPY... -CONFIG_SERIAL=y -CONFIG_UART_INTERRUPT_DRIVEN=y diff --git a/examples/zephyr/dpp/src/bsp.cpp b/examples/zephyr/dpp/src/bsp.cpp deleted file mode 100644 index 78af3dbbc..000000000 --- a/examples/zephyr/dpp/src/bsp.cpp +++ /dev/null @@ -1,341 +0,0 @@ -//============================================================================ -// Product: "Dining Philosophers Problem" example, Zephyr RTOS kernel -// Last updated for: @ref qpcpp_7_3_0 -// Last updated on 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -#include -#include -// add other drivers if necessary... - -// The devicetree node identifier for the "led0" alias. -#define LED0_NODE DT_ALIAS(led0) - -// Local-scope objects ----------------------------------------------------- -namespace { // unnamed local namespace - -Q_DEFINE_THIS_FILE // define the name of this file for assertions - -static struct gpio_dt_spec const l_led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios); -static struct k_timer zephyr_tick_timer; -static std::uint32_t l_rnd; // random seed - -#ifdef Q_SPY - - // QSpy source IDs - static QP::QSpyId const timerID = { QP::QS_AP_ID }; - - enum AppRecords { // application-specific trace records - PHILO_STAT = QP::QS_USER, - PAUSED_STAT, - }; - -#endif - -} // unnamed local namespace - -//============================================================================ -// Error handler - -extern "C" { - -Q_NORETURN Q_onError(char const * const module, int_t const id) { - // NOTE: this implementation of the assertion handler is intended only - // for debugging and MUST be changed for deployment of the application - // (assuming that you ship your production code with assertions enabled). - Q_UNUSED_PAR(module); - Q_UNUSED_PAR(id); - QS_ASSERTION(module, id, 10000U); - Q_PRINTK("\nERROR in %s:%d\n", module, id); - -#ifndef NDEBUG - k_panic(); // debug build: halt the system for error search... -#else - sys_reboot(SYS_REBOOT_COLD); // release build: reboot the system -#endif - for (;;) { // explicitly no-return - } -} -//............................................................................ -void assert_failed(char const * const module, int_t const id); // prototype -void assert_failed(char const * const module, int_t const id) { - Q_onError(module, id); -} - -//............................................................................ -static void zephyr_tick_function(struct k_timer *tid); // prototype -static void zephyr_tick_function(struct k_timer *tid) { - Q_UNUSED_PAR(tid); - - QP::QTimeEvt::TICK_X(0U, &timerID); -} - -} // extern "C" - -//============================================================================ -namespace BSP { - -void init() { - int ret = gpio_pin_configure_dt(&l_led0, GPIO_OUTPUT_ACTIVE); - Q_ASSERT(ret >= 0); - - k_timer_init(&zephyr_tick_timer, &zephyr_tick_function, nullptr); - - randomSeed(1234U); - - // initialize the QS software tracing... - if (!QS_INIT(nullptr)) { - Q_ERROR(); - } - - QS_OBJ_DICTIONARY(&timerID); - - QS_USR_DICTIONARY(PHILO_STAT); - QS_USR_DICTIONARY(PAUSED_STAT); - - QS_ONLY(APP::produce_sig_dict()); - - // setup the QS filters... - QS_GLB_FILTER(QP::QS_ALL_RECORDS); // all records - QS_GLB_FILTER(-QP::QS_QF_TICK); // exclude the tick record -} -//............................................................................ -void start() { - // initialize event pools - static QF_MPOOL_EL(APP::TableEvt) smlPoolSto[2*APP::N_PHILO]; - QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); - - // initialize publish-subscribe - static QP::QSubscrList subscrSto[APP::MAX_PUB_SIG]; - QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); - - // start AOs/threads... - - static QP::QEvt const *philoQueueSto[APP::N_PHILO][10]; - static K_THREAD_STACK_DEFINE(philoStack[APP::N_PHILO], 512); - for (std::uint8_t n = 0U; n < APP::N_PHILO; ++n) { - APP::AO_Philo[n]->start( - n + 3U, // QP prio. of the AO - philoQueueSto[n], // event queue storage - Q_DIM(philoQueueSto[n]), // queue length [events] - philoStack[n], // private stack for embOS - K_THREAD_STACK_SIZEOF(philoStack[n]), // stack size [Zephyr] - nullptr); // no initialization param - } - - static QP::QEvt const *tableQueueSto[APP::N_PHILO]; - static K_THREAD_STACK_DEFINE(tableStack, 1024); - APP::AO_Table->start( - APP::N_PHILO + 7U, // QP prio. of the AO - tableQueueSto, // event queue storage - Q_DIM(tableQueueSto), // queue length [events] - tableStack, // private stack for embOS - K_THREAD_STACK_SIZEOF(tableStack), // stack size [Zephyr] - nullptr); // no initialization param -} -//............................................................................ -void ledOn() { - gpio_pin_set_dt(&l_led0, true); -} -//............................................................................ -void ledOff() { - gpio_pin_set_dt(&l_led0, false); -} -//............................................................................ -void displayPhilStat(std::uint8_t n, char const *stat) { - Q_UNUSED_PAR(n); - - if (stat[0] == 'e') { - ledOn(); - } - else { - ledOff(); - } - Q_PRINTK("Philo[%d]->%s\n", n, stat); - - // app-specific record - QS_BEGIN_ID(PHILO_STAT, APP::AO_Philo[n]->getPrio()) - QS_U8(1, n); // Philosopher number - QS_STR(stat); // Philosopher status - QS_END() -} -//............................................................................ -void displayPaused(std::uint8_t paused) { - if (paused) { - //BSP_ledOn(); - } - else { - //BSP_ledOff(); - } - - QS_BEGIN_ID(PAUSED_STAT, 0U) // app-specific record - QS_U8(1, paused); // Paused status - QS_END() -} -//............................................................................ -std::uint32_t random() { // a very cheap pseudo-random-number generator - // exercise the FPU with some floating point computations - // NOTE: this code can be only called from a task that created with - // the option OS_TASK_OPT_SAVE_FP. - float volatile x = 3.1415926F; - x = x + 2.7182818F; - - // "Super-Duper" Linear Congruential Generator (LCG) - // LCG(2^32, 3*7*11*13*23, 0, seed) - // - std::uint32_t rnd = l_rnd * (3U*7U*11U*13U*23U); - l_rnd = rnd; // set for the next time - - return (rnd >> 8); -} -//............................................................................ -void randomSeed(std::uint32_t seed) { - l_rnd = seed; -} -//............................................................................ -void terminate(std::int16_t result) { - Q_UNUSED_PAR(result); - QP::QF::stop(); -} - -} // namespace BSP - -//============================================================================ -namespace QP { - -//............................................................................ -void QF::onStartup() { - k_timer_start(&zephyr_tick_timer, K_MSEC(1), K_MSEC(1)); - Q_PRINTK("QF::onStartup\n"); -} -//............................................................................ -void QF::onCleanup() { - Q_PRINTK("QF::onCleanup\n"); -} - -// QS callbacks ============================================================== -#ifdef Q_SPY - -#include - -// select the Zephyr shell UART -// NOTE: you can change this to other UART peripheral if desired -static struct device const *uart_dev = - DEVICE_DT_GET(DT_CHOSEN(zephyr_shell_uart)); - -//............................................................................ -static void uart_cb(const struct device *dev, void *user_data) { - if (!uart_irq_update(uart_dev)) { - return; - } - - if (uart_irq_rx_ready(uart_dev)) { - std::uint8_t buf[32]; - int n = uart_fifo_read(uart_dev, buf, sizeof(buf)); - for (std::uint8_t const *p = buf; n > 0; --n, ++p) { - QS::rxPut(*p); - } - } -} -//............................................................................ -bool QS::onStartup(void const *arg) { - Q_UNUSED_PAR(arg); - - Q_REQUIRE(uart_dev != nullptr); - - static std::uint8_t qsTxBuf[2*1024]; // buffer for QS-TX channel - initBuf(qsTxBuf, sizeof(qsTxBuf)); - - static std::uint8_t qsRxBuf[128]; // buffer for QS-RX channel - rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); - - // configure interrupt and callback to receive data - uart_irq_callback_user_data_set(uart_dev, &uart_cb, nullptr); - uart_irq_rx_enable(uart_dev); - - return true; // return success -} -//............................................................................ -void QS::onCleanup(void) { -} -//............................................................................ -QSTimeCtr QS::onGetTime(void) { // NOTE: invoked with interrupts DISABLED - return k_cycle_get_32(); -} -//............................................................................ -// NOTE: -// No critical section in QS::onFlush() to avoid nesting of critical sections -// in case QS::onFlush() is called from Q_onError(). -void QS::onFlush(void) { - std::uint16_t len = 0xFFFFU; // to get as many bytes as available - std::uint8_t const *buf; - while ((buf = getBlock(&len)) != nullptr) { // QS-TX data available? - for (; len != 0U; --len, ++buf) { - uart_poll_out(uart_dev, *buf); - } - len = 0xFFFFU; // to get as many bytes as available - } -} -//............................................................................ -void QS::doOutput(void) { - std::uint16_t len = 0xFFFFU; // big number to get all available bytes - - QF_CRIT_STAT - QF_CRIT_ENTRY(); - std::uint8_t const *buf = getBlock(&len); - QF_CRIT_EXIT(); - - // transmit the bytes via the UART... - for (; len != 0U; --len, ++buf) { - uart_poll_out(uart_dev, *buf); - } -} -//............................................................................ -void QS::onReset(void) { - sys_reboot(SYS_REBOOT_COLD); -} -//............................................................................ -void QS::onCommand(std::uint8_t cmdId, std::uint32_t param1, - std::uint32_t param2, std::uint32_t param3) -{ - Q_UNUSED_PAR(cmdId); - Q_UNUSED_PAR(param1); - Q_UNUSED_PAR(param2); - Q_UNUSED_PAR(param3); -} - -#endif // Q_SPY - -} // namespace QP - diff --git a/examples/zephyr/dpp/src/bsp.hpp b/examples/zephyr/dpp/src/bsp.hpp deleted file mode 100644 index aca82198e..000000000 --- a/examples/zephyr/dpp/src/bsp.hpp +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// Product: DPP example (console) -// Last Updated for Version: 7.3.0 -// Date of the Last Update: 2023-08-24 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#ifndef BSP_HPP_ -#define BSP_HPP_ - -namespace BSP { - -constexpr std::uint32_t TICKS_PER_SEC {1000U}; - -void init(); -void start(); -void displayPaused(std::uint8_t const paused); -void displayPhilStat(std::uint8_t const n, char const *stat); -void terminate(std::int16_t const result); - -void randomSeed(std::uint32_t const seed); // random seed -std::uint32_t random(void); // pseudo-random generator - -// for testing... -void wait4SW1(void); -void ledOn(void); -void ledOff(void); - -} // namespace BSP - -#endif // BSP_HPP_ - diff --git a/examples/zephyr/dpp/src/dpp.hpp b/examples/zephyr/dpp/src/dpp.hpp deleted file mode 100644 index 5172c9a52..000000000 --- a/examples/zephyr/dpp/src/dpp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::dpp.hpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#ifndef DPP_HPP_ -#define DPP_HPP_ - -//$declare${Shared} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AppSignals} ...................................................... -enum AppSignals : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - -//${Shared::produce_sig_dict} ................................................ -#ifdef Q_SPY -inline void produce_sig_dict() { - QS_SIG_DICTIONARY(EAT_SIG, nullptr); - QS_SIG_DICTIONARY(DONE_SIG, nullptr); - QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); - QS_SIG_DICTIONARY(SERVE_SIG, nullptr); - QS_SIG_DICTIONARY(TEST_SIG, nullptr); - - QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); - QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); -} -#endif // def Q_SPY - -//${Shared::N_PHILO} ......................................................... -constexpr std::uint8_t N_PHILO {5}; - -//${Shared::TableEvt} ........................................................ -class TableEvt : public QP::QEvt { -public: - std::uint8_t philoId; - -public: - constexpr TableEvt( - QP::QSignal sig, - std::uint8_t id) - : QEvt(sig), - philoId(id) - {} - -#ifdef QEVT_DYN_CTOR - TableEvt(std::uint8_t id) - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - {} -#endif // def QEVT_DYN_CTOR -}; // class TableEvt - -//${Shared::AO_Philo[N_PHILO]} ............................................... -extern QP::QActive * const AO_Philo[N_PHILO]; - -//${Shared::AO_Table} ........................................................ -extern QP::QActive * const AO_Table; - -} // namespace APP -//$enddecl${Shared} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ diff --git a/examples/zephyr/dpp/src/dpp.qm b/examples/zephyr/dpp/src/dpp.qm deleted file mode 100644 index 1de2b108f..000000000 --- a/examples/zephyr/dpp/src/dpp.qm +++ /dev/null @@ -1,528 +0,0 @@ - - - Dining Philosopher Problem example application - - - - - - - : QP::QSignal { - EAT_SIG = QP::Q_USER_SIG, // published by Table to let a Philo eat - DONE_SIG, // published by Philo when done eating - PAUSE_SIG, // published by BSP to pause the application - SERVE_SIG, // published by BSP to serve re-start serving forks - TEST_SIG, // published by BSP to test the application - MAX_PUB_SIG, // the last published signal - - TIMEOUT_SIG, // posted by time event to Philo - HUNGRY_SIG, // posted by hungry Philo to Table - MAX_SIG // the last signal -}; - - - - QS_SIG_DICTIONARY(EAT_SIG, nullptr); -QS_SIG_DICTIONARY(DONE_SIG, nullptr); -QS_SIG_DICTIONARY(PAUSE_SIG, nullptr); -QS_SIG_DICTIONARY(SERVE_SIG, nullptr); -QS_SIG_DICTIONARY(TEST_SIG, nullptr); - -QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); -QS_SIG_DICTIONARY(HUNGRY_SIG, nullptr); - - - - {5}; - - - - - - - - - - - - : QEvt(sig), - philoId(id) - - - - - - : QEvt(QP::QEvt::DYNAMIC), - philoId(id) - - - - - = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - - - - = &Table::inst; - - - - - - - The Philo AO and the N_PHILO instances - - - - - - - - - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) - - - - - - Q_UNUSED_PAR(e); - -m_id = static_cast<std::uint8_t>(this - &inst[0]); - -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); -QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - -subscribe(EAT_SIG); -subscribe(TEST_SIG); - - - - - - - m_timeEvt.armX(think_time(), 0U); - m_timeEvt.disarm(); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - #ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); -pe->philoId = m_id; -#endif -AO_Table->POST(pe, this); - - - - - Q_EVT_CAST(TableEvt)->philoId == m_id - - - - - - - - - - - // DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - m_timeEvt.armX(eat_time(), 0U); - m_timeEvt.disarm(); - -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); -#else -TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); -pe->philoId = m_id; -#endif -QP::QActive::PUBLISH(pe, this); - - - - - - - - - // EAT or DONE must be for other Philos than this one -Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - - - - - - - - - - - - - - - - - - - - - - - : QActive(Q_STATE_CAST(&initial)) - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; -} - - - - - - Q_UNUSED_PAR(e); - -QS_OBJ_DICTIONARY(&Table::inst); - -subscribe(DONE_SIG); -subscribe(PAUSE_SIG); -subscribe(SERVE_SIG); -subscribe(TEST_SIG); - -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); -} - - - - - - - - - - - - - - - Q_ERROR(); - - - - - - - // give permissions to eat... -for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); -#else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; -#endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } -} - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, HUNGRY); -std::uint8_t m = left(n); - - - (m_fork[m] == FREE) && (m_fork[n] == FREE) - m_fork[m] = USED; -m_fork[n] = USED; -#ifdef QEVT_DYN_CTOR -TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); -#else -TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); -pe->philoId = n; -#endif -QP::QActive::PUBLISH(pe, this); -BSP::displayPhilStat(n, EATING); - - - - - - - else - m_isHungry[n] = true; - - - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; -m = right(n); // check the right neighbor - -if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} -m = left(n); // check the left neighbor -n = left(m); // left fork of the left neighbor -if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; -#ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); -#else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; -#endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); -} - - - - - - - Q_ERROR(); - - - - - - - - - - - - - - - - - BSP::displayPaused(1U); - BSP::displayPaused(0U); - - - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// philo ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -m_isHungry[n] = true; -BSP::displayPhilStat(n, HUNGRY); - - - - - - - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - -// phil ID must be in range and he must be not hungry -Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - -BSP::displayPhilStat(n, THINKING); -std::uint8_t m = left(n); - -// both forks of Phil[n] must be used -Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - -m_fork[m] = FREE; -m_fork[n] = FREE; - - - - - - - - - - - - - - - - - - - - #ifndef DPP_HPP_ -#define DPP_HPP_ - -$declare ${Shared} - -#ifdef QXK_HPP_ - -namespace APP { - -extern QP::QXThread * const TH_XThread1; -extern QP::QXThread * const TH_XThread2; -extern QP::QXSemaphore TH_sema; -extern QP::QXMutex TH_mutex; - -} // namespace APP - -#endif // QXK_HPP_ - -#endif // DPP_HPP_ - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast<QP::QTimeEvtCtr>((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -$declare ${AOs::Philo} - -$define ${Shared::AO_Philo[N_PHILO]} -$define ${AOs::Philo} - - - - #include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -$declare ${AOs::Table} - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast<std::uint8_t>((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -$define ${Shared::AO_Table} -$define ${AOs::Table} - - - diff --git a/examples/zephyr/dpp/src/main.cpp b/examples/zephyr/dpp/src/main.cpp deleted file mode 100644 index 8b147a0c3..000000000 --- a/examples/zephyr/dpp/src/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================ -// APP example -// Last updated for version 7.3.0 -// Last updated on 2023-08-09 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. -// -// This program is open source software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Alternatively, this program may be distributed and modified under the -// terms of Quantum Leaps commercial licenses, which expressly supersede -// the GNU General Public License and are specifically designed for -// licensees interested in retaining the proprietary status of their code. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// Contact information: -// -// -//============================================================================ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//............................................................................ -int main() { - QP::QF::init(); // initialize the framework - BSP::init(); // initialize the BSP - BSP::start(); // start the AOs/Threads - return QP::QF::run(); // run the QF application -} diff --git a/examples/zephyr/dpp/src/philo.cpp b/examples/zephyr/dpp/src/philo.cpp deleted file mode 100644 index 79bc5f36e..000000000 --- a/examples/zephyr/dpp/src/philo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::philo.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//---------------------------------------------------------------------------- -namespace { // unnamed namespace for local definitions with internal linkage - -Q_DEFINE_THIS_FILE - -// helper function to provide a randomized think time for Philos -static inline QP::QTimeEvtCtr think_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + (BSP::TICKS_PER_SEC/2U)); -} - -// helper function to provide a randomized eat time for Philos -static inline QP::QTimeEvtCtr eat_time() { - return static_cast((BSP::random() % BSP::TICKS_PER_SEC) - + BSP::TICKS_PER_SEC); -} - -} // unnamed namespace -//---------------------------------------------------------------------------- - -//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -class Philo : public QP::QActive { -private: - QP::QTimeEvt m_timeEvt; - std::uint8_t m_id; - -public: - static Philo inst[N_PHILO]; - -public: - Philo(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(thinking); - Q_STATE_DECL(hungry); - Q_STATE_DECL(eating); -}; // class Philo - -} // namespace APP -//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Philo[N_PHILO]} ............................................... -QP::QActive * const AO_Philo[N_PHILO] = { - &Philo::inst[0], - &Philo::inst[1], - &Philo::inst[2], - &Philo::inst[3], - &Philo::inst[4] -}; - -} // namespace APP -//$enddef${Shared::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Philo} .............................................................. -Philo Philo::inst[N_PHILO]; - -//${AOs::Philo::Philo} ....................................................... -Philo::Philo() - : QActive(Q_STATE_CAST(&initial)), - m_timeEvt(this, TIMEOUT_SIG, 0U), - m_id(0xFFU) -{} - -//${AOs::Philo::SM} .......................................................... -Q_STATE_DEF(Philo, initial) { - //${AOs::Philo::SM::initial} - Q_UNUSED_PAR(e); - - m_id = static_cast(this - &inst[0]); - - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id], m_id); - QS_OBJ_ARR_DICTIONARY(&Philo::inst[m_id].m_timeEvt, m_id); - - subscribe(EAT_SIG); - subscribe(TEST_SIG); - - QS_FUN_DICTIONARY(&Philo::thinking); - QS_FUN_DICTIONARY(&Philo::hungry); - QS_FUN_DICTIONARY(&Philo::eating); - - return tran(&thinking); -} - -//${AOs::Philo::SM::thinking} ................................................ -Q_STATE_DEF(Philo, thinking) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::thinking} - case Q_ENTRY_SIG: { - m_timeEvt.armX(think_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&hungry); - break; - } - //${AOs::Philo::SM::thinking::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::thinking::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::hungry} .................................................. -Q_STATE_DEF(Philo, hungry) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::hungry} - case Q_ENTRY_SIG: { - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, HUNGRY_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); - pe->philoId = m_id; - #endif - AO_Table->POST(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::hungry::EAT} - case EAT_SIG: { - //${AOs::Philo::SM::hungry::EAT::[e->philoId==m_id]} - if (Q_EVT_CAST(TableEvt)->philoId == m_id) { - status_ = tran(&eating); - } - else { - status_ = Q_RET_UNHANDLED; - } - break; - } - //${AOs::Philo::SM::hungry::DONE} - case DONE_SIG: { - // DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Philo::SM::eating} .................................................. -Q_STATE_DEF(Philo, eating) { - QP::QState status_; - switch (e->sig) { - //${AOs::Philo::SM::eating} - case Q_ENTRY_SIG: { - m_timeEvt.armX(eat_time(), 0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating} - case Q_EXIT_SIG: { - m_timeEvt.disarm(); - - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, DONE_SIG, m_id); - #else - TableEvt *pe = Q_NEW(TableEvt, DONE_SIG); - pe->philoId = m_id; - #endif - QP::QActive::PUBLISH(pe, this); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Philo::SM::eating::TIMEOUT} - case TIMEOUT_SIG: { - status_ = tran(&thinking); - break; - } - //${AOs::Philo::SM::eating::EAT, DONE} - case EAT_SIG: // intentionally fall through - case DONE_SIG: { - // EAT or DONE must be for other Philos than this one - Q_ASSERT(Q_EVT_CAST(TableEvt)->philoId != m_id); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/zephyr/dpp/src/qp_config.hpp b/examples/zephyr/dpp/src/qp_config.hpp deleted file mode 100644 index 3bac92e2c..000000000 --- a/examples/zephyr/dpp/src/qp_config.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// QP configuration file example -// Last updated for version: 7.3.0 -// Last updated on: 2023-09-26 -// -// Q u a n t u m L e a P s -// ------------------------ -// Modern Embedded Software -// -// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved. -// -// 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: -// -// -//============================================================================ -#ifndef QP_CONFIG_HPP_ -#define QP_CONFIG_HPP_ - -// NOTE: -// This QP configuration header file must be provided in the QP applications -// for the Zephyr RTOS. This file might be empty, if the default settings of -// the QP framework are adequate. The configuration options for QP framework -// ared documented at: https://www.state-machine.com/qpcpp/qp__config_8hpp.html - -#endif // QP_CONFIG_HPP_ diff --git a/examples/zephyr/dpp/src/table.cpp b/examples/zephyr/dpp/src/table.cpp deleted file mode 100644 index d3a672ecc..000000000 --- a/examples/zephyr/dpp/src/table.cpp +++ /dev/null @@ -1,348 +0,0 @@ -//$file${.::table.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// -// Model: dpp.qm -// File: ${.::table.cpp} -// -// This code has been generated by QM 5.3.0 . -// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// -// This generated code is open source 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: -// -// -// -//$endhead${.::table.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -#include "qpcpp.hpp" // QP/C++ real-time embedded framework -#include "dpp.hpp" // DPP Application interface -#include "bsp.hpp" // Board Support Package - -//$declare${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -class Table : public QP::QActive { -private: - std::uint8_t m_fork[N_PHILO]; - bool m_isHungry[N_PHILO]; - -public: - static Table inst; - -public: - Table(); - -protected: - Q_STATE_DECL(initial); - Q_STATE_DECL(active); - Q_STATE_DECL(serving); - Q_STATE_DECL(paused); -}; // class Table - -} // namespace APP -//$enddecl${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//---------------------------------------------------------------------------- -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_FILE - -// helper function to provide the RIGHT neighbour of a Philo[n] -static inline std::uint8_t right(std::uint8_t const n) { - return static_cast((n + (APP::N_PHILO - 1U)) % APP::N_PHILO); -} - -// helper function to provide the LEFT neighbour of a Philo[n] -static inline std::uint8_t left(std::uint8_t const n) { - return static_cast((n + 1U) % APP::N_PHILO); -} - -static constexpr std::uint8_t FREE {0U}; -static constexpr std::uint8_t USED {1U}; - -static constexpr char const * const THINKING {"thinking"}; -static constexpr char const * const HUNGRY {"hungry "}; -static constexpr char const * const EATING {"eating "}; - -} // unnamed namespace -//---------------------------------------------------------------------------- -//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -// Check for the minimum required QP version -#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 7.3.0 or higher required -#endif -//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -//$define${Shared::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${Shared::AO_Table} ........................................................ -QP::QActive * const AO_Table = &Table::inst; - -} // namespace APP -//$enddef${Shared::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -//$define${AOs::Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -namespace APP { - -//${AOs::Table} .............................................................. -Table Table::inst; - -//${AOs::Table::Table} ....................................................... -Table::Table() - : QActive(Q_STATE_CAST(&initial)) -{ - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - } -} - -//${AOs::Table::SM} .......................................................... -Q_STATE_DEF(Table, initial) { - //${AOs::Table::SM::initial} - Q_UNUSED_PAR(e); - - QS_OBJ_DICTIONARY(&Table::inst); - - subscribe(DONE_SIG); - subscribe(PAUSE_SIG); - subscribe(SERVE_SIG); - subscribe(TEST_SIG); - - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - m_fork[n] = FREE; - m_isHungry[n] = false; - BSP::displayPhilStat(n, THINKING); - } - - QS_FUN_DICTIONARY(&Table::active); - QS_FUN_DICTIONARY(&Table::serving); - QS_FUN_DICTIONARY(&Table::paused); - - return tran(&serving); -} - -//${AOs::Table::SM::active} .................................................. -Q_STATE_DEF(Table, active) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::TEST} - case TEST_SIG: { - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&top); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::serving} ......................................... -Q_STATE_DEF(Table, serving) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::serving} - case Q_ENTRY_SIG: { - // give permissions to eat... - for (std::uint8_t n = 0U; n < N_PHILO; ++n) { - if (m_isHungry[n] - && (m_fork[left(n)] == FREE) - && (m_fork[n] == FREE)) - { - m_fork[left(n)] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *te = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *te = Q_NEW(TableEvt, EAT_SIG); - te->philoId = n; - #endif - QP::QActive::PUBLISH(te, this); - m_isHungry[n] = false; - BSP::displayPhilStat(n, EATING); - } - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, HUNGRY); - std::uint8_t m = left(n); - //${AOs::Table::SM::active::serving::HUNGRY::[bothfree]} - if ((m_fork[m] == FREE) && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, n); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = n; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(n, EATING); - status_ = Q_RET_HANDLED; - } - //${AOs::Table::SM::active::serving::HUNGRY::[else]} - else { - m_isHungry[n] = true; - status_ = Q_RET_HANDLED; - } - break; - } - //${AOs::Table::SM::active::serving::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - m = right(n); // check the right neighbor - - if (m_isHungry[m] && (m_fork[m] == FREE)) { - m_fork[n] = USED; - m_fork[m] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - m = left(n); // check the left neighbor - n = left(m); // left fork of the left neighbor - if (m_isHungry[m] && (m_fork[n] == FREE)) { - m_fork[m] = USED; - m_fork[n] = USED; - m_isHungry[m] = false; - #ifdef QEVT_DYN_CTOR - TableEvt const *pe = Q_NEW(TableEvt, EAT_SIG, m); - #else - TableEvt *pe = Q_NEW(TableEvt, EAT_SIG); - pe->philoId = m; - #endif - QP::QActive::PUBLISH(pe, this); - BSP::displayPhilStat(m, EATING); - } - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::EAT} - case EAT_SIG: { - Q_ERROR(); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::serving::PAUSE} - case PAUSE_SIG: { - status_ = tran(&paused); - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -//${AOs::Table::SM::active::paused} .......................................... -Q_STATE_DEF(Table, paused) { - QP::QState status_; - switch (e->sig) { - //${AOs::Table::SM::active::paused} - case Q_ENTRY_SIG: { - BSP::displayPaused(1U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused} - case Q_EXIT_SIG: { - BSP::displayPaused(0U); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::SERVE} - case SERVE_SIG: { - status_ = tran(&serving); - break; - } - //${AOs::Table::SM::active::paused::HUNGRY} - case HUNGRY_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // philo ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - m_isHungry[n] = true; - BSP::displayPhilStat(n, HUNGRY); - status_ = Q_RET_HANDLED; - break; - } - //${AOs::Table::SM::active::paused::DONE} - case DONE_SIG: { - std::uint8_t n = Q_EVT_CAST(TableEvt)->philoId; - - // phil ID must be in range and he must be not hungry - Q_ASSERT((n < N_PHILO) && (!m_isHungry[n])); - - BSP::displayPhilStat(n, THINKING); - std::uint8_t m = left(n); - - // both forks of Phil[n] must be used - Q_ASSERT((m_fork[n] == USED) && (m_fork[m] == USED)); - - m_fork[m] = FREE; - m_fork[n] = FREE; - status_ = Q_RET_HANDLED; - break; - } - default: { - status_ = super(&active); - break; - } - } - return status_; -} - -} // namespace APP -//$enddef${AOs::Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/include/qp.hpp b/include/qp.hpp index adb301784..8cb9c9849 100644 --- a/include/qp.hpp +++ b/include/qp.hpp @@ -47,8 +47,8 @@ #define QP_VERSION 733U #define QP_VERSION_STR "7.3.3" -//! Encrypted current QP release (7.3.3) and date (2024-01-31) -#define QP_RELEASE 0x70DEE7F2U +//! Encrypted current QP release (7.3.3) and date (2024-03-01) +#define QP_RELEASE 0x70C4F752U //============================================================================ //! @cond INTERNAL diff --git a/include/qs.hpp b/include/qs.hpp index 0d10df0ac..24e4bcaaf 100644 --- a/include/qs.hpp +++ b/include/qs.hpp @@ -837,6 +837,11 @@ inline bool rxPut(std::uint8_t const b) noexcept { //${QS::QS-RX::rxParse} ...................................................... void rxParse(); +//${QS::QS-RX::setCurrObj} ................................................... +void setCurrObj( + std::uint8_t const obj_kind, + void * const obj_ptr); + //${QS::QS-RX::rxGetNfree} ................................................... std::uint16_t rxGetNfree() noexcept; diff --git a/ports/posix-qutest/qutest_port.cpp b/ports/posix-qutest/qutest_port.cpp index e885347b9..17cf3de04 100644 --- a/ports/posix-qutest/qutest_port.cpp +++ b/ports/posix-qutest/qutest_port.cpp @@ -22,11 +22,11 @@ // // //============================================================================ -//! @date Last updated on: 2023-08-21 -//! @version Last updated for: @ref qpcpp_7_3_0 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file -//! @brief QUTEST port for POSIX, GNU +//! @brief QS/C++ "port" to QUTest with POSIX // expose features from the 2008 POSIX standard (IEEE Standard 1003.1-2008) #define _POSIX_C_SOURCE 200809L @@ -42,6 +42,7 @@ #include "safe_std.h" // portable "safe" / facilities #include +#include #include #include #include @@ -50,7 +51,6 @@ #include #include #include -#include #include #define QS_TX_SIZE (8*1024) @@ -84,10 +84,10 @@ namespace QP { //............................................................................ bool QS::onStartup(void const *arg) { - static uint8_t qsBuf[QS_TX_SIZE]; // buffer for QS-TX channel + static std::uint8_t qsBuf[QS_TX_SIZE]; // buffer for QS-TX channel initBuf(qsBuf, sizeof(qsBuf)); - static uint8_t qsRxBuf[QS_RX_SIZE]; // buffer for QS-RX channel + static std::uint8_t qsRxBuf[QS_RX_SIZE]; // buffer for QS-RX channel rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); char hostName[128]; @@ -207,6 +207,9 @@ void QS::onReset() { } //............................................................................ void QS::onFlush() { + // NOTE: + // No critical section in QS_onFlush() to avoid nesting of critical sections + // in case QS_onFlush() is called from Q_onError(). if (l_sock == INVALID_SOCKET) { // socket NOT initialized? FPRINTF_S(stderr, " ERROR %s\n", "invalid TCP socket"); @@ -214,12 +217,9 @@ void QS::onFlush() { return; } - QS_CRIT_STAT - QS_CRIT_ENTRY(); std::uint16_t nBytes = QS_TX_CHUNK; std::uint8_t const *data; while ((data = getBlock(&nBytes)) != nullptr) { - QS_CRIT_EXIT(); for (;;) { // for-ever until break or return int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); if (nSent == SOCKET_ERROR) { // sending failed? @@ -247,23 +247,21 @@ void QS::onFlush() { } // set nBytes for the next call to QS::getBlock() nBytes = QS_TX_CHUNK; - QS_CRIT_ENTRY(); } - QS_CRIT_EXIT(); } //............................................................................ void QS::onTestLoop() { fd_set readSet; FD_ZERO(&readSet); + struct timeval timeout = { + (long)0, (long)(QS_TIMEOUT_MS * 1000) + }; + rxPriv_.inTestLoop = true; while (rxPriv_.inTestLoop) { FD_SET(l_sock, &readSet); - struct timeval timeout = { - (long)0, (long)(QS_TIMEOUT_MS * 1000) - }; - // selective, timed blocking on the TCP/IP socket... timeout.tv_usec = (long)(QS_TIMEOUT_MS * 1000); int status = select(l_sock + 1, &readSet, diff --git a/ports/posix-qv/qf_port.cpp b/ports/posix-qv/qf_port.cpp index 51836b3b4..5f9db2709 100644 --- a/ports/posix-qv/qf_port.cpp +++ b/ports/posix-qv/qf_port.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpc_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QF/C++ port to POSIX-QV (single-threaded) @@ -49,7 +49,6 @@ #include // for memcpy() and memset() #include #include -#include #include #include @@ -60,7 +59,6 @@ Q_DEFINE_THIS_MODULE("qf_port") // Local objects ============================================================= static bool l_isRunning; // flag indicating when QF is running -static struct termios l_tsav; // structure with saved terminal attributes static struct timespec l_tick; // structure for the clock tick static int_t l_tickPrio; // priority of the ticker thread @@ -111,7 +109,7 @@ static void sigIntHandler(int dummy) { } // unnamed local namespace -// Global objects ============================================================ +//============================================================================ namespace QP { namespace QF { @@ -139,9 +137,9 @@ void enterCriticalSection_() { //............................................................................ void leaveCriticalSection_() { if (l_isRunning) { - Q_ASSERT_INCRIT(200, l_critSectNest == 1); // crit.sect must ballace! + Q_ASSERT_INCRIT(200, l_critSectNest == 1); // crit.sect. must ballace! if ((--l_critSectNest) == 0) { - pthread_mutex_unlock(&l_critSectMutex_); + pthread_mutex_unlock(&l_critSectMutex_); } } } @@ -298,7 +296,13 @@ void setTickRate(std::uint32_t ticksPerSec, int tickPrio) { l_tickPrio = tickPrio; } -//............................................................................ +// console access ============================================================ +#ifdef QF_CONSOLE + +#include + +static struct termios l_tsav; // structure with saved terminal attributes + void consoleSetup() { struct termios tio; // modified terminal attributes @@ -317,7 +321,7 @@ int consoleGetKey() { ioctl(0, FIONREAD, &byteswaiting); if (byteswaiting > 0) { char ch; - read(0, &ch, 1); + byteswaiting = read(0, &ch, 1); return (int)ch; } return 0; // no input at this time @@ -326,6 +330,7 @@ int consoleGetKey() { int consoleWaitForKey() { return static_cast(getchar()); } +#endif } // namespace QF @@ -341,18 +346,18 @@ void QActive::start(QPrioSpec const prioSpec, // no per-AO stack needed for this port QF_CRIT_STAT QF_CRIT_ENTRY(); - Q_REQUIRE_INCRIT(600, stkSto == nullptr); + Q_REQUIRE_INCRIT(800, stkSto == nullptr); QF_CRIT_EXIT(); + m_eQueue.init(qSto, qLen); + m_prio = static_cast(prioSpec & 0xFFU); // QF-priority m_pthre = 0U; // preemption-threshold (not used in this port) - register_(); // make QF aware of this AO - - m_eQueue.init(qSto, qLen); + register_(); // register this AO // top-most initial tran. (virtual call) this->init(par, m_prio); - QS_FLUSH(); // flush the QS trace buffer to the host + QS_FLUSH(); // flush the trace buffer to the host } //............................................................................ diff --git a/ports/posix-qv/qp_port.hpp b/ports/posix-qv/qp_port.hpp index 4e2f246b0..3da4e54b8 100644 --- a/ports/posix-qv/qp_port.hpp +++ b/ports/posix-qv/qp_port.hpp @@ -27,8 +27,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-09-07 -//! @version Last updated for: @ref qpcpp_7_3_0 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QP/C++ port to POSIX-QV (signgle threaded), generic C++11 @@ -45,7 +45,7 @@ // no-return function specifier (C++11 Standard) #define Q_NORETURN [[ noreturn ]] void -// QActive event queue type +// QActive event queue and thread types for POSIX-QV #define QACTIVE_EQUEUE_TYPE QEQueue //QACTIVE_OS_OBJ_TYPE not used in this port //QACTIVE_THREAD_TYPE not used in this port @@ -66,16 +66,18 @@ void leaveCriticalSection_(); // set clock tick rate and p-thread priority // (NOTE ticksPerSec==0 disables the "ticker thread" -void setTickRate(uint32_t ticksPerSec, int tickPrio); +void setTickRate(std::uint32_t ticksPerSec, int tickPrio); // clock tick callback (NOTE not called when "ticker thread" is not running) void onClockTick(); -// abstractions for console access... -void consoleSetup(); -void consoleCleanup(); -int consoleGetKey(); -int consoleWaitForKey(); +#ifdef QF_CONSOLE + // abstractions for console access... + void consoleSetup(); + void consoleCleanup(); + int consoleGetKey(); + int consoleWaitForKey(); +#endif } // namespace QF } // namespace QP @@ -138,7 +140,7 @@ namespace QF { // the time. Such sections of code are called "critical sections". // // This port uses a pair of functions QF::enterCriticalSection_() / -// QF::leaveCriticalSection_() to enter/leave the cirtical section, +// QF::leaveCriticalSection_() to enter/leave the critical section, // respectively. // // These functions are implemented in the qf_port.cpp module, where they @@ -162,7 +164,7 @@ namespace QF { // // NOTE2: // Scheduler locking (used inside QActive::publish()) is not needed in the -// single-threaded port, because event multicasting is already atomic. +// single-threaded port because event multicasting is already atomic. // #endif // QP_PORT_HPP_ diff --git a/ports/posix/qf_port.cpp b/ports/posix/qf_port.cpp index 48593cf75..03e93b09f 100644 --- a/ports/posix/qf_port.cpp +++ b/ports/posix/qf_port.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpc_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QF/C++ port to POSIX (multithreaded with P-threads) @@ -49,7 +49,6 @@ #include // for memcpy() and memset() #include #include -#include #include #include @@ -61,10 +60,9 @@ Q_DEFINE_THIS_MODULE("qf_port") // initialize the startup mutex with default non-recursive initializer static pthread_mutex_t l_startupMutex = PTHREAD_MUTEX_INITIALIZER; -static bool l_isRunning; // flag indicating when QF is running -static struct termios l_tsav; // structure with saved terminal attributes -static struct timespec l_tick; -static int_t l_tickPrio; +static bool l_isRunning; // flag indicating when QF is running +static struct timespec l_tick; // structure for the clock tick +static int_t l_tickPrio; // priority of the ticker thread constexpr long NSEC_PER_SEC {1000000000L}; constexpr long DEFAULT_TICKS_PER_SEC {100L}; @@ -118,7 +116,7 @@ void init() { pthread_mutex_lock(&l_startupMutex); l_tick.tv_sec = 0; - l_tick.tv_nsec = NSEC_PER_SEC / DEFAULT_TICKS_PER_SEC; // default tick + l_tick.tv_nsec = NSEC_PER_SEC / DEFAULT_TICKS_PER_SEC; // default rate l_tickPrio = sched_get_priority_min(SCHED_FIFO); // default ticker prio // install the SIGINT (Ctrl-C) signal handler @@ -216,7 +214,13 @@ void setTickRate(std::uint32_t ticksPerSec, int tickPrio) { l_tickPrio = tickPrio; } -//............................................................................ +// console access ============================================================ +#ifdef QF_CONSOLE + +#include + +static struct termios l_tsav; // structure with saved terminal attributes + void consoleSetup() { struct termios tio; // modified terminal attributes @@ -235,7 +239,7 @@ int consoleGetKey() { ioctl(0, FIONREAD, &byteswaiting); if (byteswaiting > 0) { char ch; - read(0, &ch, 1); + byteswaiting = read(0, &ch, 1); return (int)ch; } return 0; // no input at this time @@ -244,6 +248,7 @@ int consoleGetKey() { int consoleWaitForKey() { return static_cast(getchar()); } +#endif } // namespace QF @@ -279,7 +284,10 @@ void QActive::start(QPrioSpec const prioSpec, Q_UNUSED_PAR(stkSize); // p-threads allocate stack internally - Q_REQUIRE_ID(800, stkSto == nullptr); + QF_CRIT_STAT + QF_CRIT_ENTRY(); + Q_REQUIRE_INCRIT(800, stkSto == nullptr); + QF_CRIT_EXIT(); pthread_cond_init(&m_osObject, 0); m_eQueue.init(qSto, qLen); @@ -308,9 +316,10 @@ void QActive::start(QPrioSpec const prioSpec, - QF_MAX_ACTIVE - 3U); pthread_attr_setschedparam(&attr, ¶m); - pthread_attr_setstacksize(&attr, (stkSize < PTHREAD_STACK_MIN - ? PTHREAD_STACK_MIN - : stkSize)); + pthread_attr_setstacksize(&attr, + (stkSize < static_cast(PTHREAD_STACK_MIN) + ? PTHREAD_STACK_MIN + : stkSize)); pthread_t thread; int err = pthread_create(&thread, &attr, &ao_thread, this); if (err != 0) { @@ -329,6 +338,7 @@ void QActive::start(QPrioSpec const prioSpec, pthread_attr_destroy(&attr); } + //............................................................................ #ifdef QACTIVE_CAN_STOP void QActive::stop() { @@ -367,6 +377,6 @@ void QActive::stop() { // However, QF limits the number of priority levels to QF_MAX_ACTIVE. // Assuming that a QF application will be real-time, this port reserves the // three highest p-thread priorities for the ISR-like threads (e.g., I/O), -// and the rest highest-priorities for the active objects. +// and the remaining highest-priorities for the active objects. // diff --git a/ports/posix/qp_port.hpp b/ports/posix/qp_port.hpp index b62586966..89453c91f 100644 --- a/ports/posix/qp_port.hpp +++ b/ports/posix/qp_port.hpp @@ -27,8 +27,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpc_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QP/C++ port to POSIX (multithreaded with P-threads), generic C++11 @@ -71,11 +71,13 @@ void setTickRate(uint32_t ticksPerSec, int tickPrio); // clock tick callback void onClockTick(); -// abstractions for console access... -void consoleSetup(); -void consoleCleanup(); -int consoleGetKey(); -int consoleWaitForKey(); +#ifdef QF_CONSOLE + // abstractions for console access... + void consoleSetup(); + void consoleCleanup(); + int consoleGetKey(); + int consoleWaitForKey(); +#endif } // namespace QF } // namespace QP @@ -134,7 +136,7 @@ namespace QF { // the time. Such sections of code are called "critical sections". // // This port uses a pair of functions QF::enterCriticalSection_() / -// QF::leaveCriticalSection_() to enter/leave the cirtical section, +// QF::leaveCriticalSection_() to enter/leave the critical section, // respectively. // // These functions are implemented in the qf_port.cpp module, where they @@ -159,8 +161,9 @@ namespace QF { // NOTE2: // Scheduler locking (used inside QActive_publish_()) is NOT implemented // in this port. This means that event multicasting is NOT atomic, so thread -// preemption CAN happen during that time. This can lead to (occasionally) -// unexpected event sequences. +// preemption CAN happen during that time, especially when a low-priority +// thread publishes events to higher-priority threads. This can lead to +// (occasionally) unexpected event sequences. // #endif // QP_PORT_HPP_ diff --git a/ports/win32-qutest/qutest_port.cpp b/ports/win32-qutest/qutest_port.cpp index 48a5fca6d..7041102b4 100644 --- a/ports/win32-qutest/qutest_port.cpp +++ b/ports/win32-qutest/qutest_port.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-12-13 -//! @version Last updated for: @ref qpcpp_7_3_2 +//! @date Last updated on: 2023-11-30 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QUTEST port for Windows, GNU or Visual C++ @@ -40,7 +40,6 @@ #include "safe_std.h" // portable "safe" / facilities #include #include -#include // Minimum required Windows version is Windows-XP or newer (0x0501) #ifdef WINVER @@ -276,20 +275,6 @@ void QS::onTestLoop() { } onFlush(); - - wint_t ch = 0; - while (_kbhit()) { // any key pressed? - ch = _getwch(); - } - switch (ch) { - case 'x': // 'x' pressed? - case 'X': // 'X' pressed? - case '\033': { // ESC pressed? - onCleanup(); - exit(1); - break; - } - } } // set inTestLoop to true in case calls to QS_onTestLoop() nest, // which can happen through the calls to QS_TEST_PAUSE(). diff --git a/ports/win32-qv/qf_port.cpp b/ports/win32-qv/qf_port.cpp index 96c0fb740..3399e074e 100644 --- a/ports/win32-qv/qf_port.cpp +++ b/ports/win32-qv/qf_port.cpp @@ -22,11 +22,11 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpcpp_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file -//! @brief QF/C++ port to Win32 API (single-threaded, like the QV kernel) +//! @brief QF/C++ port to Win32 (single-threaded, like the QV kernel) #define QP_IMPL // this is QP implementation #include "qp_port.hpp" // QP port @@ -188,7 +188,6 @@ int run() { //CloseHandle(win32Event_); //DeleteCriticalSection(&l_win32CritSect); - return 0; // return success } //............................................................................ @@ -251,7 +250,7 @@ void QActive::start(QPrioSpec const prioSpec, m_prio = static_cast(prioSpec & 0xFFU); // QF-priority m_pthre = 0U; // preemption-threshold (not used in this port) - register_(); // register this AO + register_(); // register this AO m_eQueue.init(qSto, qLen); diff --git a/ports/win32-qv/qp_port.hpp b/ports/win32-qv/qp_port.hpp index b35a45052..06066af53 100644 --- a/ports/win32-qv/qp_port.hpp +++ b/ports/win32-qv/qp_port.hpp @@ -27,8 +27,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-09-07 -//! @version Last updated for: @ref qpcpp_7_3_0 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpc_7_3_3 //! //! @file //! @brief QP/C++ port to Win32-QV (single-threaded), generic C++11 @@ -46,7 +46,7 @@ #define Q_NORETURN [[ noreturn ]] void -// QActive event queue type +// QActive event queue, os-type, and thread types #define QACTIVE_EQUEUE_TYPE QEQueue //QACTIVE_OS_OBJ_TYPE not used in this port //QACTIVE_THREAD_TYPE not used in this port @@ -71,11 +71,13 @@ void setTickRate(uint32_t ticksPerSec, int tickPrio); // clock tick callback (NOTE not called when "ticker thread" is not running) void onClockTick(); -// abstractions for console access... -void consoleSetup(); -void consoleCleanup(); -int consoleGetKey(); -int consoleWaitForKey(); +#ifdef QF_CONSOLE + // abstractions for console access... + void consoleSetup(); + void consoleCleanup(); + int consoleGetKey(); + int consoleWaitForKey(); +#endif } // namespace QF } // namespace QP diff --git a/ports/win32/qf_port.cpp b/ports/win32/qf_port.cpp index 2b008aeae..2247122f3 100644 --- a/ports/win32/qf_port.cpp +++ b/ports/win32/qf_port.cpp @@ -22,8 +22,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpcpp_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpcpp_7_3_3 //! //! @file //! @brief QF/C++ port to Win32 (multithreaded) @@ -186,7 +186,7 @@ void QActive::start(QPrioSpec const prioSpec, m_osObject = CreateEvent(NULL, FALSE, FALSE, NULL); m_eQueue.init(qSto, qLen); - // the top-most initial tran. (virtual) + // top-most initial tran. (virtual call) this->init(par, m_prio); QS_FLUSH(); // flush the QS trace buffer to the host @@ -220,6 +220,7 @@ void QActive::start(QPrioSpec const prioSpec, } SetThreadPriority(m_thread, win32Prio); } + //............................................................................ #ifdef QACTIVE_CAN_STOP void QActive::stop() { diff --git a/ports/win32/qp_port.hpp b/ports/win32/qp_port.hpp index e0a30b78b..86ad2e042 100644 --- a/ports/win32/qp_port.hpp +++ b/ports/win32/qp_port.hpp @@ -27,8 +27,8 @@ // // //============================================================================ -//! @date Last updated on: 2023-11-30 -//! @version Last updated for: @ref qpc_7_3_1 +//! @date Last updated on: 2024-02-16 +//! @version Last updated for: @ref qpc_7_3_3 //! //! @file //! @brief QP/C++ port to Win32 (multithreaded), generic C++11 @@ -68,14 +68,16 @@ void leaveCriticalSection_(); // set clock tick rate and priority void setTickRate(uint32_t ticksPerSec, int tickPrio); -// application-level clock tick callback +// clock tick callback void onClockTick(); -// abstractions for console access... -void consoleSetup(); -void consoleCleanup(); -int consoleGetKey(); -int consoleWaitForKey(); +#ifdef QF_CONSOLE + // abstractions for console access... + void consoleSetup(); + void consoleCleanup(); + int consoleGetKey(); + int consoleWaitForKey(); +#endif } // namespace QF } // namespace QP diff --git a/qpcpp.md5 b/qpcpp.md5 index f5e906737..e7564ffc7 100644 --- a/qpcpp.md5 +++ b/qpcpp.md5 @@ -1,11 +1,11 @@ -42702b5f4ecc01bc9ef161e77685e32f *qpcpp.qm +47986b70c115871c237783a4e4eb4576 *qpcpp.qm da3f0e1d1bc147b9e5ee801bc1fdd130 *include/qequeue.hpp fe1ff6084ff592ca8d14a6efffec296c *include/qk.hpp ebf2cb455c1471c2248bbde4b90ce634 *include/qmpool.hpp -d9a0985cdf91a545d527bdb8c6105492 *include/qp.hpp +377391a63f2d24d9ba9f1d8cff2f5366 *include/qp.hpp 61c7a3aa8cb265f478915f39b7fae9cc *include/qp_pkg.hpp 81e2fed348f03200d00b4d7c4473826f *include/qpcpp.hpp -0e73f9dfc08de921c2d9e865e340491e *include/qs.hpp +b97591429612996ff62d1f2c472b82fb *include/qs.hpp d59808009be96849963572ffcbf9dceb *include/qs_dummy.hpp db4013ceefb33498f5d38e15d0cb9323 *include/qs_pkg.hpp 2a36b08d4f3ec92da6ae6f7c18ad83ca *include/qsafe.h @@ -28,7 +28,7 @@ c49e1c15e6d6e035668d910c8d13a684 *src/qf/qf_time.cpp ecdd6f0f0a7dc56d8bb0c769e67b48fc *src/qs/qs.cpp a2ca20b2332d025067645839e4b25711 *src/qs/qs_64bit.cpp 8f6551c7786fdbb106c3d1bc7824c060 *src/qs/qs_fp.cpp -97afd49a944d19b10accd0521d88cf59 *src/qs/qs_rx.cpp +4e403740b59b9352c7bf3fea54c0e524 *src/qs/qs_rx.cpp 2655cd10d009075b71a84368fb6bf4d4 *src/qs/qstamp.cpp 180d454ecdbd08f522ff9a9c299de5df *src/qs/qutest.cpp deac78388761a8e1d4d0e5c51d5b338b *src/qv/qv.cpp @@ -110,34 +110,34 @@ f3c0b50eb1d3db891235d862dc398c18 *ports/uc-os2/qp_port.hpp 5f098b1f50529ede0aff7e065d1234ef *ports/uc-os2/qs_port.hpp ec8563c61bcb8cb4682b7bc4ffc67d0a *ports/qep-only/qp_port.hpp 7955fc33c291eb6b8ebabaae0d6bd0da *ports/qep-only/safe_std.h -32c55f2073063597225d7d71ac8508b0 *ports/posix/qf_port.cpp -32468980b268ad52766f8d5c65d3e538 *ports/posix/qp_port.hpp +a78cc40df8e511983e4f51b5233345d9 *ports/posix/qf_port.cpp +52e4d5e5d1113a3a0831aac6a44a3d21 *ports/posix/qp_port.hpp ae25ce9cf24260ec8affa08170f9d15a *ports/posix/qs_port.cpp dab4a85af98e1c67aa8de87b22e048c1 *ports/posix/qs_port.hpp f45c6f63edac95fd0b5d9cbeaa1f3926 *ports/posix/README.md 7955fc33c291eb6b8ebabaae0d6bd0da *ports/posix/safe_std.h -ff3898c11e80341e07ee5143a6b8b6dd *ports/posix-qv/qf_port.cpp -9f4192be26ae136d301c08e2e79d1b11 *ports/posix-qv/qp_port.hpp +3d1f2fa3662328387bbfa4cb974a7017 *ports/posix-qv/qf_port.cpp +221db06f9b4381533c738f1ca177f8cf *ports/posix-qv/qp_port.hpp ae25ce9cf24260ec8affa08170f9d15a *ports/posix-qv/qs_port.cpp dab4a85af98e1c67aa8de87b22e048c1 *ports/posix-qv/qs_port.hpp 72ee0355e2e9b6bd2a1e4c32480f361a *ports/posix-qv/README.md 7955fc33c291eb6b8ebabaae0d6bd0da *ports/posix-qv/safe_std.h bc92f9570cafbe645318e54af34933e9 *ports/posix-qutest/qp_port.hpp e898e8f446a8fcfd84b5092144b21ef3 *ports/posix-qutest/qs_port.hpp -7d96b643ff89c259f5ae8e321e7c3534 *ports/posix-qutest/qutest_port.cpp +2b993b3de35967e54388740f67d4be2c *ports/posix-qutest/qutest_port.cpp 0ac7e3d28e684d07baacdcd0d3e65c4a *ports/posix-qutest/README.md 7955fc33c291eb6b8ebabaae0d6bd0da *ports/posix-qutest/safe_std.h ccec9e69c078e6b6889b7cba2e6195dd *ports/win32/Makefile -d93d12bebd1f804395650ea5dfbe14d7 *ports/win32/qf_port.cpp -93185695ec9342bc1febc7c81d4fdd8b *ports/win32/qp_port.hpp +b98e9825ffcbd8178145207316bf7910 *ports/win32/qf_port.cpp +fc5a9085222501f994b6d517d6624a52 *ports/win32/qp_port.hpp b53aafe66b369a2e54344c792e481c1c *ports/win32/qs_port.cpp 7fb4d8aa04a203af95a365f6a56f89b3 *ports/win32/qs_port.hpp a1c6143aa627599750360c58f4740129 *ports/win32/qwin_gui.c 64172552524a5e6449168adedfd858b0 *ports/win32/qwin_gui.h 84d25d92b6521b22736719d3ed33c289 *ports/win32/README.md 7955fc33c291eb6b8ebabaae0d6bd0da *ports/win32/safe_std.h -e79933d81e497e91c959d436fbe55400 *ports/win32-qv/qf_port.cpp -3b75ff00e80b2e8ae2254ac9a82b6a64 *ports/win32-qv/qp_port.hpp +7145fb32942db86db0dd6e7f090705a7 *ports/win32-qv/qf_port.cpp +38fbe14322593c37bdfe39c121e058fb *ports/win32-qv/qp_port.hpp b53aafe66b369a2e54344c792e481c1c *ports/win32-qv/qs_port.cpp 7fb4d8aa04a203af95a365f6a56f89b3 *ports/win32-qv/qs_port.hpp a1c6143aa627599750360c58f4740129 *ports/win32-qv/qwin_gui.c @@ -146,7 +146,7 @@ a1c6143aa627599750360c58f4740129 *ports/win32-qv/qwin_gui.c 7955fc33c291eb6b8ebabaae0d6bd0da *ports/win32-qv/safe_std.h c7cac095c6af24752bb87d63aba5beaf *ports/win32-qutest/qp_port.hpp 7fb4d8aa04a203af95a365f6a56f89b3 *ports/win32-qutest/qs_port.hpp -f0486e29b189059a11b1172ef72bb064 *ports/win32-qutest/qutest_port.cpp +c6f58183235c7dd685200b38808de610 *ports/win32-qutest/qutest_port.cpp 7955fc33c291eb6b8ebabaae0d6bd0da *ports/win32-qutest/safe_std.h 1595522f609b1198a88aff4523334557 *zephyr/CMakeLists.txt 34e76b00e1368216110b5d52d4f11a25 *zephyr/Kconfig diff --git a/qpcpp.qm b/qpcpp.qm index c0b56a378..0a838d1a5 100644 --- a/qpcpp.qm +++ b/qpcpp.qm @@ -108,7 +108,7 @@ Contact information: return (e != nullptr) && ((e->evtTag_ & 0xF0U) == MARKER); - + const noexcept return static_cast<std::uint8_t>(evtTag_) & 0x0FU; @@ -7427,6 +7427,23 @@ while (rxPriv_.head != tail) { // QS-RX buffer NOT empty? rxParseData_(b); } } + + + + + + + + QS_CRIT_STAT +QS_CRIT_ENTRY(); +Q_REQUIRE_INCRIT(300, obj_kind < Q_DIM(rxPriv_.currObj)); + +QS_MEM_SYS(); + +rxPriv_.currObj[obj_kind] = obj_ptr; + +QS_MEM_APP(); +QS_CRIT_EXIT(); @@ -8353,8 +8370,8 @@ if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qsId_)) { \ #define QP_VERSION 733U #define QP_VERSION_STR "7.3.3" -//! Encrypted current QP release (7.3.3) and date (2024-01-31) -#define QP_RELEASE 0x70DEE7F2U +//! Encrypted current QP release (7.3.3) and date (2024-03-01) +#define QP_RELEASE 0x70C4F752U //============================================================================ //! @cond INTERNAL diff --git a/qpcpp.xml b/qpcpp.xml deleted file mode 100644 index 2e33cfc0f..000000000 --- a/qpcpp.xml +++ /dev/null @@ -1,12231 +0,0 @@ - - - QP/C++ Real-Time Embedded Framework (RTEF) -The model is used to generate the whole QP/C++ source code. - -Copyright (C) 2005 Quantum Leaps, LLC <state-machine.com>. - -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: <www.gnu.org/licenses/gpl-3.0> - -The terms of the closed source Quantum Leaps commercial licenses -can be found at: <www.state-machine.com/licensing> - -Redistributions in source code must retain this copyright notice. -Plagiarizing this software to sidestep the license obligations is illegal. - -Contact information: -<www.state-machine.com/licensing> -<info@state-machine.com> - - - - - - - = int; - - - - = int; - - - - = float; - - - - = double; - - - - - - - {QP_VERSION_STR}; - - - - = std::uint8_t; - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - - - - - - - - - {0xE0U}; - - - - : std::uint8_t { DYNAMIC }; - - - - = delete - - - - noexcept - - - : sig(s), - refCtr_(0U), - evtTag_(MARKER) - - - - noexcept - - - static_cast<void>(dummy); // unused parameter -// dynamic event already initialized in QP::QF::newX_() - - - - noexcept - - - return (e != nullptr) - && ((e->evtTag_ & 0xF0U) == MARKER); - - - - const noexcept - return static_cast<std::uint8_t>(evtTag_) & 0x0FU; - - - - - = std::uint_fast8_t; - - - - = QState (*)(void * const me, QEvt const * const e); - - - - = QState (*)(void * const me); - - - - // forward declaration - - - - = void (*)(QXThread * const me); - - - - { - QMState const * superstate; - QStateHandler const stateHandler; - QActionHandler const entryAction; - QActionHandler const exitAction; - QActionHandler const initAction; -}; - - - - { - QMState const * target; - QActionHandler const act[1]; -}; - - - - { - QStateHandler fun; - QActionHandler act; - QXThreadHandler thr; - QMState const *obj; - QMTranActTable const *tatbl; -#ifndef Q_UNSAFE - std::uintptr_t uint; -#endif - constexpr QAsmAttr() : fun(nullptr) {} -}; - - - - {4}; - - - - Abstract State Machine - - - - - - - //! All possible return values from state-handlers -//! @note -//! The order is important for algorithmic correctness. - : QState { - // unhandled and need to "bubble up" - Q_RET_SUPER, //!< event passed to superstate to handle - Q_RET_SUPER_SUB, //!< event passed to submachine superstate - Q_RET_UNHANDLED, //!< event unhandled due to a guard - - // handled and do not need to "bubble up" - Q_RET_HANDLED, //!< event handled (internal transition) - Q_RET_IGNORED, //!< event silently ignored (bubbled up to top) - - // entry/exit - Q_RET_ENTRY, //!< state entry action executed - Q_RET_EXIT, //!< state exit action executed - - // no side effects - Q_RET_NULL, //!< return value without any effect - - // transitions need to execute transition-action table in QP::QMsm - Q_RET_TRAN, //!< regular transition - Q_RET_TRAN_INIT, //!< initial transition in a state or submachine - Q_RET_TRAN_EP, //!< entry-point transition into a submachine - - // transitions that additionally clobber QHsm.m_state - Q_RET_TRAN_HIST, //!< transition to history of a given state - Q_RET_TRAN_XP //!< exit-point transition out of a submachine - }; - - - - //! Reserved signals by the QP-framework. - : QSignal { - Q_EMPTY_SIG, //!< signal to execute the default case - Q_ENTRY_SIG, //!< signal for entry actions - Q_EXIT_SIG, //!< signal for exit actions - Q_INIT_SIG //!< signal for nested initial transitions - }; - - - - noexcept - : m_state(), - m_temp () - - - - noexcept - // empty - - - - = 0 - - - - - - - - - - this->init(nullptr, qs_id); - - - - = 0 - - - - - - - - noexcept - - - static_cast<void>(state); -return false; - - - - const noexcept - return m_state.fun; - - - - const noexcept - return m_state.obj; - - - - noexcept - return m_state.fun; - - - - noexcept - - - - - static_cast<void>(me); -static_cast<void>(e); -return Q_RET_IGNORED; // the top state ignores all events - - - - noexcept - - - m_temp.fun = target; -return Q_RET_TRAN; - - - - noexcept - - - m_temp.fun = hist; -return Q_RET_TRAN_HIST; - - - - noexcept - - - m_temp.fun = superstate; -return Q_RET_SUPER; - - - - noexcept - - - m_temp.tatbl = static_cast<QP::QMTranActTable const *>(tatbl); -return Q_RET_TRAN; - - - - noexcept - - - m_temp.tatbl = static_cast<QP::QMTranActTable const *>(tatbl); -return Q_RET_TRAN_INIT; - - - - noexcept - - - - - m_state.obj = hist; -m_temp.tatbl = static_cast<QP::QMTranActTable const *>(tatbl); -return Q_RET_TRAN_HIST; - - - - noexcept - - - m_temp.tatbl = static_cast<QP::QMTranActTable const *>(tatbl); -return Q_RET_TRAN_EP; - - - - noexcept - - - - - m_state.act = xp; -m_temp.tatbl = static_cast<QP::QMTranActTable const *>(tatbl); -return Q_RET_TRAN_XP; - - - - noexcept - - - m_temp.obj = s; -return Q_RET_ENTRY; - - - - noexcept - - - static_cast<void>(s); // unused parameter -return Q_RET_ENTRY; - - - - noexcept - - - m_temp.obj = s; -return Q_RET_EXIT; - - - - noexcept - - - static_cast<void>(s); // unused parameter -return Q_RET_EXIT; - - - - noexcept - - - m_temp.obj = s; -return Q_RET_EXIT; - - - - noexcept - - - m_temp.obj = s; -return Q_RET_SUPER_SUB; - - - - - Human-generated State Machine - - - {6}; - - - - noexcept - - - : QAsm() - -m_state.fun = Q_STATE_CAST(&top); -m_temp.fun = initial; - - - - override - - - - - QF_CRIT_STAT - -#ifdef Q_SPY -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -if ((QS::priv_.flags & 0x01U) == 0U) { - QS::priv_.flags |= 0x01U; - QS_MEM_APP(); - QS_CRIT_EXIT(); - QS_FUN_DICTIONARY(&QP::QHsm::top); -} -else { - QS_MEM_APP(); - QS_CRIT_EXIT(); -} -#else -Q_UNUSED_PAR(qs_id); -#endif - -QStateHandler t = m_state.fun; - -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(200, (m_temp.fun != nullptr) - && (t == Q_STATE_CAST(&top))); -QF_CRIT_EXIT(); - -// execute the top-most initial tran. -QState r = (*m_temp.fun)(this, Q_EVT_CAST(QEvt)); - -QF_CRIT_ENTRY(); -// the top-most initial tran. must be taken -Q_ASSERT_INCRIT(210, r == Q_RET_TRAN); - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t); // the source state - QS_FUN_PRE_(m_temp.fun); // the target of the initial tran. -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -// drill down into the state hierarchy with initial transitions... -do { - QStateHandler path[MAX_NEST_DEPTH_]; // tran entry path array - std::int_fast8_t ip = 0; // entry path index - - path[0] = m_temp.fun; - static_cast<void>(QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG)); - while (m_temp.fun != t) { - ++ip; - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(220, ip < MAX_NEST_DEPTH_); - QF_CRIT_EXIT(); - path[ip] = m_temp.fun; - static_cast<void>(QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG)); - } - m_temp.fun = path[0]; - - // retrace the entry path in reverse (desired) order... - do { - // enter path[ip] - if (QHSM_RESERVED_EVT_(path[ip], Q_ENTRY_SIG) - == Q_RET_HANDLED) - { - QS_STATE_ENTRY_(path[ip], qs_id); - } - --ip; - } while (ip >= 0); - - t = path[0]; // current state becomes the new source - - r = QHSM_RESERVED_EVT_(t, Q_INIT_SIG); // execute initial tran. - -#ifdef Q_SPY - if (r == Q_RET_TRAN) { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t); // the source state - QS_FUN_PRE_(m_temp.fun); // the target of the initial tran. - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); - } -#endif // Q_SPY - -} while (r == Q_RET_TRAN); - -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_INIT_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t); // the new active state -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - -m_state.fun = t; // change the current active state -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QStateHandler s = m_state.fun; -QStateHandler t = s; -QF_CRIT_STAT - -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(300, (s != Q_STATE_CAST(0)) - && (m_state.uint == static_cast<std::uintptr_t>(~m_temp.uint))); -Q_REQUIRE_INCRIT(302, QEvt::verify_(e)); - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_DISPATCH, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s); // the current state -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -// process the event hierarchically... -QState r; -m_temp.fun = s; -do { - s = m_temp.fun; - r = (*s)(this, e); // invoke state handler s - - if (r == Q_RET_UNHANDLED) { // unhandled due to a guard? - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_UNHANDLED, qs_id) - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s); // the current state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); - - r = QHSM_RESERVED_EVT_(s, Q_EMPTY_SIG); // superstate of s - } -} while (r == Q_RET_SUPER); - -if (r >= Q_RET_TRAN) { // regular tran. taken? - QStateHandler path[MAX_NEST_DEPTH_]; - - path[0] = m_temp.fun; // tran. target - path[1] = t; // current state - path[2] = s; // tran. source - - // exit current state to tran. source s... - for (; t != s; t = m_temp.fun) { - // exit from t - if (QHSM_RESERVED_EVT_(t, Q_EXIT_SIG) == Q_RET_HANDLED) { - QS_STATE_EXIT_(t, qs_id); - // find superstate of t - static_cast<void>(QHSM_RESERVED_EVT_(t, Q_EMPTY_SIG)); - } - } - std::int_fast8_t ip = hsm_tran(path, qs_id); // take the tran. - -#ifdef Q_SPY - if (r == Q_RET_TRAN_HIST) { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_TRAN_HIST, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t); // the source of the transition - QS_FUN_PRE_(path[0]); // the target of the tran. to history - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); - } -#endif // Q_SPY - - // execute state entry actions in the desired order... - for (; ip >= 0; --ip) { - // enter path[ip] - if (QHSM_RESERVED_EVT_(path[ip], Q_ENTRY_SIG) - == Q_RET_HANDLED) - { - QS_STATE_ENTRY_(path[ip], qs_id); - } - } - t = path[0]; // stick the target into register - m_temp.fun = t; // update the next state - - // drill into the target hierarchy... - while (QHSM_RESERVED_EVT_(t, Q_INIT_SIG) == Q_RET_TRAN) { - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t); // the source (pseudo)state - QS_FUN_PRE_(m_temp.fun); // the target of the tran. - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); - - ip = 0; - path[0] = m_temp.fun; - - // find superstate - static_cast<void>(QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG)); - - while (m_temp.fun != t) { - ++ip; - path[ip] = m_temp.fun; - // find superstate - static_cast<void>( - QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG)); - } - m_temp.fun = path[0]; - - // entry path must not overflow - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(410, ip < MAX_NEST_DEPTH_); - QF_CRIT_EXIT(); - - // retrace the entry path in reverse (correct) order... - do { - // enter path[ip] - if (QHSM_RESERVED_EVT_(path[ip], Q_ENTRY_SIG) - == Q_RET_HANDLED) - { - QS_STATE_ENTRY_(path[ip], qs_id); - } - --ip; - } while (ip >= 0); - - t = path[0]; // current state becomes the new source - } - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s); // the source of the tran. - QS_FUN_PRE_(t); // the new active state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} - -#ifdef Q_SPY -else if (r == Q_RET_HANDLED) { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_INTERN_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s); // the source state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} -else { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_IGNORED, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.fun); // the current state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} -#endif // Q_SPY - -m_state.fun = t; // change the current active state -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - - - - noexcept override - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(602, m_state.uint - == static_cast<std::uintptr_t>(~m_temp.uint)); -QF_CRIT_EXIT(); - -bool inState = false; // assume that this HSM is not in 'state' - -// scan the state hierarchy bottom-up -QStateHandler s = m_state.fun; -std::int_fast8_t limit = MAX_NEST_DEPTH_ + 1; // loop hard limit -QState r = Q_RET_SUPER; -for (; (r != Q_RET_IGNORED) && (limit > 0); --limit) { - if (s == state) { // do the states match? - inState = true; // 'true' means that match found - break; // break out of the for-loop - } - else { - r = QHSM_RESERVED_EVT_(s, Q_EMPTY_SIG); - s = m_temp.fun; - } -} - -QF_CRIT_ENTRY(); -Q_ENSURE_INCRIT(690, limit > 0); -QF_CRIT_EXIT(); - -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - -return inState; // return the status - - - - noexcept - - - QStateHandler child = m_state.fun; // start with the current state -bool isFound = false; // start with the child not found - -// establish stable state configuration -m_temp.fun = child; -QState r; -do { - // is this the parent of the current child? - if (m_temp.fun == parent) { - isFound = true; // child is found - r = Q_RET_IGNORED; // break out of the loop - } - else { - child = m_temp.fun; - r = QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG); - } -} while (r != Q_RET_IGNORED); // QHsm::top() state not reached - -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_ASSERT_INCRIT(890, isFound); -QF_CRIT_EXIT(); - -return child; // return the child - - - - noexcept override - return m_state.fun; - - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -std::int_fast8_t ip = -1; // tran. entry path index -QStateHandler t = path[0]; -QStateHandler const s = path[2]; -QF_CRIT_STAT - -// (a) check source==target (tran. to self)... -if (s == t) { - // exit source s - if (QHSM_RESERVED_EVT_(s, Q_EXIT_SIG) == Q_RET_HANDLED) { - QS_STATE_EXIT_(s, qs_id); - } - ip = 0; // enter the target -} -else { - // find superstate of target - static_cast<void>(QHSM_RESERVED_EVT_(t, Q_EMPTY_SIG)); - - t = m_temp.fun; - - // (b) check source==target->super... - if (s == t) { - ip = 0; // enter the target - } - else { - // find superstate of src - static_cast<void>(QHSM_RESERVED_EVT_(s, Q_EMPTY_SIG)); - - // (c) check source->super==target->super... - if (m_temp.fun == t) { - // exit source s - if (QHSM_RESERVED_EVT_(s, Q_EXIT_SIG) == Q_RET_HANDLED) { - QS_STATE_EXIT_(s, qs_id); - } - ip = 0; // enter the target - } - else { - // (d) check source->super==target... - if (m_temp.fun == path[0]) { - // exit source s - if (QHSM_RESERVED_EVT_(s, Q_EXIT_SIG) == Q_RET_HANDLED) { - QS_STATE_EXIT_(s, qs_id); - } - } - else { - // (e) check rest of source==target->super->super.. - // and store the entry path along the way - std::int_fast8_t iq = 0; // indicate that LCA was found - ip = 1; // enter target and its superstate - path[1] = t; // save the superstate of target - t = m_temp.fun; // save source->super - - // find target->super->super... - QState r = QHSM_RESERVED_EVT_(path[1], Q_EMPTY_SIG); - while (r == Q_RET_SUPER) { - ++ip; - path[ip] = m_temp.fun; // store the entry path - if (m_temp.fun == s) { // is it the source? - iq = 1; // indicate that the LCA found - - // entry path must not overflow - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(510, ip < MAX_NEST_DEPTH_); - QF_CRIT_EXIT(); - --ip; // do not enter the source - r = Q_RET_HANDLED; // terminate the loop - } - else { // it is not the source, keep going up - r = QHSM_RESERVED_EVT_(m_temp.fun, Q_EMPTY_SIG); - } - } - - // the LCA not found yet? - if (iq == 0) { - // entry path must not overflow - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(520, ip < MAX_NEST_DEPTH_); - QF_CRIT_EXIT(); - - // exit source s - if (QHSM_RESERVED_EVT_(s, Q_EXIT_SIG) - == Q_RET_HANDLED) - { - QS_STATE_EXIT_(s, qs_id); - } - - // (f) check the rest of source->super - // == target->super->super... - iq = ip; - r = Q_RET_IGNORED; // indicate that the LCA NOT found - do { - if (t == path[iq]) { // is this the LCA? - r = Q_RET_HANDLED; // indicate the LCA found - ip = iq - 1; // do not enter the LCA - iq = -1; // cause termination of the loop - } - else { - --iq; // try lower superstate of target - } - } while (iq >= 0); - - // the LCA not found yet? - if (r != Q_RET_HANDLED) { - // (g) check each source->super->... - // for each target->super... - r = Q_RET_IGNORED; // keep looping - do { - // exit from t - if (QHSM_RESERVED_EVT_(t, Q_EXIT_SIG) - == Q_RET_HANDLED) - { - QS_STATE_EXIT_(t, qs_id); - // find superstate of t - static_cast<void>( - QHSM_RESERVED_EVT_(t, Q_EMPTY_SIG)); - } - t = m_temp.fun; // set to super of t - iq = ip; - do { - // is this the LCA? - if (t == path[iq]) { - ip = iq - 1; // do not enter the LCA - iq = -1; // break out of inner loop - r = Q_RET_HANDLED; // break outer loop - } - else { - --iq; - } - } while (iq >= 0); - } while (r != Q_RET_HANDLED); - } - } - } - } - } -} -return ip; - - - - - Machine-generated State Machine - - - noexcept - - - : QAsm() - -m_state.obj = &l_msm_top_s; // the current state (top) -m_temp.fun = initial; // the initial tran. handler - - - - override - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(200, (m_temp.fun != nullptr) - && (m_state.obj == &l_msm_top_s)); -QF_CRIT_EXIT(); - -// execute the top-most initial tran. -QState r = (*m_temp.fun)(this, Q_EVT_CAST(QEvt)); - -QF_CRIT_ENTRY(); -// the top-most initial tran. must be taken -Q_ASSERT_INCRIT(210, r == Q_RET_TRAN_INIT); - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.obj->stateHandler); // source state - QS_FUN_PRE_(m_temp.tatbl->target->stateHandler); // target state -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -// set state to the last tran. target -m_state.obj = m_temp.tatbl->target; - -// drill down into the state hierarchy with initial transitions... -do { - // execute the tran. table - r = execTatbl_(m_temp.tatbl, qs_id); -} while (r >= Q_RET_TRAN_INIT); - -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_INIT_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.obj->stateHandler); // the new current state -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QMState const *s = m_state.obj; // store the current state -QMState const *t = s; - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(300, (s != nullptr) - && (m_state.uint == static_cast<std::uintptr_t>(~m_temp.uint))); -Q_REQUIRE_INCRIT(302, QEvt::verify_(e)); - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_DISPATCH, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s->stateHandler); // the current state handler -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -// scan the state hierarchy up to the top state... -QState r; -do { - r = (*t->stateHandler)(this, e); // call state handler function - - // event handled? (the most frequent case) - if (r >= Q_RET_HANDLED) { - break; // done scanning the state hierarchy - } - // event unhandled and passed to the superstate? - else if (r == Q_RET_SUPER) { - t = t->superstate; // advance to the superstate - } - // event unhandled and passed to a submachine superstate? - else if (r == Q_RET_SUPER_SUB) { - t = m_temp.obj; // current host state of the submachie - } - else { // event unhandled due to a guard? - QF_CRIT_ENTRY(); - // event must be unhandled due to a guard evaluating to 'false' - Q_ASSERT_INCRIT(310, r == Q_RET_UNHANDLED); - - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_UNHANDLED, qs_id) - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t->stateHandler); // the current state - QS_END_PRE_() - QS_MEM_APP(); - - QF_CRIT_EXIT(); - - t = t->superstate; // advance to the superstate - } -} while (t != nullptr); - -if (r >= Q_RET_TRAN) { // any kind of tran. taken? -#ifdef Q_SPY - QMState const * const ts = t; // transition source for QS tracing - - QF_CRIT_ENTRY(); - // the tran. source state must not be nullptr - Q_ASSERT_INCRIT(320, ts != nullptr); - QF_CRIT_EXIT(); -#endif // Q_SPY - - do { - // save the tran-action table before it gets clobbered - QMTranActTable const * const tatbl = m_temp.tatbl; - QAsmAttr tmp; // temporary to save intermediate values - - // was TRAN, TRAN_INIT, or TRAN_EP taken? - if (r <= Q_RET_TRAN_EP) { - m_temp.obj = nullptr; // clear - exitToTranSource_(s, t, qs_id); - r = execTatbl_(tatbl, qs_id); - s = m_state.obj; - } - // was a tran. segment to history taken? - else if (r == Q_RET_TRAN_HIST) { - tmp.obj = m_state.obj; // save history - m_state.obj = s; // restore the original state - exitToTranSource_(s, t, qs_id); - static_cast<void>(execTatbl_(tatbl, qs_id)); - r = enterHistory_(tmp.obj, qs_id); - s = m_state.obj; - } - else { - QF_CRIT_ENTRY(); - // must be tran. to exit point - Q_ASSERT_INCRIT(340, r == Q_RET_TRAN_XP); - QF_CRIT_EXIT(); - - tmp.act = m_state.act; // save XP action - m_state.obj = s; // restore the original state - r = (*tmp.act)(this); // execute the XP action - if (r == Q_RET_TRAN) { // XP -> TRAN ? -#ifdef Q_SPY - tmp.tatbl = m_temp.tatbl; // save m_temp -#endif // Q_SPY - exitToTranSource_(s, t, qs_id); - // take the tran-to-XP segment inside submachine - static_cast<void>(execTatbl_(tatbl, qs_id)); - s = m_state.obj; -#ifdef Q_SPY - m_temp.tatbl = tmp.tatbl; // restore m_temp -#endif // Q_SPY - } - else if (r == Q_RET_TRAN_HIST) { // XP -> HIST ? - tmp.obj = m_state.obj; // save the history - m_state.obj = s; // restore the original state -#ifdef Q_SPY - s = m_temp.obj; // save m_temp -#endif // Q_SPY - exitToTranSource_(m_state.obj, t, qs_id); - // take the tran-to-XP segment inside submachine - static_cast<void>(execTatbl_(tatbl, qs_id)); -#ifdef Q_SPY - m_temp.obj = s; // restore m_temp -#endif // Q_SPY - s = m_state.obj; - m_state.obj = tmp.obj; // restore the history - } - else { - QF_CRIT_ENTRY(); - // TRAN_XP must NOT be followed by any other tran type - Q_ASSERT_INCRIT(330, r < Q_RET_TRAN); - QF_CRIT_EXIT(); - } - } - - t = s; // set target to the current state - - } while (r >= Q_RET_TRAN); - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(ts->stateHandler); // the tran. source - QS_FUN_PRE_(s->stateHandler); // the new active state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} - -#ifdef Q_SPY -// was the event handled? -else if (r == Q_RET_HANDLED) { - QF_CRIT_ENTRY(); - // internal tran. source can't be nullptr - Q_ASSERT_INCRIT(340, t != nullptr); - - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_INTERN_TRAN, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(t->stateHandler); // the source state - QS_END_PRE_() - QS_MEM_APP(); - - QF_CRIT_EXIT(); -} -// event bubbled to the 'top' state? -else if (t == nullptr) { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_IGNORED, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s->stateHandler); // the current state - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} -#endif // Q_SPY -else { - // empty -} - -#ifndef Q_UNSAFE -m_temp.uint = ~m_state.uint; -#endif - - - - noexcept override - return m_state.obj->stateHandler; - - - - noexcept override - - - bool inState = false; // assume that this MSM is not in 'state' - -QMState const *s = m_state.obj; -std::int_fast8_t limit = 6; // loop hard limit -for (; (s != nullptr) && (limit > 0); --limit) { - if (s->stateHandler == state) { // match found? - inState = true; - break; - } - else { - s = s->superstate; // advance to the superstate - } -} - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_ENSURE_INCRIT(690, limit > 0); -QF_CRIT_EXIT(); - -return inState; - - - - const noexcept - //! @deprecated instead use: QMsm::isIn() - - - bool inState = false; // assume that this MSM is not in 'state' - -QMState const *s = m_state.obj; -std::int_fast8_t limit = 6; // loop hard limit -for (; (s != nullptr) && (limit > 0); --limit) { - if (s == stateObj) { // match found? - inState = true; - break; - } - else { - s = s->superstate; // advance to the superstate - } -} - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_ENSURE_INCRIT(790, limit > 0); -QF_CRIT_EXIT(); - -return inState; - - - - const noexcept - - - QMState const *child = m_state.obj; -bool isFound = false; // start with the child not found -QMState const *s; - -for (s = m_state.obj; s != nullptr; s = s->superstate) { - if (s == parent) { - isFound = true; // child is found - break; - } - else { - child = s; - } -} -if (!isFound) { // still not found? - for (s = m_temp.obj; s != nullptr; s = s->superstate) { - if (s == parent) { - isFound = true; // child is found - break; - } - else { - child = s; - } - } -} - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_ASSERT_INCRIT(890, isFound); -QF_CRIT_EXIT(); - -return child; // return the child - - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -// precondition: -// - the tran-action table pointer must not be NULL -Q_REQUIRE_INCRIT(400, tatbl != nullptr); -QF_CRIT_EXIT(); - -QState r = Q_RET_NULL; -for (QActionHandler const *a = &tatbl->act[0]; *a != nullptr; ++a) { - r = (*(*a))(this); // call the action through the 'a' pointer -#ifdef Q_SPY - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - if (r == Q_RET_ENTRY) { - QS_BEGIN_PRE_(QS_QEP_STATE_ENTRY, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_temp.obj->stateHandler); // entered state - QS_END_PRE_() - } - else if (r == Q_RET_EXIT) { - QS_BEGIN_PRE_(QS_QEP_STATE_EXIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_temp.obj->stateHandler); // exited state - QS_END_PRE_() - } - else if (r == Q_RET_TRAN_INIT) { - QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(tatbl->target->stateHandler); // source - QS_FUN_PRE_(m_temp.tatbl->target->stateHandler); // target - QS_END_PRE_() - } - else if (r == Q_RET_TRAN_EP) { - QS_BEGIN_PRE_(QS_QEP_TRAN_EP, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(tatbl->target->stateHandler); // source - QS_FUN_PRE_(m_temp.tatbl->target->stateHandler); // target - QS_END_PRE_() - } - else if (r == Q_RET_TRAN_XP) { - QS_BEGIN_PRE_(QS_QEP_TRAN_XP, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(tatbl->target->stateHandler); // source - QS_FUN_PRE_(m_temp.tatbl->target->stateHandler); // target - QS_END_PRE_() - } - else { - // empty - } - QS_MEM_APP(); - QS_CRIT_EXIT(); -#endif // Q_SPY -} - -m_state.obj = (r >= Q_RET_TRAN) - ? m_temp.tatbl->target - : tatbl->target; -return r; - - - - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT - -// exit states from the current state to the tran. source state -QMState const *s = cs; -while (s != ts) { - // exit action provided in state 's'? - if (s->exitAction != nullptr) { - // execute the exit action - static_cast<void>((*s->exitAction)(this)); - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_STATE_EXIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(s->stateHandler); // the exited state handler - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); - } - - s = s->superstate; // advance to the superstate - - if (s == nullptr) { // reached the top of a submachine? - s = m_temp.obj; // the superstate from QM_SM_EXIT() - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(510, s != nullptr); - QF_CRIT_EXIT(); - } -} - - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QMState const *s = hist; -QMState const *ts = m_state.obj; // tran. source -QMState const *epath[MAX_ENTRY_DEPTH_]; - -QF_CRIT_STAT - -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_TRAN_HIST, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(ts->stateHandler); // source state handler - QS_FUN_PRE_(hist->stateHandler); // target state handler -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - -std::int_fast8_t i = 0; // tran. entry path index -while (s != ts) { - if (s->entryAction != nullptr) { - QF_CRIT_ENTRY(); - Q_ASSERT_INCRIT(620, i < MAX_ENTRY_DEPTH_); - QF_CRIT_EXIT(); - epath[i] = s; - ++i; - } - s = s->superstate; - if (s == nullptr) { - ts = s; // force exit from the for-loop - } -} - -// retrace the entry path in reverse (desired) order... -while (i > 0) { - --i; - (*epath[i]->entryAction)(this); // run entry action in epath[i] - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QEP_STATE_ENTRY, qs_id) - QS_OBJ_PRE_(this); - QS_FUN_PRE_(epath[i]->stateHandler); // entered state handler - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} - -m_state.obj = hist; // set current state to the tran. target - -// initial tran. present? -QState r; -if (hist->initAction != nullptr) { - r = (*hist->initAction)(this); // execute the tran. action -} -else { - r = Q_RET_NULL; -} - -return r; - - - - const noexcept - return &l_msm_top_s; - - - - - - - - - - \ - QP::QState state_ ## _h(QP::QEvt const * const e); \ - static QP::QState state_(void * const me, QP::QEvt const * const e) - - - - - - - - \ - QP::QState subclass_::state_(void * const me, QP::QEvt const * const e) { \ - return static_cast<subclass_ *>(me)->state_ ## _h(e); } \ - QP::QState subclass_::state_ ## _h(QP::QEvt const * const e) - - - - (Q_RET_HANDLED) - - - - (Q_RET_UNHANDLED) - - - - - - (static_cast<subclass_ const *>(e)) - - - - - - \ - (reinterpret_cast<QP::QStateHandler>(handler_)) - - - - - - \ - QP::QState state_ ## _h(QP::QEvt const * const e); \ - static QP::QState state_(void * const me, QP::QEvt const * const e); \ - static QP::QMState const state_ ## _s - - - - - - - - \ - QP::QState state_ ## _h(QP::QEvt const * const e);\ - static QP::QState state_(void * const me, QP::QEvt const * const e); \ - static SM_ ## subm_ const state_ ## _s - - - - - - \ - QP::QState action_ ## _h(); \ - static QP::QState action_(void * const me) - - - - - - - - \ - QP::QState subclass_::state_(void * const me, QP::QEvt const * const e) {\ - return static_cast<subclass_ *>(me)->state_ ## _h(e); } \ - QP::QState subclass_::state_ ## _h(QP::QEvt const * const e) - - - - - - - - \ - QP::QState subclass_::action_(void * const me) { \ - return static_cast<subclass_ *>(me)->action_ ## _h(); } \ - QP::QState subclass_::action_ ## _h() - - - - (Q_RET_HANDLED) - - - - (Q_RET_HANDLED) - - - - (Q_RET_SUPER) - - - - (nullptr) - - - - (nullptr) - - - - - - (static_cast<void>(par_)) - - - - - - (sizeof(array_) / sizeof((array_)[0U])) - - - - - - - - (reinterpret_cast<type_ *>(uint_)) - - - - - - init((qs_id_)) - - - - - - init(0U) - - - - - - - - dispatch((e_), (qs_id_)) - - - - - - - - dispatch((e_), 0U) - - - - - - - - - = std::uint16_t; - - - - = std::uint8_t; - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - = std::uint8_t; - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - noexcept - - - static std::uint8_t const log2LUT[16] = { - 0U, 1U, 2U, 2U, 3U, 3U, 3U, 3U, - 4U, 4U, 4U, 4U, 4U, 4U, 4U, 4U -}; -std::uint_fast8_t n = 0U; -QP::QPSetBits t; - -#if (QF_MAX_ACTIVE > 16U) -t = static_cast<QP::QPSetBits>(x >> 16U); -if (t != 0U) { - n += 16U; - x = t; -} -#endif -#if (QF_MAX_ACTIVE > 8U) -t = (x >> 8U); -if (t != 0U) { - n += 8U; - x = t; -} -#endif -t = (x >> 4U); -if (t != 0U) { - n += 4U; - x = t; -} -return n + log2LUT[x]; - - - - - - - - noexcept - m_bits[0] = 0U; -#if (QF_MAX_ACTIVE > 32) -m_bits[1] = 0U; -#endif - - - - const noexcept - #if (QF_MAX_ACTIVE <= 32U) -return (m_bits[0] == 0U); -#else -return (m_bits[0] == 0U) ? (m_bits[1] == 0U) : false; -#endif - - - - const noexcept - #if (QF_MAX_ACTIVE <= 32U) -return (m_bits[0] != 0U); -#else -return (m_bits[0] != 0U) ? true : (m_bits[1] != 0U); -#endif - - - - const noexcept - - - #if (QF_MAX_ACTIVE <= 32U) -return (m_bits[0] & (static_cast<QPSetBits>(1U) << (n - 1U))) != 0U; -#else -return (n <= 32U) - ? ((m_bits[0] & (static_cast<QPSetBits>(1U) << (n - 1U))) != 0U) - : ((m_bits[1] & (static_cast<QPSetBits>(1U) << (n - 33U))) != 0U); -#endif - - - - noexcept - - - #if (QF_MAX_ACTIVE <= 32U) -m_bits[0] = (m_bits[0] | (static_cast<QPSetBits>(1U) << (n - 1U))); -#else -if (n <= 32U) { - m_bits[0] = (m_bits[0] | (static_cast<QPSetBits>(1U) << (n - 1U))); -} -else { - m_bits[1] = (m_bits[1] | (static_cast<QPSetBits>(1U) << (n - 33U))); -} -#endif - - - - noexcept - - - #if (QF_MAX_ACTIVE <= 32U) -m_bits[0] = (m_bits[0] & static_cast<QPSetBits>(~(1U << (n - 1U)))); -#else -if (n <= 32U) { - (m_bits[0] = (m_bits[0] & ~(static_cast<QPSetBits>(1U) << (n - 1U)))); -} -else { - (m_bits[1] = (m_bits[1] & ~(static_cast<QPSetBits>(1U) << (n - 33U)))); -} -#endif - - - - const noexcept - #if (QF_MAX_ACTIVE <= 32U) -return QF_LOG2(m_bits[0]); -#else -return (m_bits[1] != 0U) - ? (QF_LOG2(m_bits[1]) + 32U) - : (QF_LOG2(m_bits[0])); -#endif - - - - const noexcept - - - dis->m_bits[0] = ~m_bits[0]; -#if (QF_MAX_ACTIVE > 32U) -dis->m_bits[1] = ~m_bits[1]; -#endif - - - - const noexcept - - - #if (QF_MAX_ACTIVE <= 32U) -return m_bits[0] == static_cast<QPSetBits>(~dis->m_bits[0]); -#else -return (m_bits[0] == static_cast<QPSetBits>(~dis->m_bits[0])) - && (m_bits[1] == static_cast<QPSetBits>(~dis->m_bits[1])); -#endif - - - - - - - - - - - // friends... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // friends... - - - - - - - - - - - - - - - - - - - - noexcept - - - : QAsm(), - m_prio(0U), - m_pthre(0U) - -m_state.fun = Q_STATE_CAST(&top); -m_temp.fun = initial; - -#ifndef Q_UNSAFE -m_prio_dis = static_cast<std::uint8_t>(~m_prio); -m_pthre_dis = static_cast<std::uint8_t>(~m_pthre); -#endif - - - - override - - - - - reinterpret_cast<QHsm *>(this)->QHsm::init(e, qs_id); - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - reinterpret_cast<QHsm *>(this)->QHsm::dispatch(e, qs_id); - - - - noexcept override - - - return reinterpret_cast<QHsm *>(this)->QHsm::isIn(state); - - - - noexcept - - - return reinterpret_cast<QHsm *>(this)->QHsm::childState(parent); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - this->start(prioSpec, qSto, qLen, stkSto, stkSize, nullptr); - - - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -if (m_pthre == 0U) { // preemption-threshold not defined? - m_pthre = m_prio; // apply the default -} - -#ifndef Q_UNSAFE - -Q_REQUIRE_INCRIT(100, (0U < m_prio) && (m_prio <= QF_MAX_ACTIVE) - && (registry_[m_prio] == nullptr) - && (m_prio <= m_pthre)); - -std::uint8_t prev_thre = m_pthre; -std::uint8_t next_thre = m_pthre; - -std::uint_fast8_t p; -for (p = static_cast<std::uint_fast8_t>(m_prio) - 1U; p > 0U; --p) { - if (registry_[p] != nullptr) { - prev_thre = registry_[p]->m_pthre; - break; - } -} -for (p = static_cast<std::uint_fast8_t>(m_prio) + 1U; - p <= QF_MAX_ACTIVE; ++p) -{ - if (registry_[p] != nullptr) { - next_thre = registry_[p]->m_pthre; - break; - } -} - -Q_ASSERT_INCRIT(190, (prev_thre <= m_pthre) - && (m_pthre <= next_thre)); - -m_prio_dis = static_cast<std::uint8_t>(~m_prio); -m_pthre_dis = static_cast<std::uint8_t>(~m_pthre); - -#endif // Q_UNSAFE - -// register the AO at the QF-prio. -registry_[m_prio] = this; - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - std::uint_fast8_t const p = static_cast<std::uint_fast8_t>(m_prio); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(200, (0U < p) && (p <= QF_MAX_ACTIVE) - && (registry_[p] == this)); -registry_[p] = nullptr; // free-up the priority level -m_state.fun = nullptr; // invalidate the state - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(sender); -#endif - -#ifdef Q_UTEST // test? -#if Q_UTEST != 0 // testing QP-stub? -if (m_temp.fun == Q_STATE_CAST(0)) { // QActiveDummy? - return static_cast<QActiveDummy *>(this)->fakePost(e, margin, sender); -} -#endif -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -#ifndef Q_UNSAFE -std::uint8_t const pcopy = static_cast<std::uint8_t>(~m_prio_dis); -Q_REQUIRE_INCRIT(102, (QEvt::verify_(e)) && (m_prio == pcopy)); -#endif - -QEQueueCtr nFree = m_eQueue.m_nFree; // get volatile into temporary - -// test-probe#1 for faking queue overflow -QS_TEST_PROBE_DEF(&QActive::post_) -QS_TEST_PROBE_ID(1, - nFree = 0U; -) - -bool status; -if (margin == QF::NO_MARGIN) { - if (nFree > 0U) { - status = true; // can post - } - else { - status = false; // cannot post - Q_ERROR_INCRIT(190); // must be able to post the event - } -} -else if (nFree > static_cast<QEQueueCtr>(margin)) { - status = true; // can post -} -else { - status = false; // cannot post, but don't assert -} - -// is it a mutable event? -if (e->getPoolId_() != 0U) { - QEvt_refCtr_inc_(e); // increment the reference counter -} - -if (status) { // can post the event? - - --nFree; // one free entry just used up - m_eQueue.m_nFree = nFree; // update the original - if (m_eQueue.m_nMin > nFree) { - m_eQueue.m_nMin = nFree; // update minimum so far - } - - QS_BEGIN_PRE_(QS_QF_ACTIVE_POST, m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(sender); // the sender object - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(m_eQueue.m_nMin); // min # free entries - QS_END_PRE_() - -#ifdef Q_UTEST - // callback to examine the posted event under the same conditions - // as producing the #QS_QF_ACTIVE_POST trace record, which are: - // the local filter for this AO ('m_prio') is set - if (QS_LOC_CHECK_(m_prio)) { - QS::onTestPost(sender, this, e, status); - } -#endif - - if (m_eQueue.m_frontEvt == nullptr) { // empty queue? - m_eQueue.m_frontEvt = e; // deliver event directly -#ifdef QXK_HPP_ - if (m_state.act == Q_ACTION_CAST(0)) { // eXtended thread? - QXTHREAD_EQUEUE_SIGNAL_(this); // signal the event queue - } - else { - QACTIVE_EQUEUE_SIGNAL_(this); // signal the event queue - } -#else - QACTIVE_EQUEUE_SIGNAL_(this); // signal the event queue -#endif - } - // queue is not empty, insert event into the ring-buffer - else { - // insert event into the ring buffer (FIFO) - m_eQueue.m_ring[m_eQueue.m_head] = e; - - if (m_eQueue.m_head == 0U) { // need to wrap head? - m_eQueue.m_head = m_eQueue.m_end; // wrap around - } - // advance the head (counter clockwise) - m_eQueue.m_head = (m_eQueue.m_head - 1U); - } - - QF_MEM_APP(); - QF_CRIT_EXIT(); -} -else { // cannot post the event - - QS_BEGIN_PRE_(QS_QF_ACTIVE_POST_ATTEMPT, m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(sender); // the sender object - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(margin); // margin requested - QS_END_PRE_() - -#ifdef Q_UTEST - // callback to examine the posted event under the same conditions - // as producing the #QS_QF_ACTIVE_POST trace record, which are: - // the local filter for this AO ('m_prio') is set - if (QS_LOC_CHECK_(m_prio)) { - QS::onTestPost(sender, this, e, status); - } -#endif - - QF_MEM_APP(); - QF_CRIT_EXIT(); - -#if (QF_MAX_EPOOL > 0U) - QF::gc(e); // recycle the event to avoid a leak -#endif -} - -return status; - - - - noexcept - - - #ifdef Q_UTEST // test? -#if Q_UTEST != 0 // testing QP-stub? -if (m_temp.fun == Q_STATE_CAST(0)) { // QActiveDummy? - static_cast<QActiveDummy *>(this)->QActiveDummy::fakePostLIFO(e); - return; -} -#endif -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -#ifndef Q_UNSAFE -std::uint8_t const pcopy = static_cast<std::uint8_t>(~m_prio_dis); -Q_REQUIRE_INCRIT(202, (QEvt::verify_(e)) && (m_prio == pcopy)); -#endif - -#ifdef QXK_HPP_ -Q_REQUIRE_INCRIT(200, m_state.act != Q_ACTION_CAST(0)); -#endif - -QEQueueCtr nFree = m_eQueue.m_nFree; // get volatile into temporary - -// test-probe#1 for faking queue overflow -QS_TEST_PROBE_DEF(&QActive::postLIFO) -QS_TEST_PROBE_ID(1, - nFree = 0U; -) - -Q_REQUIRE_INCRIT(201, nFree != 0U); - -if (e->getPoolId_() != 0U) { // is it a mutable event? - QEvt_refCtr_inc_(e); // increment the reference counter -} - ---nFree; // one free entry just used up -m_eQueue.m_nFree = nFree; // update the original -if (m_eQueue.m_nMin > nFree) { - m_eQueue.m_nMin = nFree; // update minimum so far -} - -QS_BEGIN_PRE_(QS_QF_ACTIVE_POST_LIFO, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(m_eQueue.m_nMin); // min # free entries -QS_END_PRE_() - -#ifdef Q_UTEST -// callback to examine the posted event under the same conditions -// as producing the #QS_QF_ACTIVE_POST trace record, which are: -// the local filter for this AO ('m_prio') is set -if (QS_LOC_CHECK_(m_prio)) { - QS::onTestPost(nullptr, this, e, true); -} -#endif - -QEvt const * const frontEvt = m_eQueue.m_frontEvt; -m_eQueue.m_frontEvt = e; // deliver the event directly to the front - -if (frontEvt == nullptr) { // was the queue empty? - QACTIVE_EQUEUE_SIGNAL_(this); // signal the event queue -} -else { // queue was not empty, leave the event in the ring-buffer - m_eQueue.m_tail = (m_eQueue.m_tail + 1U); - if (m_eQueue.m_tail == m_eQueue.m_end) { // need to wrap the tail? - m_eQueue.m_tail = 0U; // wrap around - } - - m_eQueue.m_ring[m_eQueue.m_tail] = frontEvt; -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QACTIVE_EQUEUE_WAIT_(this); // wait for event to arrive directly - -// always remove evt from the front -QEvt const * const e = m_eQueue.m_frontEvt; -QEQueueCtr const nFree = m_eQueue.m_nFree + 1U; // get volatile into tmp -m_eQueue.m_nFree = nFree; // update the # free - -if (nFree <= m_eQueue.m_end) { // any events in the ring buffer? - // remove event from the tail - m_eQueue.m_frontEvt = m_eQueue.m_ring[m_eQueue.m_tail]; - if (m_eQueue.m_tail == 0U) { // need to wrap the tail? - m_eQueue.m_tail = m_eQueue.m_end; // wrap around - } - m_eQueue.m_tail = (m_eQueue.m_tail - 1U); - - QS_BEGIN_PRE_(QS_QF_ACTIVE_GET, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_END_PRE_() -} -else { - m_eQueue.m_frontEvt = nullptr; // the queue becomes empty - - // all entries in the queue must be free (+1 for fronEvt) - Q_ASSERT_INCRIT(310, nFree == (m_eQueue.m_end + 1U)); - - QS_BEGIN_PRE_(QS_QF_ACTIVE_GET_LAST, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_END_PRE_() -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return e; - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(400, (prio <= QF_MAX_ACTIVE) - && (QActive::registry_[prio] != nullptr)); -std::uint_fast16_t const min = static_cast<std::uint_fast16_t>( - QActive::registry_[prio]->m_eQueue.getNMin()); -QF_CRIT_EXIT(); - -return min; - - - - noexcept - - - - - subscrList_ = subscrSto; -maxPubSignal_ = maxSignal; - -// initialize the subscriber list -for (enum_t sig = 0; sig < maxSignal; ++sig) { - subscrSto[sig].m_set.setEmpty(); -#ifndef Q_UNSAFE - subscrSto[sig].m_set.update_(&subscrSto[sig].m_set_dis); -#endif -} - - - - noexcept - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(sender); -Q_UNUSED_PAR(qs_id); -#endif - -QSignal const sig = e->sig; - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(200, sig < static_cast<QSignal>(maxPubSignal_)); -Q_REQUIRE_INCRIT(202, - subscrList_[sig].m_set.verify_(&subscrList_[sig].m_set_dis)); - -QS_BEGIN_PRE_(QS_QF_PUBLISH, qs_id) - QS_TIME_PRE_(); // the timestamp - QS_OBJ_PRE_(sender); // the sender object - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr -QS_END_PRE_() - -// is it a mutable event? -if (e->getPoolId_() != 0U) { - // NOTE: The reference counter of a mutable event is incremented to - // prevent premature recycling of the event while the multicasting - // is still in progress. At the end of the function, the garbage - // collector step (QF::gc()) decrements the reference counter and - // recycles the event if the counter drops to zero. This covers the - // case when the event was published without any subscribers. - QEvt_refCtr_inc_(e); -} - -// make a local, modifiable copy of the subscriber set -QPSet subscrSet = subscrList_[sig].m_set; - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -if (subscrSet.notEmpty()) { // any subscribers? - // highest-prio subscriber - std::uint_fast8_t p = subscrSet.findMax(); - - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - QActive *a = registry_[p]; - // the AO must be registered with the framework - Q_ASSERT_INCRIT(210, a != nullptr); - - QF_MEM_APP(); - QF_CRIT_EXIT(); - - QF_SCHED_STAT_ - QF_SCHED_LOCK_(p); // lock the scheduler up to AO's prio - std::uint_fast8_t limit = QF_MAX_ACTIVE + 1U; - do { // loop over all subscribers - --limit; - - // POST() asserts internally if the queue overflows - a->POST(e, sender); - - subscrSet.remove(p); // remove the handled subscriber - if (subscrSet.notEmpty()) { // still more subscribers? - p = subscrSet.findMax(); // highest-prio subscriber - - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - a = registry_[p]; - // the AO must be registered with the framework - Q_ASSERT_INCRIT(220, a != nullptr); - - QF_MEM_APP(); - QF_CRIT_EXIT(); - } - else { - p = 0U; // no more subscribers - } - } while ((p != 0U) && (limit > 0U)); - - QF_CRIT_ENTRY(); - Q_ENSURE_INCRIT(290, p == 0U); - QF_CRIT_EXIT(); - - QF_SCHED_UNLOCK_(); // unlock the scheduler -} - -// The following garbage collection step decrements the reference counter -// and recycles the event if the counter drops to zero. This covers both -// cases when the event was published with or without any subscribers. -#if (QF_MAX_EPOOL > 0U) -QF::gc(e); -#endif - - - - const noexcept - - - std::uint_fast8_t const p = static_cast<std::uint_fast8_t>(m_prio); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(300, (Q_USER_SIG <= sig) - && (sig < maxPubSignal_) - && (0U < p) && (p <= QF_MAX_ACTIVE) - && (registry_[p] == this)); -Q_REQUIRE_INCRIT(302, - subscrList_[sig].m_set.verify_(&subscrList_[sig].m_set_dis)); - -QS_BEGIN_PRE_(QS_QF_ACTIVE_SUBSCRIBE, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object -QS_END_PRE_() - -// insert the prio. into the subscriber set -subscrList_[sig].m_set.insert(p); -#ifndef Q_UNSAFE -subscrList_[sig].m_set.update_(&subscrList_[sig].m_set_dis); -#endif - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - const noexcept - - - std::uint_fast8_t const p = static_cast<std::uint_fast8_t>(m_prio); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(400, (Q_USER_SIG <= sig) - && (sig < maxPubSignal_) - && (0U < p) && (p <= QF_MAX_ACTIVE) - && (registry_[p] == this)); -Q_REQUIRE_INCRIT(402, - subscrList_[sig].m_set.verify_(&subscrList_[sig].m_set_dis)); - -QS_BEGIN_PRE_(QS_QF_ACTIVE_UNSUBSCRIBE, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object -QS_END_PRE_() - -// remove the prio. from the subscriber set -subscrList_[sig].m_set.remove(p); -#ifndef Q_UNSAFE -subscrList_[sig].m_set.update_(&subscrList_[sig].m_set_dis); -#endif - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - const noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -std::uint_fast8_t const p = static_cast<std::uint_fast8_t>(m_prio); - -Q_REQUIRE_INCRIT(500, (0U < p) && (p <= QF_MAX_ACTIVE) - && (registry_[p] == this)); -enum_t const maxPubSig = maxPubSignal_; - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -for (enum_t sig = Q_USER_SIG; sig < maxPubSig; ++sig) { - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - if (subscrList_[sig].m_set.hasElement(p)) { - subscrList_[sig].m_set.remove(p); -#ifndef Q_UNSAFE - subscrList_[sig].m_set.update_(&subscrList_[sig].m_set_dis); -#endif - QS_BEGIN_PRE_(QS_QF_ACTIVE_UNSUBSCRIBE, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object - QS_END_PRE_() - } - QF_MEM_APP(); - QF_CRIT_EXIT(); - - QF_CRIT_EXIT_NOP(); // prevent merging critical sections -} - - - - const noexcept - - - - - bool const status = eq->post(e, 0U, m_prio); - -QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QF_ACTIVE_DEFER, m_prio) - QS_TIME_PRE_(); // time stamp - QS_OBJ_PRE_(this); // this active object - QS_OBJ_PRE_(eq); // the deferred queue - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - -return status; - - - - noexcept - - - QEvt const * const e = eq->get(m_prio); // get evt from deferred queue -QF_CRIT_STAT - -bool recalled; -if (e != nullptr) { // event available? - postLIFO(e); // post it to the _front_ of the AO's queue - - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - if (e->getPoolId_() != 0U) { // is it a mutable event? - - // after posting to the AO's queue the event must be referenced - // at least twice: once in the deferred event queue (eq->get() - // did NOT decrement the reference counter) and once in the - // AO's event queue. - Q_ASSERT_INCRIT(210, e->refCtr_ >= 2U); - - // we need to decrement the reference counter once, to account - // for removing the event from the deferred event queue. - QEvt_refCtr_dec_(e); // decrement the reference counter - } - - QS_BEGIN_PRE_(QS_QF_ACTIVE_RECALL, m_prio) - QS_TIME_PRE_(); // time stamp - QS_OBJ_PRE_(this); // this active object - QS_OBJ_PRE_(eq); // the deferred queue - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_END_PRE_() - - QF_MEM_APP(); - QF_CRIT_EXIT(); - - recalled = true; -} -else { - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - QS_BEGIN_PRE_(QS_QF_ACTIVE_RECALL_ATTEMPT, m_prio) - QS_TIME_PRE_(); // time stamp - QS_OBJ_PRE_(this); // this active object - QS_OBJ_PRE_(eq); // the deferred queue - QS_END_PRE_() - - QS_MEM_APP(); - QS_CRIT_EXIT(); - - recalled = false; -} -return recalled; - - - - const noexcept - - - - - std::uint_fast16_t n = 0U; -while (n < num) { - QEvt const * const e = eq->get(m_prio); - if (e != nullptr) { - ++n; // count one more flushed event -#if (QF_MAX_EPOOL > 0U) - QF::gc(e); // garbage collect -#endif - } - else { - break; - } -} - -return n; - - - - const noexcept - return static_cast<std::uint_fast8_t>(m_prio); - - - - noexcept - - - m_prio = static_cast<std::uint8_t>(prio & 0xFFU); -m_pthre = static_cast<std::uint8_t>(prio >> 8U); - - - - const noexcept - return static_cast<std::uint_fast8_t>(m_pthre); - - - - const noexcept - return m_eQueue; - - - - const noexcept - return m_osObject; - - - - const noexcept - return m_thread; - - - - - - m_thread = thr; - - - - - - - - - noexcept - - - - - - - - - - - - noexcept - - - - - - - - - - - - - noexcept - - - : QActive(initial) - -m_state.obj = reinterpret_cast<QMsm *>(this)->topQMState(); -m_temp.fun = initial; - - - - override - - - - - reinterpret_cast<QMsm *>(this)->QMsm::init(e, qs_id); - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - reinterpret_cast<QMsm *>(this)->QMsm::dispatch(e, qs_id); - - - - noexcept override - - - return reinterpret_cast<QMsm *>(this)->QMsm::isIn(state); - - - - noexcept override - return reinterpret_cast<QMsm *>(this)->QMsm::getStateHandler(); - - - - const noexcept - - - return reinterpret_cast<QMsm const *>(this)->QMsm::isInState(st); - - - - const noexcept - - - return reinterpret_cast<QMsm const *>(this) - ->QMsm::childStateObj(parent); - - - - - - - - - - - - - - - - - - - noexcept - - - - - - - : - QEvt(sig), - m_next(nullptr), - m_act(act), - m_ctr(0U), - m_interval(0U) - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(300, (sig != 0U) - && (tickRate < QF_MAX_TICK_RATE)); -QF_CRIT_EXIT(); - -// The refCtr_ attribute is not used in time events, so it is -// reused to hold the tickRate as well as other information -refCtr_ = static_cast<std::uint8_t>(tickRate); - - - - - - noexcept - - - - - std::uint8_t const tickRate = refCtr_ & TE_TICK_RATE; -QTimeEvtCtr const ctr = m_ctr; -#ifdef Q_SPY -std::uint_fast8_t const qs_id = - static_cast<QActive const *>(m_act)->m_prio; -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(400, (m_act != nullptr) - && (ctr == 0U) - && (nTicks != 0U) - && (tickRate < static_cast<std::uint8_t>(QF_MAX_TICK_RATE)) - && (sig >= static_cast<QSignal>(Q_USER_SIG))); -#ifdef Q_UNSAFE -Q_UNUSED_PAR(ctr); -#endif - -m_ctr = nTicks; -m_interval = interval; - -// is the time event unlinked? -// NOTE: For the duration of a single clock tick of the specified tick -// rate a time event can be disarmed and yet still linked into the list -// because un-linking is performed exclusively in the QF_tickX() function. -if (static_cast<std::uint_fast8_t>( - static_cast<std::uint_fast8_t>(refCtr_) & TE_IS_LINKED) == 0U) -{ - // mark as linked - refCtr_ = static_cast<std::uint8_t>(refCtr_ | TE_IS_LINKED); - - // The time event is initially inserted into the separate - // "freshly armed" list based on timeEvtHead_[tickRate].act. - // Only later, inside QTimeEvt::tick(), the "freshly armed" - // list is appended to the main list of armed time events based on - // timeEvtHead_[tickRate].next. Again, this is to keep any - // changes to the main list exclusively inside QTimeEvt::tick(). - m_next = timeEvtHead_[tickRate].toTimeEvt(); - timeEvtHead_[tickRate].m_act = this; -} - -QS_BEGIN_PRE_(QS_QF_TIMEEVT_ARM, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this time event object - QS_OBJ_PRE_(m_act); // the active object - QS_TEC_PRE_(nTicks); // the # ticks - QS_TEC_PRE_(interval); // the interval - QS_U8_PRE_(tickRate); // tick rate -QS_END_PRE_() - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - #ifdef Q_SPY -std::uint_fast8_t const qs_id = static_cast<QActive *>(m_act)->m_prio; -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// is the time event actually armed? -bool wasArmed; -if (m_ctr != 0U) { - wasArmed = true; - refCtr_ = static_cast<std::uint8_t>(refCtr_ | TE_WAS_DISARMED); - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_DISARM, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this time event object - QS_OBJ_PRE_(m_act); // the target AO - QS_TEC_PRE_(m_ctr); // the # ticks - QS_TEC_PRE_(m_interval); // the interval - QS_U8_PRE_(refCtr_& TE_TICK_RATE); // tick rate - QS_END_PRE_() - - m_ctr = 0U; // schedule removal from the list -} -else { // the time event was already disarmed automatically - wasArmed = false; - refCtr_ = static_cast<std::uint8_t>(refCtr_ - & static_cast<std::uint8_t>(~TE_WAS_DISARMED)); - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_DISARM_ATTEMPT, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this time event object - QS_OBJ_PRE_(m_act); // the target AO - QS_U8_PRE_(refCtr_& TE_TICK_RATE); // tick rate - QS_END_PRE_() -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return wasArmed; - - - - noexcept - - - std::uint8_t const tickRate = refCtr_ & TE_TICK_RATE; - -#ifdef Q_SPY -std::uint_fast8_t const qs_id = static_cast<QActive *>(m_act)->m_prio; -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(600, (m_act != nullptr) - && (tickRate < static_cast<std::uint8_t>(QF_MAX_TICK_RATE)) - && (nTicks != 0U) - && (sig >= static_cast<QSignal>(Q_USER_SIG))); - -// is the time evt not running? -bool wasArmed; -if (m_ctr == 0U) { - wasArmed = false; - - // NOTE: For a duration of a single clock tick of the specified - // tick rate a time event can be disarmed and yet still linked into - // the list, because unlinking is performed exclusively in the - // QTimeEvt::tickX() function. - - // is the time event unlinked? - if (static_cast<std::uint8_t>(refCtr_ & TE_IS_LINKED) == 0U) { - // mark as linked - refCtr_ = static_cast<std::uint8_t>(refCtr_ | TE_IS_LINKED); - - // The time event is initially inserted into the separate - // "freshly armed" list based on timeEvtHead_[tickRate].act. - // Only later, inside QTimeEvt::tick(), the "freshly armed" - // list is appended to the main list of armed time events based on - // timeEvtHead_[tickRate].next. Again, this is to keep any - // changes to the main list exclusively inside QTimeEvt::tick(). - m_next = timeEvtHead_[tickRate].toTimeEvt(); - timeEvtHead_[tickRate].m_act = this; - } -} -else { // the time event was armed - wasArmed = true; -} -m_ctr = nTicks; // re-load the tick counter (shift the phasing) - -QS_BEGIN_PRE_(QS_QF_TIMEEVT_REARM, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this time event object - QS_OBJ_PRE_(m_act); // the target AO - QS_TEC_PRE_(m_ctr); // the # ticks - QS_TEC_PRE_(m_interval); // the interval - QS_2U8_PRE_(tickRate, (wasArmed ? 1U : 0U)); -QS_END_PRE_() - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return wasArmed; - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -std::uint8_t const isDisarmed = refCtr_ & TE_WAS_DISARMED; -refCtr_ = static_cast<std::uint8_t>(refCtr_ | TE_WAS_DISARMED); - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return isDisarmed != 0U; - - - - const noexcept - return m_act; - - - - const noexcept - return m_ctr; - - - - const noexcept - return m_interval; - - - - noexcept - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(sender); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, tickRate < Q_DIM(timeEvtHead_)); - -QTimeEvt *prev = &timeEvtHead_[tickRate]; - -QS_BEGIN_PRE_(QS_QF_TICK, 0U) - prev->m_ctr = (prev->m_ctr + 1U); - QS_TEC_PRE_(prev->m_ctr); // tick ctr - QS_U8_PRE_(tickRate); // tick rate -QS_END_PRE_() - -// scan the linked-list of time events at this rate... -std::uint_fast8_t limit = 2U*QF_MAX_ACTIVE; // loop hard limit -for (; limit > 0U; --limit) { - QTimeEvt *e = prev->m_next; // advance down the time evt. list - - if (e == nullptr) { // end of the list? - - // any new time events armed since the last run of tick()? - if (timeEvtHead_[tickRate].m_act != nullptr) { - - // sanity check - Q_ASSERT_INCRIT(110, prev != nullptr); - prev->m_next = timeEvtHead_[tickRate].toTimeEvt(); - timeEvtHead_[tickRate].m_act = nullptr; - e = prev->m_next; // switch to the new list - } - else { // all currently armed time events are processed - break; // terminate the for-loop - } - } - - // the time event 'e' must be valid - Q_ASSERT_INCRIT(112, QEvt::verify_(e)); - - if (e->m_ctr == 0U) { // time event scheduled for removal? - prev->m_next = e->m_next; - // mark time event 'e' as NOT linked - e->refCtr_ = static_cast<std::uint8_t>(e->refCtr_ - & static_cast<std::uint8_t>(~TE_IS_LINKED)); - // do NOT advance the prev pointer - QF_MEM_APP(); - QF_CRIT_EXIT(); // exit crit. section to reduce latency - - // NOTE: prevent merging critical sections - // In some QF ports the critical section exit takes effect only - // on the next machine instruction. If the next instruction is - // another entry to a critical section, the critical section - // might not be really exited, but rather the two adjacent - // critical sections would be MERGED. The QF_CRIT_EXIT_NOP() - // macro contains minimal code required to prevent such merging - // of critical sections in QF ports, in which it can occur. - QF_CRIT_EXIT_NOP(); - } - else { - e->m_ctr = (e->m_ctr - 1U); - - if (e->m_ctr == 0U) { // is time evt about to expire? - QActive * const act = e->toActive(); - - if (e->m_interval != 0U) { // periodic time evt? - e->m_ctr = e->m_interval; // rearm the time event - prev = e; // advance to this time event - } - else { // one-shot time event: automatically disarm - prev->m_next = e->m_next; - - // mark time event 'e' as NOT linked - e->refCtr_ = static_cast<std::uint8_t>(e->refCtr_ - & static_cast<std::uint8_t>(~TE_IS_LINKED)); - // do NOT advance the prev pointer - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_AUTO_DISARM, act->m_prio) - QS_OBJ_PRE_(e); // this time event object - QS_OBJ_PRE_(act); // the target AO - QS_U8_PRE_(tickRate); // tick rate - QS_END_PRE_() - } - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_POST, act->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(e); // the time event object - QS_SIG_PRE_(e->sig); // signal of this time event - QS_OBJ_PRE_(act); // the target AO - QS_U8_PRE_(tickRate); // tick rate - QS_END_PRE_() - -#ifdef QXK_HPP_ - if (e->sig < Q_USER_SIG) { - QXThread::timeout_(act); - QF_MEM_APP(); - QF_CRIT_EXIT(); - } - else { - QF_MEM_APP(); - QF_CRIT_EXIT(); // exit crit. section before posting - - // act->POST() asserts if the queue overflows - act->POST(e, sender); - } -#else - QF_MEM_APP(); - QF_CRIT_EXIT(); // exit crit. section before posting - - // act->POST() asserts if the queue overflows - act->POST(e, sender); -#endif - } - else { - prev = e; // advance to this time event - - QF_MEM_APP(); - QF_CRIT_EXIT(); // exit crit. section to reduce latency - - // prevent merging critical sections, see NOTE above - QF_CRIT_EXIT_NOP(); - } - } - QF_CRIT_ENTRY(); // re-enter crit. section to continue the loop - QF_MEM_SYS(); -} - -Q_ENSURE_INCRIT(190, limit > 0U); -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - - - - - noexcept - - - - - - - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(800, tickRate < QF_MAX_TICK_RATE); -QF_CRIT_EXIT(); - -bool inactive; -if (timeEvtHead_[tickRate].m_next != nullptr) { - inactive = false; -} -else if (timeEvtHead_[tickRate].m_act != nullptr) { - inactive = false; -} -else { - inactive = true; -} -return inactive; - - - - noexcept - return static_cast<QActive *>(m_act); - - - - noexcept - return static_cast<QTimeEvt *>(m_act); - - - - noexcept - : - QEvt(0U), - m_next(nullptr), - m_act(nullptr), - m_ctr(0U), - m_interval(0U) - -// The refCtr_ attribute is not used in time events, so it is -// reused to hold the tickRate as well as other information -refCtr_ = 0U; // default rate 0 - - - - = delete - - - - - - = delete - - - - - - - - - noexcept - - - : QActive(nullptr) - -// reuse m_head for tick-rate -m_eQueue.m_head = static_cast<QEQueueCtr>(tickRate); - - - - override - - - - - Q_UNUSED_PAR(e); -Q_UNUSED_PAR(qs_id); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -m_eQueue.m_tail = 0U; - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - Q_UNUSED_PAR(e); -Q_UNUSED_PAR(qs_id); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QEQueueCtr nTicks = m_eQueue.m_tail; // save # of ticks -m_eQueue.m_tail = 0U; // clear the # ticks - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -for (; nTicks > 0U; --nTicks) { - QTimeEvt::tick(static_cast<std::uint_fast8_t>(m_eQueue.m_head), - this); -} - - - - noexcept - - - #ifndef Q_SPY -Q_UNUSED_PAR(sender); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -if (m_eQueue.m_frontEvt == nullptr) { - - static QEvt const tickEvt(0U); // immutable event - - m_eQueue.m_frontEvt = &tickEvt; // deliver event directly - m_eQueue.m_nFree = (m_eQueue.m_nFree - 1U); // one less free event - - QACTIVE_EQUEUE_SIGNAL_(this); // signal the event queue -} - -// account for one more tick event -m_eQueue.m_tail = (m_eQueue.m_tail + 1U); - -QS_BEGIN_PRE_(QS_QF_ACTIVE_POST, m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(sender); // the sender object - QS_SIG_PRE_(0U); // the signal of the event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(0U, 0U); // poolId & refCtr - QS_EQC_PRE_(0U); // # free entries - QS_EQC_PRE_(0U); // min # free entries -QS_END_PRE_() - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - - - - - - - - - - - - - - - // friends... - - - - - - - - - - noexcept - : m_frontEvt(nullptr), - m_ring(nullptr), - m_end(0U), - m_head(0U), - m_tail(0U), - m_nFree(0U), - m_nMin(0U) - - - - - - noexcept - - - - - m_frontEvt = nullptr; // no events in the queue -m_ring = &qSto[0]; -m_end = static_cast<QEQueueCtr>(qLen); -if (qLen > 0U) { - m_head = 0U; - m_tail = 0U; -} -m_nFree = static_cast<QEQueueCtr>(qLen + 1U); //+1 for frontEvt -m_nMin = m_nFree; - - - - noexcept - - - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(200, e != nullptr); - -QEQueueCtr nFree = m_nFree; // get volatile into temporary - -// required margin available? -bool status; -if (((margin == QF::NO_MARGIN) && (nFree > 0U)) - || (nFree > static_cast<QEQueueCtr>(margin))) -{ - // is it a mutable event? - if (e->getPoolId_() != 0U) { - QEvt_refCtr_inc_(e); // increment the reference counter - } - - --nFree; // one free entry just used up - m_nFree = nFree; // update the original - if (m_nMin > nFree) { - m_nMin = nFree; // update minimum so far - } - - QS_BEGIN_PRE_(QS_QF_EQUEUE_POST, qs_id) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this queue object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(m_nMin); // min # free entries - QS_END_PRE_() - - if (m_frontEvt == nullptr) { // was the queue empty? - m_frontEvt = e; // deliver event directly - } - else { // queue was not empty, insert event into the ring-buffer - // insert event into the ring buffer (FIFO) - m_ring[m_head] = e; // insert e into buffer - - // need to wrap? - if (m_head == 0U) { - m_head = m_end; // wrap around - } - m_head = (m_head - 1U); - } - status = true; // event posted successfully -} -else { // event cannot be posted - // dropping events must be acceptable - Q_ASSERT_INCRIT(210, margin != QF::NO_MARGIN); - - QS_BEGIN_PRE_(QS_QF_EQUEUE_POST_ATTEMPT, qs_id) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this queue object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(margin); // margin requested - QS_END_PRE_() - - status = false; // event not posted -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return status; - - - - noexcept - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QEQueueCtr nFree = m_nFree; // get volatile into temporary - -Q_REQUIRE_INCRIT(300, nFree != 0U); - -if (e->getPoolId_() != 0U) { // is it a mutable event? - QEvt_refCtr_inc_(e); // increment the reference counter -} - ---nFree; // one free entry just used up -m_nFree = nFree; // update the original -if (m_nMin > nFree) { - m_nMin = nFree; // update minimum so far -} - -QS_BEGIN_PRE_(QS_QF_EQUEUE_POST_LIFO, qs_id) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this queue object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_EQC_PRE_(m_nMin); // min # free entries -QS_END_PRE_() - -QEvt const * const frontEvt = m_frontEvt; // read into temporary -m_frontEvt = e; // deliver event directly to the front of the queue - -if (frontEvt != nullptr) { // was the queue not empty? - m_tail = (m_tail + 1U); - if (m_tail == m_end) { // need to wrap the tail? - m_tail = 0U; // wrap around - } - m_ring[m_tail] = frontEvt; // buffer the old front evt -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QEvt const * const e = m_frontEvt; // always remove evt from the front - -if (e != nullptr) { // was the queue not empty? - QEQueueCtr const nFree = m_nFree + 1U; - m_nFree = nFree; // update the # free - - // any events in the the ring buffer? - if (nFree <= m_end) { - m_frontEvt = m_ring[m_tail]; // remove from the tail - if (m_tail == 0U) { // need to wrap? - m_tail = m_end; // wrap around - } - m_tail = (m_tail - 1U); - - QS_BEGIN_PRE_(QS_QF_EQUEUE_GET, qs_id) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this queue object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_END_PRE_() - } - else { - m_frontEvt = nullptr; // queue becomes empty - - // all entries in the queue must be free (+1 for fronEvt) - Q_ASSERT_INCRIT(410, nFree == (m_end + 1U)); - - QS_BEGIN_PRE_(QS_QF_EQUEUE_GET_LAST, qs_id) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this queue object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_END_PRE_() - } -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return e; - - - - const noexcept - return m_nFree; - - - - const noexcept - return m_nMin; - - - - const noexcept - return m_frontEvt == nullptr; - - - - = delete - - - - - - = delete - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : m_start(nullptr), - m_end(nullptr), - m_free_head(nullptr), - m_blockSize(0U), - m_nTot(0U), - m_nFree(0U), - m_nMin(0U) - - - - - - noexcept - - - - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, (poolSto != nullptr) - && (poolSize >= static_cast<std::uint_fast32_t>(sizeof(QFreeBlock))) - && (static_cast<std::uint_fast16_t>(blockSize + sizeof(QFreeBlock)) - > blockSize)); - -m_free_head = static_cast<QFreeBlock *>(poolSto); - -// find # free blocks in a memory block, NO DIVISION -m_blockSize = static_cast<QMPoolSize>(sizeof(QFreeBlock)); -std::uint_fast16_t nblocks = 1U; -while (m_blockSize < static_cast<QMPoolSize>(blockSize)) { - m_blockSize += static_cast<QMPoolSize>(sizeof(QFreeBlock)); - ++nblocks; -} - -// the pool buffer must fit at least one rounded-up block -Q_ASSERT_INCRIT(110, poolSize >= m_blockSize); - -// start at the head of the free list -QFreeBlock *fb = m_free_head; -m_nTot = 1U; // the last block already in the list - -// chain all blocks together in a free-list... -for (std::uint_fast32_t size = poolSize - m_blockSize; - size >= static_cast<std::uint_fast32_t>(m_blockSize); - size -= static_cast<std::uint_fast32_t>(m_blockSize)) -{ - fb->m_next = &fb[nblocks]; // point next link to next block -#ifndef Q_UNSAFE - fb->m_next_dis = ~Q_UINTPTR_CAST_(fb->m_next); -#endif - fb = fb->m_next; // advance to the next block - ++m_nTot; // one more free block in the pool -} - -fb->m_next = nullptr; // the last link points to NULL -#ifndef Q_UNSAFE -fb->m_next_dis = ~Q_UINTPTR_CAST_(fb->m_next); -#endif - -fb->m_next = nullptr; // the last link points to NULL -m_nFree = m_nTot; // all blocks are free -m_nMin = m_nTot; // the minimum # free blocks -m_start = static_cast<QFreeBlock *>(poolSto); // original start -m_end = fb; // the last block in this pool - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// have more free blocks than the requested margin? -QFreeBlock *fb; -if (m_nFree > static_cast<QMPoolCtr>(margin)) { - fb = m_free_head; // get a free block - - // a free block must be valid - Q_ASSERT_INCRIT(300, fb != nullptr); - - QFreeBlock * const fb_next = fb->m_next; - - // the free block must have integrity (duplicate inverse storage) - Q_ASSERT_INCRIT(302, Q_UINTPTR_CAST_(fb_next) - == static_cast<std::uintptr_t>(~fb->m_next_dis)); - - m_nFree = (m_nFree - 1U); // one free block less - if (m_nFree == 0U) { // is the pool becoming empty? - // pool is becoming empty, so the next free block must be NULL - Q_ASSERT_INCRIT(320, fb_next == nullptr); - - m_nMin = 0U; // remember that the pool got empty - } - else { - // invariant: - // The pool is not empty, so the next free-block pointer, - // so the next free block must be in range. - - // NOTE: The next free block pointer can fall out of range - // when the client code writes past the memory block, thus - // corrupting the next block. - Q_ASSERT_INCRIT(330, - QF_PTR_RANGE_(fb_next, m_start, m_end)); - - // is the # free blocks the new minimum so far? - if (m_nMin > m_nFree) { - m_nMin = m_nFree; // remember the minimum so far - } - } - - m_free_head = fb_next; // set the head to the next free block - - QS_BEGIN_PRE_(QS_QF_MPOOL_GET, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this memory pool - QS_MPC_PRE_(m_nFree); // # of free blocks in the pool - QS_MPC_PRE_(m_nMin); // min # free blocks ever in the pool - QS_END_PRE_() -} -else { // don't have enough free blocks at this point - fb = nullptr; - - QS_BEGIN_PRE_(QS_QF_MPOOL_GET_ATTEMPT, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this memory pool - QS_MPC_PRE_(m_nFree); // # of free blocks in the pool - QS_MPC_PRE_(margin); // the requested margin - QS_END_PRE_() -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return fb; // return the block or nullptr to the caller - - - - noexcept - - - - - #ifndef Q_SPY -Q_UNUSED_PAR(qs_id); -#endif - -QFreeBlock * const fb = static_cast<QFreeBlock *>(block); - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(200, (m_nFree < m_nTot) - && QF_PTR_RANGE_(fb, m_start, m_end)); - -fb->m_next = m_free_head; // link into list -#ifndef Q_UNSAFE -fb->m_next_dis = static_cast<std::uintptr_t>( - ~Q_UINTPTR_CAST_(fb->m_next)); -#endif - -// set as new head of the free list -m_free_head = static_cast<QFreeBlock *>(block); - -m_nFree = m_nFree + 1U; // one more free block in this pool - -QS_BEGIN_PRE_(QS_QF_MPOOL_PUT, qs_id) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this memory pool - QS_MPC_PRE_(m_nFree); // the # free blocks in the pool -QS_END_PRE_() - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - const noexcept - return m_blockSize; - - - - const noexcept - return m_nMin; - - - - const noexcept - return m_nFree; - - - - = delete - - - - - - = delete - - - - - - noexcept - - - - - - - - noexcept - - - - - - - - - - - - - - - - - - - - - - noexcept - - - - - std::uint8_t *ptr = static_cast<std::uint8_t *>(start); -for (std::uint_fast16_t n = len; n > 0U; --n) { - *ptr = 0U; - ++ptr; -} - - - - - - - - - - - - - - - - - noexcept - //! @deprecated - - - - - QActive::psInit(subscrSto, maxSignal); - - - - noexcept - //! @deprecated - - - - - - - QActive::publish_(e, sender, qs_id); - - - - noexcept - //! @deprecated - - - - - QTimeEvt::tick(tickRate, sender); - - - - noexcept - //! @deprecated - - - return QActive::getQueueMin(prio); - - - - {0xFFFFU}; - - - - - - - noexcept - - - - - - - std::uint_fast8_t const poolId = priv_.maxPool_; - -// see precondition{qf_dyn,200} and precondition{qf_dyn,201} -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(200, poolId < QF_MAX_EPOOL); -if (poolId > 0U) { - Q_REQUIRE_INCRIT(201, - QF_EPOOL_EVENT_SIZE_(priv_.ePool_[poolId - 1U]) < evtSize); -} -priv_.maxPool_ = poolId + 1U; // one more pool - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -// perform the port-dependent initialization of the event-pool -QF_EPOOL_INIT_(priv_.ePool_[poolId], poolSto, poolSize, evtSize); - -#ifdef Q_SPY -// generate the object-dictionary entry for the initialized pool -{ - std::uint8_t obj_name[9] = "EvtPool?"; - obj_name[7] = static_cast<std::uint8_t>( - static_cast<std::uint8_t>('0') - + static_cast<std::uint8_t>(poolId + 1U)); - QS::obj_dict_pre_(&priv_.ePool_[poolId], - reinterpret_cast<char *>(&obj_name[0])); -} -#endif // Q_SPY - - - - noexcept - return QF_EPOOL_EVENT_SIZE_(priv_.ePool_[priv_.maxPool_ - 1U]); - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(400, (poolId <= QF_MAX_EPOOL) - && (0U < poolId) && (poolId <= priv_.maxPool_)); - -std::uint_fast16_t const min = static_cast<std::uint_fast16_t>( - priv_.ePool_[poolId - 1U].getNMin()); - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return min; - - - - noexcept - - - - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// find the pool id that fits the requested event size... -std::uint_fast8_t poolId = 0U; // zero-based poolId initially -for (; poolId < priv_.maxPool_; ++poolId) { - if (evtSize <= QF_EPOOL_EVENT_SIZE_(priv_.ePool_[poolId])) { - break; - } -} - -// precondition: -// - cannot run out of registered pools -Q_REQUIRE_INCRIT(300, poolId < priv_.maxPool_); - -++poolId; // convert to 1-based poolId - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -// get event e (port-dependent)... -QEvt *e; -#ifdef Q_SPY -QF_EPOOL_GET_(priv_.ePool_[poolId - 1U], e, - ((margin != NO_MARGIN) ? margin : 0U), - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId); -#else -QF_EPOOL_GET_(priv_.ePool_[poolId - 1U], e, - ((margin != NO_MARGIN) ? margin : 0U), 0U); -#endif - -if (e != nullptr) { // was e allocated correctly? - e->sig = static_cast<QSignal>(sig); // set the signal - e->refCtr_ = 0U; // initialize the reference counter to 0 - e->evtTag_ = static_cast<std::uint8_t>(QEvt::MARKER | poolId); - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QF_NEW, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_EVS_PRE_(evtSize); // the size of the event - QS_SIG_PRE_(sig); // the signal of the event - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); -} -else { // event was not allocated - - QF_CRIT_ENTRY(); - // This assertion means that the event allocation failed, - // and this failure cannot be tolerated. The most frequent - // reason is an event leak in the application. - Q_ASSERT_INCRIT(320, margin != NO_MARGIN); - - QS_MEM_SYS(); - QS_BEGIN_PRE_(QS_QF_NEW_ATTEMPT, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_EVS_PRE_(evtSize); // the size of the event - QS_SIG_PRE_(sig); // the signal of the event - QS_END_PRE_() - QS_MEM_APP(); - - QF_CRIT_EXIT(); -} - -// the returned event e is guaranteed to be valid (not NULL) -// if we can't tolerate failed allocation -return e; - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(402, QEvt::verify_(e)); - -std::uint_fast8_t const poolId = e->getPoolId_(); - -if (poolId != 0U) { // is it a pool event (mutable)? - QF_MEM_SYS(); - - if (e->refCtr_ > 1U) { // isn't this the last reference? - - QS_BEGIN_PRE_(QS_QF_GC_ATTEMPT, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(poolId, e->refCtr_); // poolId & refCtr - QS_END_PRE_() - - QEvt_refCtr_dec_(e); // decrement the ref counter - - QF_MEM_APP(); - QF_CRIT_EXIT(); - } - else { // this is the last reference to this event, recycle it - - QS_BEGIN_PRE_(QS_QF_GC, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(poolId, e->refCtr_); // poolId & refCtr - QS_END_PRE_() - - // pool number must be in range - Q_ASSERT_INCRIT(410, (poolId <= priv_.maxPool_) - && (poolId <= QF_MAX_EPOOL)); - QF_MEM_APP(); - QF_CRIT_EXIT(); - - // NOTE: casting 'const' away is legit because it's a pool event -#ifdef Q_SPY - QF_EPOOL_PUT_(priv_.ePool_[poolId - 1U], - QF_CONST_CAST_(QEvt*, e), - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId); -#else - QF_EPOOL_PUT_(priv_.ePool_[poolId - 1U], - QF_CONST_CAST_(QEvt*, e), 0U); -#endif - } -} -else { - QF_CRIT_EXIT(); -} - - - - noexcept - - - - - #ifdef Q_UNSAFE -Q_UNUSED_PAR(evtRef); -#endif - -QF_CRIT_STAT -QF_CRIT_ENTRY(); - -Q_REQUIRE_INCRIT(502, QEvt::verify_(e)); - -std::uint_fast8_t const poolId = e->getPoolId_(); - -Q_REQUIRE_INCRIT(500, (poolId != 0U) - && (evtRef == nullptr)); - -QEvt_refCtr_inc_(e); // increments the ref counter - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QF_NEW_REF, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(poolId, e->refCtr_); // poolId & refCtr -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -return e; - - - - noexcept - - - QEvt const * const e = evtRef; - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(602, QEvt::verify_(e)); - -#ifdef Q_SPY -std::uint_fast8_t const poolId = e->getPoolId_(); -#endif - -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QF_DELETE_REF, - static_cast<std::uint_fast8_t>(QS_EP_ID) + poolId) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_2U8_PRE_(poolId, e->refCtr_); // poolId & refCtr -QS_END_PRE_() -QS_MEM_APP(); - -QF_CRIT_EXIT(); - -#if (QF_MAX_EPOOL > 0U) -gc(evtRef); // recycle the referenced event -#endif - - - - noexcept - - - - - - - - - - noexcept - - - - - - - - - - - - - - - - - - - - - - - - \ - (static_cast<QP::QPrioSpec>((prio_) | (pthre_) << 8U)) - - - - - - - - (static_cast<evtT_ *>( \ - QP::QF::newX_(sizeof(evtT_), QP::QF::NO_MARGIN, (sig_)))) - - - - - - - - - - (static_cast<evtT_ *>( \ - new(QP::QF::newX_(sizeof(evtT_), QP::QF::NO_MARGIN, (sig_))) \ - evtT_(__VA_ARGS__))) - - - - - - - - - - (static_cast<evtT_ *>( \ - QP::QF::newX_(sizeof(evtT_), (margin_), (sig_)))) - - - - - - - - - - - - (static_cast<evtT_ *>( \ - new(QP::QF::newX_(sizeof(evtT_), (margin_), (sig_))) \ - evtT_(__VA_ARGS__))) - - - - - - - - \ - ((evtRef_) = static_cast<evtT_ const *>(QP::QF::newRef_(e, (evtRef_)))) - - - - - - do { \ - QP::QF::deleteRef_((evtRef_)); \ - (evtRef_) = 0U; \ -} while (false) - - - - - - - - \ - publish_((e_), (sender_), (sender_)->getPrio()) - - - - - - - - publish_((e_), nullptr, 0U) - - - - - - - - post_((e_), QP::QF::NO_MARGIN, (sender_)) - - - - - - - - post_((e_), QP::QF::NO_MARGIN, nullptr) - - - - - - - - - - \ - post_((e_), (margin_), (sender_)) - - - - - - - - - - post_((e_), (margin_), nullptr) - - - - - - - - tick((tickRate_), (sender_)) - - - - - - - - tick((tickRate_), nullptr) - - - - - - TICK_X(0U, (sender_)) - - - - - - trig_((sender_)) - - - - - - trig_(nullptr) - - - - (static_cast<void>(0)) - - - - (static_cast<void>(0)) - - - - (static_cast<void>(0)) - - - - - - - Native QF event pool - QMPool - - - - Native QF event pool initialization - - - - - - - - - \ - (p_).init((poolSto_), (poolSize_), (evtSize_)) - - - - Native QF event pool event-size getter - - - ((p_).getBlockSize()) - - - - Native QF event pool get-event - - - - - - - - - \ - ((e_) = static_cast<QEvt *>((p_).get((m_), (qs_id_)))) - - - - Native QF event pool put-event - - - - - - - ((p_).put((e_), (qs_id_))) - - - - - - - - - - - - - - - - - - - - - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_ASSERT_INCRIT(102, priv_.schedCeil - == static_cast<std::uint_fast8_t>(~priv_.schedCeil_dis)); - -if (ceiling > priv_.schedCeil) { // raising the scheduler ceiling? - - QS_BEGIN_PRE_(QS_SCHED_LOCK, 0U) - QS_TIME_PRE_(); // timestamp - // the previous sched ceiling & new sched ceiling - QS_2U8_PRE_(static_cast<std::uint8_t>(priv_.schedCeil), - static_cast<std::uint8_t>(ceiling)); - QS_END_PRE_() - - priv_.schedCeil = ceiling; -#ifndef Q_UNSAFE - priv_.schedCeil_dis = static_cast<std::uint_fast16_t>(~ceiling); -#endif -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_ASSERT_INCRIT(202, priv_.schedCeil - == static_cast<std::uint_fast8_t>(~priv_.schedCeil_dis)); - -if (priv_.schedCeil != 0U) { // actually enabling the scheduler? - - QS_BEGIN_PRE_(QS_SCHED_UNLOCK, 0U) - QS_TIME_PRE_(); // timestamp - // current sched ceiling (old), previous sched ceiling (new) - QS_2U8_PRE_(static_cast<std::uint8_t>(priv_.schedCeil), 0U); - QS_END_PRE_() - - priv_.schedCeil = 0U; -#ifndef Q_UNSAFE - priv_.schedCeil_dis = ~static_cast<std::uint_fast16_t>(0U); -#endif -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - - - bzero_(&QF::priv_, sizeof(QF::priv_)); -bzero_(&QV::priv_, sizeof(QV::priv_)); -bzero_(&QActive::registry_[0], sizeof(QActive::registry_)); - -#ifndef Q_UNSAFE -QV::priv_.readySet.update_(&QV::priv_.readySet_dis); -QV::priv_.schedCeil_dis = ~static_cast<std::uint_fast16_t>(0U); -#endif - -#ifdef QV_INIT -QV_INIT(); // port-specific initialization of the QV kernel -#endif - - - - onCleanup(); // cleanup callback -// nothing else to do for the QV kernel - - - - #ifdef Q_SPY -// produce the QS_QF_RUN trace record -QF_INT_DISABLE(); -QF_MEM_SYS(); -QS::beginRec_(QS_REC_NUM_(QS_QF_RUN)); -QS::endRec_(); -QF_MEM_APP(); -QF_INT_ENABLE(); -#endif // Q_SPY - -onStartup(); // application-specific startup callback - -QF_INT_DISABLE(); -QF_MEM_SYS(); - -#ifdef QV_START -QV_START(); // port-specific startup of the QV kernel -#endif - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) -std::uint_fast8_t pprev = 0U; // previous prio. -#endif - -for (;;) { // QV event loop... - - // check internal integrity (duplicate inverse storage) - Q_ASSERT_INCRIT(302, - QV::priv_.readySet.verify_(&QV::priv_.readySet_dis)); - // check internal integrity (duplicate inverse storage) - Q_ASSERT_INCRIT(303, QV::priv_.schedCeil - == static_cast<std::uint_fast8_t>(~QV::priv_.schedCeil_dis)); - - // find the maximum prio. AO ready to run - std::uint_fast8_t const p = (QV::priv_.readySet.notEmpty() - ? QV::priv_.readySet.findMax() - : 0U); - - if (p > QV::priv_.schedCeil) { // is it above the sched ceiling? - QActive * const a = QActive::registry_[p]; - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - QS_BEGIN_PRE_(QS_SCHED_NEXT, p) - QS_TIME_PRE_(); // timestamp - QS_2U8_PRE_(static_cast<std::uint8_t>(p), - static_cast<std::uint8_t>(pprev)); - QS_END_PRE_() - -#ifdef QF_ON_CONTEXT_SW - QF_onContextSw(((pprev != 0U) - ? QActive::registry_[pprev] - : nullptr), a); -#endif // QF_ON_CONTEXT_SW - - pprev = p; // update previous prio. -#endif // (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - - QF_MEM_APP(); - QF_INT_ENABLE(); - - QEvt const * const e = a->get_(); - // NOTE QActive::get_() performs QF_MEM_APP() before return - - // dispatch event (virtual call) - a->dispatch(e, a->getPrio()); -#if (QF_MAX_EPOOL > 0U) - gc(e); -#endif - QF_INT_DISABLE(); - QF_MEM_SYS(); - - if (a->getEQueue().isEmpty()) { // empty queue? - QV::priv_.readySet.remove(p); -#ifndef Q_UNSAFE - QV::priv_.readySet.update_(&QV::priv_.readySet_dis); -#endif - } - } - else { // no AO ready to run --> idle -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - if (pprev != 0U) { - QS_BEGIN_PRE_(QS_SCHED_IDLE, pprev) - QS_TIME_PRE_(); // timestamp - QS_U8_PRE_(static_cast<std::uint8_t>(pprev)); - QS_END_PRE_() - -#ifdef QF_ON_CONTEXT_SW - QF_onContextSw(QActive::registry_[pprev], nullptr); -#endif // QF_ON_CONTEXT_SW - - pprev = 0U; // update previous prio - } -#endif // (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - - QF_MEM_APP(); - - // QV::onIdle() must be called with interrupts DISABLED - // because the determination of the idle condition (all event - // queues empty) can change at any time by an interrupt posting - // events to a queue. - // - // NOTE: QV::onIdle() MUST enable interrupts internally, - // ideally at the same time as putting the CPU into a power- - // saving mode. - QV::onIdle(); - - QF_INT_DISABLE(); - QF_MEM_SYS(); - } -} -#ifdef __GNUC__ // GNU compiler? -return 0; -#endif - - - - - - - - - - - - - - - - - - - Q_UNUSED_PAR(stkSto); // not needed in QV -Q_UNUSED_PAR(stkSize); // not needed in QV - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(300, stkSto == nullptr); -QF_CRIT_EXIT(); - -m_prio = static_cast<std::uint8_t>(prioSpec & 0xFFU); // QF-prio. -m_pthre = 0U; // not used -register_(); // make QF aware of this AO - -m_eQueue.init(qSto, qLen); // initialize QEQueue of this AO - -this->init(par, m_prio); // take the top-most initial tran. (virtual) -QS_FLUSH(); // flush the trace buffer to the host - - - - - - - - - - - - (static_cast<void>(0)) - - - - (static_cast<void>(0)) - - - - - - \ - Q_ASSERT_INCRIT(310, (me_)->m_eQueue.m_frontEvt != nullptr) - - - - - - \ - QV::priv_.readySet.insert((me_)->m_prio); \ - QV::priv_.readySet.update_(&QV::priv_.readySet_dis) - - - - - - \ - (QV::priv_.readySet.insert((me_)->m_prio)) - - - - - - - = std::uint_fast8_t; - - - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, !QK_ISR_CONTEXT_()); -Q_REQUIRE_INCRIT(102, QK_priv_.lockCeil == ~QK_priv_.lockCeil_dis); - -// first store the previous lock prio -QSchedStatus stat; -if (ceiling > QK_priv_.lockCeil) { // raising the lock ceiling? - QS_BEGIN_PRE_(QS_SCHED_LOCK, QK_priv_.actPrio) - QS_TIME_PRE_(); // timestamp - // the previous lock ceiling & new lock ceiling - QS_2U8_PRE_(static_cast<std::uint8_t>(QK_priv_.lockCeil), - static_cast<std::uint8_t>(ceiling)); - QS_END_PRE_() - - // previous status of the lock - stat = static_cast<QSchedStatus>(QK_priv_.lockCeil); - - // new status of the lock - QK_priv_.lockCeil = ceiling; -#ifndef Q_UNSAFE - QK_priv_.lockCeil_dis = ~ceiling; -#endif -} -else { - stat = 0xFFU; // scheduler not locked -} - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return stat; // return the status to be saved in a stack variable - - - - noexcept - - - // has the scheduler been actually locked by the last QK::schedLock()? -if (prevCeil != 0xFFU) { - QF_CRIT_STAT - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - Q_REQUIRE_INCRIT(202, QK_priv_.lockCeil == ~QK_priv_.lockCeil_dis); - Q_REQUIRE_INCRIT(210, (!QK_ISR_CONTEXT_()) - && (QK_priv_.lockCeil > prevCeil)); - - QS_BEGIN_PRE_(QS_SCHED_UNLOCK, QK_priv_.actPrio) - QS_TIME_PRE_(); // timestamp - // current lock ceiling (old), previous lock ceiling (new) - QS_2U8_PRE_(static_cast<std::uint8_t>(QK_priv_.lockCeil), - static_cast<std::uint8_t>(prevCeil)); - QS_END_PRE_() - - // restore the previous lock ceiling - QK_priv_.lockCeil = prevCeil; -#ifndef Q_UNSAFE - QK_priv_.lockCeil_dis = ~prevCeil; -#endif - - // find if any AOs should be run after unlocking the scheduler - if (QK_sched_() != 0U) { // preemption needed? - QK_activate_(); // activate any unlocked AOs - } - - QF_MEM_APP(); - QF_CRIT_EXIT(); -} - - - - - - - - - bzero_(&QF::priv_, sizeof(QF::priv_)); -bzero_(&QK_priv_, sizeof(QK_priv_)); -bzero_(&QActive::registry_[0], sizeof(QActive::registry_)); - -// setup the QK scheduler as initially locked and not running -QK_priv_.lockCeil = (QF_MAX_ACTIVE + 1U); // scheduler locked - -#ifndef Q_UNSAFE -QK_priv_.readySet.update_(&QK_priv_.readySet_dis); -QK_priv_.actPrio_dis = ~QK_priv_.actPrio; -QK_priv_.nextPrio_dis = ~QK_priv_.nextPrio; -QK_priv_.actThre_dis = ~QK_priv_.actThre; -QK_priv_.lockCeil_dis = ~QK_priv_.lockCeil; -#endif - -#ifdef QK_INIT -QK_INIT(); // port-specific initialization of the QK kernel -#endif - - - - onCleanup(); // cleanup callback -// nothing else to do for the QK preemptive kernel - - - - #ifdef Q_SPY -// produce the QS_QF_RUN trace record -QF_INT_DISABLE(); -QF_MEM_SYS(); -QS::beginRec_(QS_REC_NUM_(QS_QF_RUN)); -QS::endRec_(); -QF_MEM_APP(); -QF_INT_ENABLE(); -#endif // Q_SPY - -onStartup(); // application-specific startup callback - -QF_INT_DISABLE(); -QF_MEM_SYS(); - -#ifdef QK_START -QK_START(); // port-specific startup of the QK kernel -#endif - -QK_priv_.lockCeil = 0U; // unlock the QK scheduler -#ifndef Q_UNSAFE -QK_priv_.lockCeil_dis = ~QK_priv_.lockCeil; -#endif - -// activate AOs to process events posted so far -if (QK_sched_() != 0U) { - QK_activate_(); -} - -QF_MEM_APP(); -QF_INT_ENABLE(); - -for (;;) { // QK idle loop... - QK::onIdle(); // application-specific QK on-idle callback -} - -#ifdef __GNUC__ // GNU compiler? -return 0; -#endif - - - - - - - - - - - - - - - - - - - Q_UNUSED_PAR(stkSto); // not needed in QK -Q_UNUSED_PAR(stkSize); // not needed in QK - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(300, (!QK_ISR_CONTEXT_()) - && (stkSto == nullptr)); -QF_MEM_APP(); -QF_CRIT_EXIT(); - -m_prio = static_cast<std::uint8_t>(prioSpec & 0xFFU); // QF-prio. -m_pthre = static_cast<std::uint8_t>(prioSpec >> 8U); // preemption-thre. -register_(); // make QF aware of this AO - -m_eQueue.init(qSto, qLen); // initialize the built-in queue - -this->init(par, m_prio); // top-most initial tran. (virtual call) -QS_FLUSH(); // flush the trace buffer to the host - -// See if this AO needs to be scheduled in case QK is already running -QF_CRIT_ENTRY(); -QF_MEM_SYS(); -if (QK_sched_() != 0U) { // synchronous preemption needed? - QK_activate_(); // synchronously activate AOs -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - noexcept - // NOTE: this function is entered with interrupts DISABLED - -Q_REQUIRE_INCRIT(402, - QK_priv_.readySet.verify_(&QK_priv_.readySet_dis)); - -std::uint_fast8_t p; -if (QK_priv_.readySet.isEmpty()) { - p = 0U; // no activation needed -} -else { - // find the highest-prio AO with non-empty event queue - p = QK_priv_.readySet.findMax(); - - Q_ASSERT_INCRIT(412, - QK_priv_.actThre == ~QK_priv_.actThre_dis); - - // is the AO's prio. below the active preemption-threshold? - if (p <= QK_priv_.actThre) { - p = 0U; // no activation needed - } - else { - Q_ASSERT_INCRIT(422, - QK_priv_.lockCeil == ~QK_priv_.lockCeil_dis); - - // is the AO's prio. below the lock-ceiling? - if (p <= QK_priv_.lockCeil) { - p = 0U; // no activation needed - } - else { - Q_ASSERT_INCRIT(432, - QK_priv_.nextPrio == ~QK_priv_.nextPrio_dis); - QK_priv_.nextPrio = p; // next AO to run -#ifndef Q_UNSAFE - QK_priv_.nextPrio_dis = ~QK_priv_.nextPrio; -#endif - } - } -} - -return p; - - - - noexcept - // NOTE: this function is entered with interrupts DISABLED - -std::uint_fast8_t const prio_in = QK_priv_.actPrio; // save initial prio. -std::uint_fast8_t p = QK_priv_.nextPrio; // next prio to run - -Q_REQUIRE_INCRIT(502, - (prio_in == ~QK_priv_.actPrio_dis) - && (p == ~QK_priv_.nextPrio_dis)); -Q_REQUIRE_INCRIT(510, (prio_in <= QF_MAX_ACTIVE) - && (0U < p) && (p <= QF_MAX_ACTIVE)); - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) -std::uint_fast8_t pprev = prio_in; -#endif // QF_ON_CONTEXT_SW || Q_SPY - -QK_priv_.nextPrio = 0U; // clear for the next time -#ifndef Q_UNSAFE -QK_priv_.nextPrio_dis = ~QK_priv_.nextPrio; -#endif - -std::uint_fast8_t pthre_in; -QP::QActive *a; -if (prio_in == 0U) { // preempting the idle thread? - pthre_in = 0U; -} -else { - a = QP::QActive::registry_[prio_in]; - Q_ASSERT_INCRIT(510, a != nullptr); - - pthre_in = static_cast<std::uint_fast8_t>(a->getPThre()); - Q_ASSERT_INCRIT(511, pthre_in == static_cast<std::uint_fast8_t>( - ~static_cast<std::uint_fast8_t>(a->m_pthre_dis) & 0xFFU)); -} - -// loop until no more ready-to-run AOs of higher pthre than the initial -do { - a = QP::QActive::registry_[p]; // obtain the pointer to the AO - Q_ASSERT_INCRIT(520, a != nullptr); // the AO must be registered - std::uint_fast8_t const pthre - = static_cast<std::uint_fast8_t>(a->getPThre()); - Q_ASSERT_INCRIT(522, pthre == static_cast<std::uint_fast8_t>( - ~static_cast<std::uint_fast8_t>(a->m_pthre_dis) & 0xFFU)); - - // set new active prio. and preemption-threshold - QK_priv_.actPrio = p; - QK_priv_.actThre = pthre; -#ifndef Q_UNSAFE - QK_priv_.actPrio_dis = ~p; - QK_priv_.actThre_dis = ~pthre; -#endif - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - if (p != pprev) { // changing threads? - - QS_BEGIN_PRE_(QP::QS_SCHED_NEXT, p) - QS_TIME_PRE_(); // timestamp - QS_2U8_PRE_(p, // prio. of the scheduled AO - pprev); // previous prio. - QS_END_PRE_() - -#ifdef QF_ON_CONTEXT_SW - QF_onContextSw(QP::QActive::registry_[pprev], a); -#endif // QF_ON_CONTEXT_SW - - pprev = p; // update previous prio. - } -#endif // QF_ON_CONTEXT_SW || Q_SPY - - QF_INT_ENABLE(); // unconditionally enable interrupts - - QP::QEvt const * const e = a->get_(); - // NOTE QActive_get_() performs QF_MEM_APP() before return - - // dispatch event (virtual call) - a->dispatch(e, a->getPrio()); -#if (QF_MAX_EPOOL > 0U) - QP::QF::gc(e); -#endif - - // determine the next highest-prio. AO ready to run... - QF_INT_DISABLE(); // unconditionally disable interrupts - QF_MEM_SYS(); - - // internal integrity check (duplicate inverse storage) - Q_ASSERT_INCRIT(532, - QK_priv_.readySet.verify_(&QK_priv_.readySet_dis)); - - if (a->getEQueue().isEmpty()) { // empty queue? - QK_priv_.readySet.remove(p); -#ifndef Q_UNSAFE - QK_priv_.readySet.update_(&QK_priv_.readySet_dis); -#endif - } - - if (QK_priv_.readySet.isEmpty()) { - p = 0U; // no activation needed - } - else { - // find new highest-prio AO ready to run... - p = QK_priv_.readySet.findMax(); - - // is the new prio. below the initial preemption-threshold? - if (p <= pthre_in) { - p = 0U; // no activation needed - } - else { - Q_ASSERT_INCRIT(542, - QK_priv_.lockCeil == ~QK_priv_.lockCeil_dis); - - // is the AO's prio. below the lock preemption-threshold? - if (p <= QK_priv_.lockCeil) { - p = 0U; // no activation needed - } - else { - Q_ASSERT_INCRIT(550, p <= QF_MAX_ACTIVE); - } - } - } -} while (p != 0U); - -// restore the active prio. and preemption-threshold -QK_priv_.actPrio = prio_in; -QK_priv_.actThre = pthre_in; -#ifndef Q_UNSAFE -QK_priv_.actPrio_dis = ~QK_priv_.actPrio; -QK_priv_.actThre_dis = ~QK_priv_.actThre; -#endif - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) -if (prio_in != 0U) { // resuming an active object? - a = QP::QActive::registry_[prio_in]; // pointer to preempted AO - - QS_BEGIN_PRE_(QP::QS_SCHED_NEXT, prio_in) - QS_TIME_PRE_(); // timestamp - // prio. of the resumed AO, previous prio. - QS_2U8_PRE_(prio_in, pprev); - QS_END_PRE_() -} -else { // resuming prio.==0 --> idle - a = nullptr; // QK idle loop - - QS_BEGIN_PRE_(QP::QS_SCHED_IDLE, pprev) - QS_TIME_PRE_(); // timestamp - QS_U8_PRE_(pprev); // previous prio. - QS_END_PRE_() -} - -#ifdef QF_ON_CONTEXT_SW -QF_onContextSw(QP::QActive::registry_[pprev], a); -#endif // QF_ON_CONTEXT_SW - -#endif // QF_ON_CONTEXT_SW || Q_SPY - - - - - - - QSchedStatus lockStat_; - - - - - - do { \ - if (QK_ISR_CONTEXT_()) { \ - lockStat_ = 0xFFU; \ - } else { \ - lockStat_ = QK::schedLock((ceil_)); \ - } \ -} while (false) - - - - do { \ - if (lockStat_ != 0xFFU) { \ - QK::schedUnlock(lockStat_); \ - } \ -} while (false) - - - - - - \ - Q_ASSERT_INCRIT(320, (me_)->m_eQueue.m_frontEvt != nullptr) - - - - - - do { \ - QK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - QK_priv_.readySet.update_(&QK_priv_.readySet_dis); \ - if (!QK_ISR_CONTEXT_()) { \ - if (QK_sched_() != 0U) { \ - QK_activate_(); \ - } \ - } \ -} while (false) - - - - - - do { \ - QK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - if (!QK_ISR_CONTEXT_()) { \ - if (QK_sched_() != 0U) { \ - QK_activate_(); \ - } \ - } \ -} while (false) - - - - - - - = std::uint_fast16_t; - - - - {0U}; - - - - - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, !QXK_ISR_CONTEXT_()); - -QSchedStatus stat; // saved lock status to be returned - -// is the lock ceiling being raised? -if (ceiling > QXK_priv_.lockCeil) { - QS_BEGIN_PRE_(QS_SCHED_LOCK, 0U) - QS_TIME_PRE_(); // timestamp - // the previous lock ceiling & new lock ceiling - QS_2U8_PRE_(static_cast<std::uint8_t>(QXK_priv_.lockCeil), - static_cast<std::uint8_t>(ceiling)); - QS_END_PRE_() - - // previous status of the lock - stat = static_cast<QSchedStatus>(QXK_priv_.lockHolder); - stat |= static_cast<QSchedStatus>(QXK_priv_.lockCeil) << 8U; - - // new status of the lock - QXK_priv_.lockHolder = (QXK_priv_.curr != nullptr) - ? QXK_priv_.curr->getPrio() - : 0U; - QXK_priv_.lockCeil = ceiling; -} -else { - stat = 0xFFU; // scheduler not locked -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return stat; // return the status to be saved in a stack variable - - - - noexcept - - - // has the scheduler been actually locked by the last QXK::schedLock()? -if (stat != 0xFFU) { - std::uint8_t const prevCeil = static_cast<std::uint8_t>(stat >> 8U); - QF_CRIT_STAT - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - Q_REQUIRE_INCRIT(200, !QXK_ISR_CONTEXT_()); - Q_REQUIRE_INCRIT(201, QXK_priv_.lockCeil > prevCeil); - - QS_BEGIN_PRE_(QS_SCHED_UNLOCK, 0U) - QS_TIME_PRE_(); // timestamp - // ceiling before unlocking & prio after unlocking - QS_2U8_PRE_(QXK_priv_.lockCeil, prevCeil); - QS_END_PRE_() - - // restore the previous lock ceiling and lock holder - QXK_priv_.lockCeil = prevCeil; - QXK_priv_.lockHolder = (stat & 0xFFU); - - // find if any threads should be run after unlocking the scheduler - if (QXK_sched_() != 0U) { // activation needed? - QXK_activate_(); // synchronously activate basic-thred(s) - } - - QF_MEM_APP(); - QF_CRIT_EXIT(); -} - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(600, QXK_priv_.lockCeil <= QF_MAX_ACTIVE); - -QP::QActive *curr = QXK_priv_.curr; -if (curr == nullptr) { // basic thread? - curr = QP::QActive::registry_[QXK_priv_.actPrio]; -} - -Q_ASSERT_INCRIT(690, curr != nullptr); - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return curr; - - - - - - - - - - - - - - - - - {0U}; - - - - noexcept - - - - - : QActive(Q_STATE_CAST(handler)), - m_timeEvt(this, static_cast<QSignal>(QXK::DELAY_SIG), tickRate) - -m_state.act = nullptr; // mark as extended thread - - - - override - - - - - Q_UNUSED_PAR(e); -Q_UNUSED_PAR(qs_id); -Q_ERROR_INCRIT(110); - - - - override - - - this->init(nullptr, qs_id); - - - - override - - - - - Q_UNUSED_PAR(e); -Q_UNUSED_PAR(qs_id); -Q_ERROR_INCRIT(120); - - - - const noexcept - return &m_timeEvt; - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QXThread * const thr = QXK_PTR_CAST_(QXThread*, QXK_priv_.curr); - -// precondition, this function: -// - must NOT be called from an ISR; -// - number of ticks cannot be zero -// - be called from an extended thread; -// - the thread must NOT be already blocked on any object. -Q_REQUIRE_INCRIT(800, (!QXK_ISR_CONTEXT_()) - && (nTicks != 0U) - && (thr != nullptr) - && (thr->m_temp.obj == nullptr)); -// - the thread must NOT be holding a scheduler lock. -Q_REQUIRE_INCRIT(801, QXK_priv_.lockHolder != thr->m_prio); - -// remember the blocking object -thr->m_temp.obj = QXK_PTR_CAST_(QMState const*, &thr->m_timeEvt); -thr->teArm_(static_cast<enum_t>(QXK::DELAY_SIG), nTicks); -thr->block_(); - -QF_MEM_APP(); -QF_CRIT_EXIT(); -QF_CRIT_EXIT_NOP(); // BLOCK here - -// after unblocking... -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// the blocking object must be the time event -Q_ASSERT_INCRIT(890, thr->m_temp.obj - == QXK_PTR_CAST_(QMState*, &thr->m_timeEvt)); -thr->m_temp.obj = nullptr; // clear - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -// signal of zero means that the time event was posted without -// being canceled. -return (thr->m_timeEvt.sig == 0U); - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -bool wasArmed; -if (m_temp.obj == QXK_PTR_CAST_(QMState*, &m_timeEvt)) { - wasArmed = teDisarm_(); - unblock_(); -} -else { - wasArmed = false; -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return wasArmed; - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QXThread * const thr = QXTHREAD_CAST_(QXK_priv_.curr); - -// precondition, this function: -// - must NOT be called from an ISR; -// - be called from an extended thread; -// - the thread must NOT be already blocked on any object. -Q_REQUIRE_INCRIT(500, (!QXK_ISR_CONTEXT_()) - && (thr != nullptr) - && (thr->m_temp.obj == nullptr)); -// - the thread must NOT be holding a scheduler lock. -Q_REQUIRE_INCRIT(501, QXK_priv_.lockHolder != thr->m_prio); - -// is the queue empty? -if (thr->m_eQueue.m_frontEvt == nullptr) { - - // remember the blocking object (the thread's queue) - thr->m_temp.obj = QXK_PTR_CAST_(QMState*, &thr->m_eQueue); - - thr->teArm_(static_cast<enum_t>(QXK::TIMEOUT_SIG), nTicks); - QXK_priv_.readySet.remove( - static_cast<std::uint_fast8_t>(thr->m_prio)); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - - static_cast<void>(QXK_sched_()); // synchronous scheduling - - QF_MEM_APP(); - QF_CRIT_EXIT(); - QF_CRIT_EXIT_NOP(); // BLOCK here - - // after unblocking... - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - // the blocking object must be this queue - Q_ASSERT_INCRIT(510, thr->m_temp.obj == - QXK_PTR_CAST_(QMState *, &thr->m_eQueue)); - thr->m_temp.obj = nullptr; // clear -} - -// is the queue not empty? -QEvt const *e; -if (thr->m_eQueue.m_frontEvt != nullptr) { - e = thr->m_eQueue.m_frontEvt; // remove from the front - QEQueueCtr const nFree = thr->m_eQueue.m_nFree + 1U; - thr->m_eQueue.m_nFree = nFree; // update the # free - - // any events in the ring buffer? - if (nFree <= thr->m_eQueue.m_end) { - - // remove event from the tail - thr->m_eQueue.m_frontEvt = - thr->m_eQueue.m_ring[thr->m_eQueue.m_tail]; - if (thr->m_eQueue.m_tail == 0U) { - thr->m_eQueue.m_tail = thr->m_eQueue.m_end; // wrap - } - // advance the tail (counter clockwise) - thr->m_eQueue.m_tail = (thr->m_eQueue.m_tail - 1U); - - QS_BEGIN_PRE_(QS_QF_ACTIVE_GET, thr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(&thr); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(nFree); // # free entries - QS_END_PRE_() - } - else { - thr->m_eQueue.m_frontEvt = nullptr; // empty queue - - // all entries in the queue must be free (+1 for fronEvt) - Q_ASSERT_INCRIT(520, nFree == (thr->m_eQueue.m_end + 1U)); - - QS_BEGIN_PRE_(QS_QF_ACTIVE_GET_LAST, thr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(&thr); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_END_PRE_() - } -} -else { // the queue is still empty -- the timeout must have fired - e = nullptr; -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return e; - - - - const noexcept - // NOTE: must be called IN a critical section - -Q_REQUIRE_INCRIT(600, (QXK_priv_.lockHolder != m_prio)); - -QXK_priv_.readySet.remove(static_cast<std::uint_fast8_t>(m_prio)); -#ifndef Q_UNSAFE -QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - -static_cast<void>(QXK_sched_()); // schedule other threads - - - - const noexcept - // NOTE: must be called IN a critical section - -QXK_priv_.readySet.insert(static_cast<std::uint_fast8_t>(m_prio)); -#ifndef Q_UNSAFE -QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - -if ((!QXK_ISR_CONTEXT_()) // not inside ISR? - && (QActive::registry_[0] != nullptr)) // kernel started? -{ - static_cast<void>(QXK_sched_()); // schedule other threads -} - - - - - - // NOTE: must be called IN a critical section - -// the private time event is now disarmed and not in any queue, -// so it is safe to change its signal. The signal of 0 means -// that the time event has expired. -QXTHREAD_CAST_(act)->m_timeEvt.sig = 0U; - -QXTHREAD_CAST_(act)->unblock_(); - - - - noexcept - - - - - // NOTE: must be called IN a critical section - -// precondition: -// - the time event must be unused -Q_REQUIRE_INCRIT(700, m_timeEvt.m_ctr == 0U); - -m_timeEvt.sig = static_cast<QSignal>(sig); - -if (nTicks != QXTHREAD_NO_TIMEOUT) { - m_timeEvt.m_ctr = static_cast<QTimeEvtCtr>(nTicks); - m_timeEvt.m_interval = 0U; - - // is the time event unlinked? - // NOTE: For the duration of a single clock tick of the specified tick - // rate a time event can be disarmed and yet still linked in the list, - // because un-linking is performed exclusively in QTimeEvt::tickX(). - if (static_cast<std::uint8_t>(m_timeEvt.refCtr_ & TE_IS_LINKED) == 0U) - { - std::uint_fast8_t const tickRate = - static_cast<std::uint_fast8_t>(m_timeEvt.refCtr_); - Q_ASSERT_INCRIT(710, tickRate < QF_MAX_TICK_RATE); - - // mark as linked - m_timeEvt.refCtr_ = static_cast<std::uint8_t>( - m_timeEvt.refCtr_ | TE_IS_LINKED); - - // The time event is initially inserted into the separate - // "freshly armed" list based on timeEvtHead_[tickRate].act. - // Only later, inside QTimeEvt::tick(), the "freshly armed" - // list is appended to the main list of armed time events based on - // timeEvtHead_[tickRate].next. Again, this is to keep any - // changes to the main list exclusively inside QTimeEvt::tick(). - m_timeEvt.m_next - = QXK_PTR_CAST_(QTimeEvt*, - QTimeEvt::timeEvtHead_[tickRate].m_act); - QTimeEvt::timeEvtHead_[tickRate].m_act = &m_timeEvt; - } -} - - - - noexcept - // NOTE: must be called IN a critical section - -bool wasArmed; -// is the time evt running? -if (m_timeEvt.m_ctr != 0U) { - wasArmed = true; - // schedule removal from list - m_timeEvt.m_ctr = 0U; -} -// the time event was already automatically disarmed -else { - wasArmed = false; -} -return wasArmed; - - - - noexcept - - - - - - - - - - - - - - - - - - - noexcept - - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, (count <= max_count) - && (0U < max_count) && (max_count <= 0xFFU)); - -m_count = static_cast<std::uint8_t>(count); -m_max_count = static_cast<std::uint8_t>(max_count); -m_waitSet.setEmpty(); - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QXThread * const curr = QXK_PTR_CAST_(QXThread*, QXK_priv_.curr); - -// precondition, this function: -// - must NOT be called from an ISR; -// - the semaphore must be initialized -// - be called from an extended thread; -// - the thread must NOT be already blocked on any object. -Q_REQUIRE_INCRIT(200, (!QXK_ISR_CONTEXT_()) - && (m_max_count > 0U) - && (curr != nullptr) - && (curr->m_temp.obj == nullptr)); -// - the thread must NOT be holding a scheduler lock. -Q_REQUIRE_INCRIT(201, QXK_priv_.lockHolder != curr->m_prio); - -bool taken = true; // assume that the semaphore will be signaled -if (m_count > 0U) { - m_count = m_count - 1U; // semaphore taken: decrement the count - - QS_BEGIN_PRE_(QS_SEM_TAKE, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(curr->m_prio, m_count); - QS_END_PRE_() -} -else { // semaphore not available -- BLOCK the thread - std::uint_fast8_t const p = - static_cast<std::uint_fast8_t>(curr->m_prio); - // remove the curr prio from the ready set (will block) - // and insert to the waiting set on this semaphore - QXK_priv_.readySet.remove(p); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - m_waitSet.insert(p); - - // remember the blocking object (this semaphore) - curr->m_temp.obj = QXK_PTR_CAST_(QMState*, this); - curr->teArm_(static_cast<enum_t>(QXK::TIMEOUT_SIG), nTicks); - - QS_BEGIN_PRE_(QS_SEM_BLOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(curr->m_prio, m_count); - QS_END_PRE_() - - // schedule the next thread if multitasking started - static_cast<void>(QXK_sched_()); // schedule other threads - - QF_MEM_APP(); - QF_CRIT_EXIT(); - QF_CRIT_EXIT_NOP(); // BLOCK here !!! - - QF_CRIT_ENTRY(); // AFTER unblocking... - QF_MEM_SYS(); - - // the blocking object must be this semaphore - Q_ASSERT_INCRIT(240, curr->m_temp.obj - == QXK_PTR_CAST_(QMState*, this)); - - // did the blocking time-out? (signal of zero means that it did) - if (curr->m_timeEvt.sig == 0U) { - if (m_waitSet.hasElement(p)) { // still waiting? - m_waitSet.remove(p); // remove unblocked thread - taken = false; // the semaphore was NOT taken - } - } - else { // blocking did NOT time out - // the thread must NOT be waiting on this semaphore - Q_ASSERT_INCRIT(250, !m_waitSet.hasElement(p)); - } - curr->m_temp.obj = nullptr; // clear blocking obj. -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return taken; - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// precondition: -// - the semaphore must be initialized -Q_REQUIRE_INCRIT(300, m_max_count > 0U); - -#ifdef Q_SPY -QActive const * const curr = QXK_PTR_CAST_(QActive*, QXK_priv_.curr); -#endif // Q_SPY - -bool taken; -// is the semaphore available? -if (m_count > 0U) { - m_count = m_count - 1U; // semaphore signaled: decrement - taken = true; - - QS_BEGIN_PRE_(QS_SEM_TAKE, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(curr->m_prio, m_count); - QS_END_PRE_() -} -else { // the semaphore is NOT available (would block) - taken = false; - - QS_BEGIN_PRE_(QS_SEM_BLOCK_ATTEMPT, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(curr->m_prio, m_count); - QS_END_PRE_() -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return taken; - - - - noexcept - bool signaled = true; // assume that the semaphore will be signaled - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// precondition: -// - the semaphore must be initialized -Q_REQUIRE_INCRIT(400, m_max_count > 0U); - -// any threads blocked on this semaphore? -if (m_waitSet.notEmpty()) { - // find the highest-prio. thread waiting on this semaphore - std::uint_fast8_t const p = m_waitSet.findMax(); - QXThread * const thr = - QXK_PTR_CAST_(QXThread*, QActive::registry_[p]); - - // assert that the thread: - // - must be registered in QF; - // - must be extended; and - // - must be blocked on this semaphore; - Q_ASSERT_INCRIT(410, (thr != nullptr) - && (thr->m_osObject != nullptr) - && (thr->m_temp.obj - == QXK_PTR_CAST_(QMState*, this))); - - // disarm the internal time event - static_cast<void>(thr->teDisarm_()); - - // make the thread ready to run and remove from the wait-list - QXK_priv_.readySet.insert(p); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - m_waitSet.remove(p); - - QS_BEGIN_PRE_(QS_SEM_TAKE, thr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(thr->m_prio, m_count); - QS_END_PRE_() - - if (!QXK_ISR_CONTEXT_()) { // not inside ISR? - static_cast<void>(QXK_sched_()); // schedule other threads - } -} -else if (m_count < m_max_count) { - m_count = m_count + 1U; // semaphore signaled: increment - - QS_BEGIN_PRE_(QS_SEM_SIGNAL, 0U) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this semaphore - QS_2U8_PRE_(0U, m_count); - QS_END_PRE_() -} -else { - signaled = false; // semaphore NOT signaled -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return signaled; - - - - - - - - - - - : m_ao(Q_STATE_CAST(0)) - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -Q_REQUIRE_INCRIT(100, (prioSpec & 0xFF00U) == 0U); - -m_ao.m_prio = static_cast<std::uint8_t>(prioSpec & 0xFFU); // QF-prio. -m_ao.m_pthre = 0U; // not used -QActive &ao = m_ao; - -QF_MEM_APP(); -QF_CRIT_EXIT(); - -ao.register_(); // register this mutex as AO - - - - noexcept - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QXThread * const curr = QXK_PTR_CAST_(QXThread*, QXK_priv_.curr); - -// precondition, this mutex operation must: -// - NOT be called from an ISR; -// - be called from an eXtended thread; -// - the mutex-prio. must be in range; -// - the thread must NOT be already blocked on any object. -Q_REQUIRE_INCRIT(200, (!QXK_ISR_CONTEXT_()) - && (curr != nullptr) - && (m_ao.m_prio <= QF_MAX_ACTIVE) - && (curr->m_temp.obj == nullptr)); -// also: the thread must NOT be holding a scheduler lock. -Q_REQUIRE_INCRIT(201, QXK_priv_.lockHolder != curr->m_prio); - -// is the mutex available? -bool locked = true; // assume that the mutex will be locked -if (m_ao.m_eQueue.m_nFree == 0U) { - m_ao.m_eQueue.m_nFree = 1U; // mutex lock nesting - - // also: the newly locked mutex must have no holder yet - Q_REQUIRE_INCRIT(203, m_ao.m_osObject == nullptr); - - // set the new mutex holder to the curr thread and - // save the thread's prio in the mutex - // NOTE: reuse the otherwise unused eQueue data member. - m_ao.m_osObject = curr; - m_ao.m_eQueue.m_head = static_cast<QEQueueCtr>(curr->m_prio); - - QS_BEGIN_PRE_(QS_MTX_LOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the holder prio. must be lower than that of the mutex - // and the prio. slot must be occupied by this mutex - Q_ASSERT_INCRIT(210, (curr->m_prio < m_ao.m_prio) - && (QActive::registry_[m_ao.m_prio] == &m_ao)); - - // remove the thread's original prio from the ready set - // and insert the mutex's prio into the ready set - QXK_priv_.readySet.remove( - static_cast<std::uint_fast8_t>(m_ao.m_eQueue.m_head)); - QXK_priv_.readySet.insert( - static_cast<std::uint_fast8_t>(m_ao.m_prio)); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - // put the thread into the AO registry in place of the mutex - QActive::registry_[m_ao.m_prio] = curr; - - // set thread's prio to that of the mutex - curr->m_prio = m_ao.m_prio; -#ifndef Q_UNSAFE - curr->m_prio_dis = static_cast<std::uint8_t>(~curr->m_prio); -#endif - } -} -// is the mutex locked by this thread already (nested locking)? -else if (m_ao.m_osObject == curr) { - - // the nesting level beyond the arbitrary but high limit - // most likely means cyclic or recursive locking of a mutex. - Q_ASSERT_INCRIT(220, m_ao.m_eQueue.m_nFree < 0xFFU); - - // lock one more level - m_ao.m_eQueue.m_nFree = m_ao.m_eQueue.m_nFree + 1U; - - QS_BEGIN_PRE_(QS_MTX_LOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() -} -else { // the mutex is already locked by a different thread - // the mutex holder must be valid - Q_ASSERT_INCRIT(230, m_ao.m_osObject != nullptr); - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the prio slot must be occupied by the thr. holding the mutex - Q_ASSERT_INCRIT(240, QActive::registry_[m_ao.m_prio] - == QXK_PTR_CAST_(QActive const *, m_ao.m_osObject)); - } - - // remove the curr thread's prio from the ready set (will block) - // and insert it to the waiting set on this mutex - std::uint_fast8_t const p = - static_cast<std::uint_fast8_t>(curr->m_prio); - QXK_priv_.readySet.remove(p); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - m_waitSet.insert(p); - - // set the blocking object (this mutex) - curr->m_temp.obj = QXK_PTR_CAST_(QMState*, this); - curr->teArm_(static_cast<enum_t>(QXK::TIMEOUT_SIG), nTicks); - - QS_BEGIN_PRE_(QS_MTX_BLOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_2U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head), - curr->m_prio); - QS_END_PRE_() - - // schedule the next thread if multitasking started - static_cast<void>(QXK_sched_()); // schedule other threads - - QF_MEM_APP(); - QF_CRIT_EXIT(); - QF_CRIT_EXIT_NOP(); // BLOCK here !!! - - // AFTER unblocking... - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - // the blocking object must be this mutex - Q_ASSERT_INCRIT(250, curr->m_temp.obj - == QXK_PTR_CAST_(QMState*, this)); - - // did the blocking time-out? (signal of zero means that it did) - if (curr->m_timeEvt.sig == 0U) { - if (m_waitSet.hasElement(p)) { // still waiting? - m_waitSet.remove(p); // remove unblocked thread - locked = false; // the mutex was NOT locked - } - } - else { // blocking did NOT time out - // the thread must NOT be waiting on this mutex - Q_ASSERT_INCRIT(260, !m_waitSet.hasElement(p)); - } - curr->m_temp.obj = nullptr; // clear blocking obj. -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return locked; - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QActive *curr = QXK_priv_.curr; -if (curr == nullptr) { // called from a basic thread? - curr = QActive::registry_[QXK_priv_.actPrio]; -} - -// precondition, this mutex must: -// - NOT be called from an ISR; -// - the calling thread must be valid; -// - the mutex-prio. must be in range -Q_REQUIRE_INCRIT(300, (!QXK_ISR_CONTEXT_()) - && (curr != nullptr) - && (m_ao.m_prio <= QF_MAX_ACTIVE)); -// also: the thread must NOT be holding a scheduler lock. -Q_REQUIRE_INCRIT(301, - QXK_priv_.lockHolder != static_cast<std::uint_fast8_t>(curr->m_prio)); - -// is the mutex available? -if (m_ao.m_eQueue.m_nFree == 0U) { - m_ao.m_eQueue.m_nFree = 1U; // mutex lock nesting - - // also the newly locked mutex must have no holder yet - Q_REQUIRE_INCRIT(303, m_ao.m_osObject == nullptr); - - // set the new mutex holder to the curr thread and - // save the thread's prio in the mutex - // NOTE: reuse the otherwise unused eQueue data member. - m_ao.m_osObject = curr; - m_ao.m_eQueue.m_head = static_cast<QEQueueCtr>(curr->m_prio); - - QS_BEGIN_PRE_(QS_MTX_LOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the holder prio. must be lower than that of the mutex - // and the prio. slot must be occupied by this mutex - Q_ASSERT_INCRIT(310, (curr->m_prio < m_ao.m_prio) - && (QActive::registry_[m_ao.m_prio] == &m_ao)); - - // remove the thread's original prio from the ready set - // and insert the mutex's prio into the ready set - QXK_priv_.readySet.remove( - static_cast<std::uint_fast8_t>(m_ao.m_eQueue.m_head)); - QXK_priv_.readySet.insert( - static_cast<std::uint_fast8_t>(m_ao.m_prio)); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - // put the thread into the AO registry in place of the mutex - QActive::registry_[m_ao.m_prio] = curr; - - // set thread's prio to that of the mutex - curr->m_prio = m_ao.m_prio; -#ifndef Q_UNSAFE - curr->m_prio_dis = static_cast<std::uint8_t>(~curr->m_prio); -#endif - } -} -// is the mutex locked by this thread already (nested locking)? -else if (m_ao.m_osObject == curr) { - // the nesting level must not exceed the specified limit - Q_ASSERT_INCRIT(320, m_ao.m_eQueue.m_nFree < 0xFFU); - - // lock one more level - m_ao.m_eQueue.m_nFree = m_ao.m_eQueue.m_nFree + 1U; - - QS_BEGIN_PRE_(QS_MTX_LOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() -} -else { // the mutex is already locked by a different thread - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the prio slot must be occupied by the thr. holding the mutex - Q_ASSERT_INCRIT(330, QActive::registry_[m_ao.m_prio] - == QXK_PTR_CAST_(QActive const *, m_ao.m_osObject)); - } - - QS_BEGIN_PRE_(QS_MTX_BLOCK_ATTEMPT, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_2U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head), - curr->m_prio); // trying thread prio - QS_END_PRE_() - - curr = nullptr; // means that mutex is NOT available -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -return curr != nullptr; - - - - noexcept - QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -QActive *curr = QXK_priv_.curr; -if (curr == nullptr) { // called from a basic thread? - curr = QActive::registry_[QXK_priv_.actPrio]; -} - -Q_REQUIRE_INCRIT(400, (!QXK_ISR_CONTEXT_()) - && (curr != nullptr)); -Q_REQUIRE_INCRIT(401, m_ao.m_eQueue.m_nFree > 0U); -Q_REQUIRE_INCRIT(403, m_ao.m_osObject == curr); - -// is this the last nesting level? -if (m_ao.m_eQueue.m_nFree == 1U) { - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - - Q_ASSERT_INCRIT(410, m_ao.m_prio < QF_MAX_ACTIVE); - - // restore the holding thread's prio from the mutex - curr->m_prio = - static_cast<std::uint8_t>(m_ao.m_eQueue.m_head); -#ifndef Q_UNSAFE - curr->m_prio_dis = static_cast<std::uint8_t>(~curr->m_prio); -#endif - - // put the mutex back into the AO registry - QActive::registry_[m_ao.m_prio] = &m_ao; - - // remove the mutex' prio from the ready set - // and insert the original thread's prio. - QXK_priv_.readySet.remove( - static_cast<std::uint_fast8_t>(m_ao.m_prio)); - QXK_priv_.readySet.insert( - static_cast<std::uint_fast8_t>(m_ao.m_eQueue.m_head)); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - } - - QS_BEGIN_PRE_(QS_MTX_UNLOCK, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_2U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head), - 0U); - QS_END_PRE_() - - // are any other threads waiting on this mutex? - if (m_waitSet.notEmpty()) { - // find the highest-prio. thread waiting on this mutex - std::uint_fast8_t const p = m_waitSet.findMax(); - - // remove this thread from waiting on the mutex - // and insert it into the ready set. - m_waitSet.remove(p); - QXK_priv_.readySet.insert(p); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - - QXThread * const thr = - QXK_PTR_CAST_(QXThread*, QActive::registry_[p]); - - // the waiting thread must: - // - be registered in QF - // - have the prio. corresponding to the registration - // - be an extended thread - // - be blocked on this mutex - Q_ASSERT_INCRIT(420, (thr != nullptr) - && (thr->m_prio == static_cast<std::uint8_t>(p)) - && (thr->m_state.act == Q_ACTION_CAST(0)) - && (thr->m_temp.obj == QXK_PTR_CAST_(QMState*, this))); - - // disarm the internal time event - static_cast<void>(thr->teDisarm_()); - - // set the new mutex holder to the curr thread and - // save the thread's prio in the mutex - // NOTE: reuse the otherwise unused eQueue data member. - m_ao.m_osObject = thr; - m_ao.m_eQueue.m_head = static_cast<QEQueueCtr>(thr->m_prio); - - QS_BEGIN_PRE_(QS_MTX_LOCK, thr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the holder prio. must be lower than that of the mutex - Q_ASSERT_INCRIT(430, (m_ao.m_prio < QF_MAX_ACTIVE) - && (thr->m_prio < m_ao.m_prio)); - - // put the thread into AO registry in place of the mutex - QActive::registry_[m_ao.m_prio] = thr; - } - } - else { // no threads are waiting for this mutex - m_ao.m_eQueue.m_nFree = 0U; // free up the nesting count - - // the mutex no longer held by any thread - m_ao.m_osObject = nullptr; - m_ao.m_eQueue.m_head = 0U; - m_ao.m_eQueue.m_tail = 0U; - - if (m_ao.m_prio != 0U) { // prio.-ceiling protocol used? - // the AO priority must be in range - Q_ASSERT_INCRIT(440, m_ao.m_prio < QF_MAX_ACTIVE); - - // put the mutex back at the original mutex slot - QActive::registry_[m_ao.m_prio] = &m_ao; - } - } - - // schedule the next thread if multitasking started - if (QXK_sched_() != 0U) { // activation needed? - QXK_activate_(); // synchronously activate basic-thred(s) - } -} -else { // releasing one level of nested mutex lock - // unlock one level - m_ao.m_eQueue.m_nFree = m_ao.m_eQueue.m_nFree - 1U; - - QS_BEGIN_PRE_(QS_MTX_UNLOCK_ATTEMPT, curr->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(this); // this mutex - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_head)); - QS_U8_PRE_(static_cast<std::uint8_t>(m_ao.m_eQueue.m_nFree)); - QS_END_PRE_() -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - bzero_(&QF::priv_, sizeof(QF::priv_)); -bzero_(&QXK_priv_, sizeof(QXK_priv_)); -bzero_(&QActive::registry_[0], sizeof(QActive::registry_)); - -#ifndef Q_UNSAFE -QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - -// setup the QXK scheduler as initially locked and not running -QXK_priv_.lockCeil = (QF_MAX_ACTIVE + 1U); // scheduler locked - -// storage capable for holding a blank QActive object (const in ROM) -static void* const - idle_ao[((sizeof(QActive) + sizeof(void*)) - 1U) / sizeof(void*)] - = { nullptr }; - -// register the idle AO object (cast 'const' away) -QActive::registry_[0] = QF_CONST_CAST_(QActive*, - reinterpret_cast<QActive const*>(idle_ao)); - -#ifdef QXK_INIT -QXK_INIT(); // port-specific initialization of the QXK kernel -#endif - - - - onCleanup(); // cleanup callback -// nothing else to do for the QXK preemptive kernel - - - - #ifdef Q_SPY -QS_SIG_DICTIONARY(QXK::DELAY_SIG, nullptr); -QS_SIG_DICTIONARY(QXK::TIMEOUT_SIG, nullptr); - -// produce the QS_QF_RUN trace record -QF_INT_DISABLE(); -QF_MEM_SYS(); -QS::beginRec_(QS_REC_NUM_(QS_QF_RUN)); -QS::endRec_(); -QF_MEM_APP(); -QF_INT_ENABLE(); -#endif // Q_SPY - -onStartup(); // application-specific startup callback - -QF_INT_DISABLE(); -QF_MEM_SYS(); - -#ifdef QXK_START -QXK_START(); // port-specific startup of the QXK kernel -#endif - -QXK_priv_.lockCeil = 0U; // unlock the QXK scheduler - -// activate AOs to process events posted so far -if (QXK_sched_() != 0U) { - QXK_activate_(); -} - -QF_MEM_APP(); -QF_INT_ENABLE(); - -for (;;) { // QXK idle loop... - QXK::onIdle(); // application-specific QXK idle callback -} - -#ifdef __GNUC__ // GNU compiler? -return 0; -#endif - - - - - - - - - - - - - - - - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); -Q_REQUIRE_INCRIT(300, (!QXK_ISR_CONTEXT_()) - && ((prioSpec & 0xFF00U) == 0U)); -QF_CRIT_EXIT(); - -m_prio = static_cast<std::uint8_t>(prioSpec & 0xFFU); // QF-prio. -m_pthre = 0U; // not used -register_(); // make QF aware of this QActive/QXThread - -if (stkSto == nullptr) { // starting basic thread (AO)? - m_eQueue.init(qSto, qLen); // init the built-in queue - m_osObject = nullptr; // no private stack for AO - - this->init(par, m_prio); // top-most initial tran. (virtual call) - QS_FLUSH(); // flush the trace buffer to the host - - // see if this AO needs to be scheduled if QXK is already running - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - if (QXK_priv_.lockCeil <= QF_MAX_ACTIVE) { // scheduler running? - if (QXK_sched_() != 0U) { // activation needed? - QXK_activate_(); // synchronously activate basic-thred(s) - } - } - QF_MEM_APP(); - QF_CRIT_EXIT(); -} -else { // starting QXThread - - // is storage for the queue buffer provided? - if (qSto != nullptr) { - m_eQueue.init(qSto, qLen); - } - - // extended threads provide their thread function in place of - // the top-most initial tran. 'm_temp.act' - QXK_PTR_CAST_(QXThread*, this)->stackInit_(m_temp.thr, - stkSto, stkSize); - - // the new thread is not blocked on any object - m_temp.obj = nullptr; - - QF_CRIT_ENTRY(); - QF_MEM_SYS(); - - // extended-thread becomes ready immediately - QXK_priv_.readySet.insert(static_cast<std::uint_fast8_t>(m_prio)); - #ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); - #endif - - // see if this thread needs to be scheduled in case QXK is running - if (QXK_priv_.lockCeil <= QF_MAX_ACTIVE) { - static_cast<void>(QXK_sched_()); // schedule other threads - } - QF_MEM_APP(); - QF_CRIT_EXIT(); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - noexcept - Q_REQUIRE_INCRIT(402, - QXK_priv_.readySet.verify_(&QXK_priv_.readySet_dis)); - -std::uint_fast8_t p; -if (QXK_priv_.readySet.isEmpty()) { - p = 0U; // no activation needed -} -else { - // find the highest-prio thread ready to run - p = QXK_priv_.readySet.findMax(); - if (p <= QXK_priv_.lockCeil) { - // prio. of the thread holding the lock - p = static_cast<std::uint_fast8_t>( - QP::QActive::registry_[QXK_priv_.lockHolder]->getPrio()); - if (p != 0U) { - Q_ASSERT_INCRIT(410, QXK_priv_.readySet.hasElement(p)); - } - } -} -QP::QActive const * const curr = QXK_priv_.curr; -QP::QActive * const next = QP::QActive::registry_[p]; - -// the next thread found must be registered in QF -Q_ASSERT_INCRIT(420, next != nullptr); - -// is the current thread a basic-thread? -if (curr == nullptr) { - - // is the new prio. above the active prio.? - if (p > QXK_priv_.actPrio) { - QXK_priv_.next = next; // set the next AO to activate - - if (next->getOsObject() != nullptr) { // is next extended? - QXK_CONTEXT_SWITCH_(); - p = 0U; // no activation needed - } - } - else { // below the active prio. - QXK_priv_.next = nullptr; - p = 0U; // no activation needed - } -} -else { // currently executing an extended-thread - // is the current thread different from the next? - if (curr != next) { - QXK_priv_.next = next; - QXK_CONTEXT_SWITCH_(); - } - else { // current is the same as next - QXK_priv_.next = nullptr; // no need to context-switch - } - p = 0U; // no activation needed -} - -return p; - - - - noexcept - std::uint_fast8_t const prio_in = QXK_priv_.actPrio; -QP::QActive *next = QXK_priv_.next; // the next AO (basic-thread) to run - -Q_REQUIRE_INCRIT(500, (next != nullptr) && (prio_in <= QF_MAX_ACTIVE)); - -// QXK Context switch callback defined or QS tracing enabled? -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) -QXK_contextSw_(next); -#endif // QF_ON_CONTEXT_SW || Q_SPY - -QXK_priv_.next = nullptr; // clear the next AO -QXK_priv_.curr = nullptr; // current is basic-thread - -// prio. of the next thread -std::uint_fast8_t p = next->getPrio(); - -// loop until no more ready-to-run AOs of higher prio than the initial -do { - QXK_priv_.actPrio = p; // next active prio - - QF_INT_ENABLE(); // unconditionally enable interrupts - - QP::QEvt const * const e = next->get_(); - // NOTE QActive::get_() performs QS_MEM_APP() before return - - // dispatch event (virtual call) - next->dispatch(e, next->getPrio()); -#if (QF_MAX_EPOOL > 0U) - QP::QF::gc(e); -#endif - - QF_INT_DISABLE(); // unconditionally disable interrupts - QF_MEM_SYS(); - - // check internal integrity (duplicate inverse storage) - Q_ASSERT_INCRIT(502, - QXK_priv_.readySet.verify_(&QXK_priv_.readySet_dis)); - - if (next->getEQueue().isEmpty()) { // empty queue? - QXK_priv_.readySet.remove(p); -#ifndef Q_UNSAFE - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - } - - if (QXK_priv_.readySet.isEmpty()) { - QXK_priv_.next = nullptr; - next = QP::QActive::registry_[0]; - p = 0U; // no activation needed - } - else { - // find next highest-prio below the lock ceiling - p = QXK_priv_.readySet.findMax(); - if (p <= QXK_priv_.lockCeil) { - p = QXK_priv_.lockHolder; - if (p != 0U) { - Q_ASSERT_INCRIT(510, QXK_priv_.readySet.hasElement(p)); - } - } - - // set the next thread and ensure that it is registered - next = QP::QActive::registry_[p]; - Q_ASSERT_INCRIT(520, next != nullptr); - - // is next a basic thread? - if (next->getOsObject() == nullptr) { - // is the next prio. above the initial prio.? - if (p > QP::QActive::registry_[prio_in]->getPrio()) { -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) - if (p != QXK_priv_.actPrio) { // changing threads? - QXK_contextSw_(next); - } -#endif // QF_ON_CONTEXT_SW || Q_SPY - QXK_priv_.next = next; - } - else { - QXK_priv_.next = nullptr; - p = 0U; // no activation needed - } - } - else { // next is the extended-thread - QXK_priv_.next = next; - QXK_CONTEXT_SWITCH_(); - p = 0U; // no activation needed - } - } -} while (p != 0U); // while activation needed - -// restore the active prio. -QXK_priv_.actPrio = prio_in; - -#if (defined QF_ON_CONTEXT_SW) || (defined Q_SPY) -if (next->getOsObject() == nullptr) { - QXK_contextSw_((prio_in == 0U) - ? nullptr - : QP::QActive::registry_[prio_in]); -} -#endif // QF_ON_CONTEXT_SW || Q_SPY - - - - - - #ifdef Q_SPY -std::uint_fast8_t const prev_prio = (QXK_priv_.prev != nullptr) - ? QXK_priv_.prev->getPrio() - : 0U; -if (next != nullptr) { // next is NOT idle? - std::uint_fast8_t const next_prio = next->getPrio(); - QS_BEGIN_PRE_(QP::QS_SCHED_NEXT, next_prio) - QS_TIME_PRE_(); // timestamp - QS_2U8_PRE_(next_prio, prev_prio); - QS_END_PRE_() -} -else { // going to idle - QS_BEGIN_PRE_(QP::QS_SCHED_IDLE, prev_prio) - QS_TIME_PRE_(); // timestamp - QS_U8_PRE_(prev_prio); - QS_END_PRE_() -} -#endif // Q_SPY - -#ifdef QF_ON_CONTEXT_SW -QF_onContextSw(QXK_priv_.prev, next); -#endif // QF_ON_CONTEXT_SW - -QXK_priv_.prev = next; // update the previous thread - - - - QF_CRIT_STAT -QF_CRIT_ENTRY(); - -QP::QXThread const * const thr = QXTHREAD_CAST_(QXK_priv_.curr); - -Q_REQUIRE_INCRIT(900, (!QXK_ISR_CONTEXT_()) - && (thr != nullptr)); // current thread must be extended -Q_REQUIRE_INCRIT(901, QXK_priv_.lockHolder != thr->getPrio()); - -std::uint_fast8_t const p = - static_cast<std::uint_fast8_t>(thr->getPrio()); - -QF_MEM_SYS(); -QP::QActive::registry_[p] = nullptr; -QXK_priv_.readySet.remove(p); -#ifndef Q_UNSAFE -QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); -#endif - -static_cast<void>(QXK_sched_()); // schedule other threads - -QF_MEM_APP(); -QF_CRIT_EXIT(); - - - - - - - QSchedStatus lockStat_; - - - - - - do { \ - if (QXK_ISR_CONTEXT_()) { \ - lockStat_ = 0xFFU; \ - } else { \ - lockStat_ = QXK::schedLock((ceil_)); \ - } \ -} while (false) - - - - do { \ - if (lockStat_ != 0xFFU) { \ - QXK::schedUnlock(lockStat_); \ - } \ -} while (false) - - - - // QXK native event queue waiting - - - \ - Q_ASSERT_INCRIT(310, (me_)->m_eQueue.m_frontEvt != nullptr) - - - - // QXK native event queue signalling - - - do { \ - QXK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); \ - if (!QXK_ISR_CONTEXT_()) { \ - if (QXK_sched_() != 0U) { \ - QXK_activate_(); \ - } \ - } \ -} while (false) - - - - // QXK native event queue signalling - - - do { \ - QXK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - if (!QXK_ISR_CONTEXT_()) { \ - if (QXK_sched_() != 0U) { \ - QXK_activate_(); \ - } \ - } \ -} while (false) - - - - - - do { \ - if ((me_)->m_temp.obj == QXK_PTR_CAST_(QMState*, &(me_)->m_eQueue)) { \ - static_cast<void>(QXTHREAD_CAST_(me_)->teDisarm_()); \ - QXK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - QXK_priv_.readySet.update_(&QXK_priv_.readySet_dis); \ - if (!QXK_ISR_CONTEXT_()) { \ - static_cast<void>(QXK_sched_()); \ - } \ - } \ -} while (false) - - - - - - do { \ - if ((me_)->m_temp.obj == QXK_PTR_CAST_(QMState*, &(me_)->m_eQueue)) { \ - static_cast<void>(QXTHREAD_CAST_(me_)->teDisarm_()); \ - QXK_priv_.readySet.insert( \ - static_cast<std::uint_fast8_t>((me_)->m_prio)); \ - if (!QXK_ISR_CONTEXT_()) { \ - static_cast<void>(QXK_sched_()); \ - } \ - } \ -} while (false) - - - - - - (static_cast<QP::QXThread *>(ptr_)) - - - - <type_> - - - - - (reinterpret_cast<type_>(ptr_)) - - - - - - - - - //! pre-defined QS record IDs - : std::int8_t { - // [0] QS session (not maskable) - QS_EMPTY, //!< QS record for cleanly starting a session - - // [1] SM records - QS_QEP_STATE_ENTRY, //!< a state was entered - QS_QEP_STATE_EXIT, //!< a state was exited - QS_QEP_STATE_INIT, //!< an initial transition was taken in a state - QS_QEP_INIT_TRAN, //!< the top-most initial transition was taken - QS_QEP_INTERN_TRAN, //!< an internal transition was taken - QS_QEP_TRAN, //!< a regular transition was taken - QS_QEP_IGNORED, //!< an event was ignored (silently discarded) - QS_QEP_DISPATCH, //!< an event was dispatched (begin of RTC step) - QS_QEP_UNHANDLED, //!< an event was un-handled due to a guard - - // [10] Active Object (AO) records - QS_QF_ACTIVE_DEFER, //!< AO deferred an event - QS_QF_ACTIVE_RECALL, //!< AO recalled an event - QS_QF_ACTIVE_SUBSCRIBE, //!< an AO subscribed to an event - QS_QF_ACTIVE_UNSUBSCRIBE, //!< an AO unsubscribed to an event - QS_QF_ACTIVE_POST, //!< an event was posted (FIFO) directly to AO - QS_QF_ACTIVE_POST_LIFO, //!< an event was posted (LIFO) directly to AO - QS_QF_ACTIVE_GET, //!< AO got an event and its queue is not empty - QS_QF_ACTIVE_GET_LAST,//!< AO got an event and its queue is empty - QS_QF_ACTIVE_RECALL_ATTEMPT, //!< AO attempted to recall an event - - // [19] Event Queue (EQ) records - QS_QF_EQUEUE_POST, //!< an event was posted (FIFO) to a raw queue - QS_QF_EQUEUE_POST_LIFO, //!< an event was posted (LIFO) to a raw queue - QS_QF_EQUEUE_GET, //!< get an event and queue still not empty - QS_QF_EQUEUE_GET_LAST,//!< get the last event from the queue - - // [23] Framework (QF) records - QS_QF_NEW_ATTEMPT, //!< an attempt to allocate an event failed - - // [24] Memory Pool (MP) records - QS_QF_MPOOL_GET, //!< a memory block was removed from memory pool - QS_QF_MPOOL_PUT, //!< a memory block was returned to memory pool - - // [26] Additional Framework (QF) records - QS_QF_PUBLISH, //!< an event was published to active objects - QS_QF_NEW_REF, //!< new event reference was created - QS_QF_NEW, //!< new event was created - QS_QF_GC_ATTEMPT, //!< garbage collection attempt - QS_QF_GC, //!< garbage collection - QS_QF_TICK, //!< QTimeEvt tick was called - - // [32] Time Event (TE) records - QS_QF_TIMEEVT_ARM, //!< a time event was armed - QS_QF_TIMEEVT_AUTO_DISARM, //!< a time event expired and was disarmed - QS_QF_TIMEEVT_DISARM_ATTEMPT,//!< attempt to disarm a disarmed QTimeEvt - QS_QF_TIMEEVT_DISARM, //!< true disarming of an armed time event - QS_QF_TIMEEVT_REARM, //!< rearming of a time event - QS_QF_TIMEEVT_POST, //!< a time event posted itself directly to an AO - - // [38] Additional Framework (QF) records - QS_QF_DELETE_REF, //!< an event reference is about to be deleted - QS_QF_CRIT_ENTRY, //!< critical section was entered - QS_QF_CRIT_EXIT, //!< critical section was exited - QS_QF_ISR_ENTRY, //!< an ISR was entered - QS_QF_ISR_EXIT, //!< an ISR was exited - QS_QF_INT_DISABLE, //!< interrupts were disabled - QS_QF_INT_ENABLE, //!< interrupts were enabled - - // [45] Additional Active Object (AO) records - QS_QF_ACTIVE_POST_ATTEMPT,//!< attempt to post an evt to AO failed - - // [46] Additional Event Queue (EQ) records - QS_QF_EQUEUE_POST_ATTEMPT,//!< attempt to post evt to QEQueue failed - - // [47] Additional Memory Pool (MP) records - QS_QF_MPOOL_GET_ATTEMPT, //!< attempt to get a memory block failed - - // [48] Scheduler (SC) records - QS_SCHED_PREEMPT, //!< scheduler asynchronously preempted a task - QS_SCHED_RESTORE, //!< scheduler restored preempted task - QS_SCHED_LOCK, //!< scheduler was locked - QS_SCHED_UNLOCK, //!< scheduler was unlocked - QS_SCHED_NEXT, //!< scheduler started next task - QS_SCHED_IDLE, //!< scheduler restored the idle task - - // [54] Miscellaneous QS records (not maskable) - QS_ENUM_DICT, //!< enumeration dictionary entry - - // [55] Additional QEP records - QS_QEP_TRAN_HIST, //!< a tran to history was taken - QS_QEP_TRAN_EP, //!< a tran to entry point into a submachine - QS_QEP_TRAN_XP, //!< a tran to exit point out of a submachine - - // [58] Miscellaneous QS records (not maskable) - QS_TEST_PAUSED, //!< test has been paused - QS_TEST_PROBE_GET, //!< reports that Test-Probe has been used - QS_SIG_DICT, //!< signal dictionary entry - QS_OBJ_DICT, //!< object dictionary entry - QS_FUN_DICT, //!< function dictionary entry - QS_USR_DICT, //!< user QS record dictionary entry - QS_TARGET_INFO, //!< reports the Target information - QS_TARGET_DONE, //!< reports completion of a user callback - QS_RX_STATUS, //!< reports QS data receive status - QS_QUERY_DATA, //!< reports the data from "current object" query - QS_PEEK_DATA, //!< reports the data from the PEEK query - QS_ASSERT_FAIL, //!< assertion failed in the code - QS_QF_RUN, //!< QF_run() was entered - - // [71] Semaphore (SEM) records - QS_SEM_TAKE, //!< a semaphore was taken by a thread - QS_SEM_BLOCK, //!< a semaphore blocked a thread - QS_SEM_SIGNAL, //!< a semaphore was signaled - QS_SEM_BLOCK_ATTEMPT, //!< a semaphore blocked was attempted - - // [75] Mutex (MTX) records - QS_MTX_LOCK, //!< a mutex was locked - QS_MTX_BLOCK, //!< a mutex blocked a thread - QS_MTX_UNLOCK, //!< a mutex was unlocked - QS_MTX_LOCK_ATTEMPT, //!< a mutex lock was attempted - QS_MTX_BLOCK_ATTEMPT, //!< a mutex blocking was attempted - QS_MTX_UNLOCK_ATTEMPT,//!< a mutex unlock was attempted - - // [81] - QS_PRE_MAX //!< the # predefined signals -}; - - - - //! QS-TX record groups for QS_GLB_FILTER() - : std::int16_t { - QS_ALL_RECORDS = 0xF0,//!< all maskable QS records - QS_SM_RECORDS, //!< State Machine QS records - QS_AO_RECORDS, //!< Active Object QS records - QS_EQ_RECORDS, //!< Event Queues QS records - QS_MP_RECORDS, //!< Memory Pools QS records - QS_TE_RECORDS, //!< Time Events QS records - QS_QF_RECORDS, //!< QF QS records - QS_SC_RECORDS, //!< Scheduler QS records - QS_SEM_RECORDS, //!< Semaphore QS records - QS_MTX_RECORDS, //!< Mutex QS records - QS_U0_RECORDS, //!< User Group 100-104 records - QS_U1_RECORDS, //!< User Group 105-109 records - QS_U2_RECORDS, //!< User Group 110-114 records - QS_U3_RECORDS, //!< User Group 115-119 records - QS_U4_RECORDS, //!< User Group 120-124 records - QS_UA_RECORDS //!< All User records -}; - - - - //! QS user record group offsets for QS_GLB_FILTER() - : std::int16_t { - QS_USER = 100, //!< the first record available to QS users - QS_USER0 = QS_USER, //!< offset for User Group 0 - QS_USER1 = QS_USER0 + 5, //!< offset for User Group 1 - QS_USER2 = QS_USER1 + 5, //!< offset for User Group 2 - QS_USER3 = QS_USER2 + 5, //!< offset for User Group 3 - QS_USER4 = QS_USER3 + 5 //!< offset for User Group 4 -}; - - - - //! QS ID offsets for QS_LOC_FILTER() - : std::int16_t { - QS_AO_ID = 0, //!< offset for AO priorities - QS_EP_ID = 64, //!< offset for event-pool IDs - QS_EQ_ID = 80, //!< offset for event-queue IDs - QS_AP_ID = 96 //!< offset for Application-specific IDs -}; - - - - //! QS ID groups for QS_LOC_FILTER() - : std::int16_t { - QS_ALL_IDS = 0xF0, //!< all QS IDs - QS_AO_IDS = 0x80 + QS_AO_ID, //!< AO IDs (priorities) - QS_EP_IDS = 0x80 + QS_EP_ID, //!< event-pool IDs - QS_EQ_IDS = 0x80 + QS_EQ_ID, //!< event-queue IDs - QS_AP_IDS = 0x80 + QS_AP_ID //!< Application-specific IDs -}; - - - - { - std::uint8_t m_prio; //!< prio. (qs_id) for the QS "local filter" - - // get the prio. (qs_id) from the QSpyId object - std::uint_fast8_t getPrio() const noexcept { - return static_cast<std::uint_fast8_t>(m_prio); - } -}; - - - - = void (*)(); - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - = std::uint16_t; - - - - = std::uint32_t; - - - - = std::uint64_t; - - - - - - - - - - - - - - - - - - - //! Enumerates data elements for app-specific trace records - : std::uint8_t { - I8_ENUM_T, //!< signed 8-bit integer or enum format - U8_T, //!< unsigned 8-bit integer format - I16_T, //!< signed 16-bit integer format - U16_T, //!< unsigned 16-bit integer format - I32_T, //!< signed 32-bit integer format - U32_T, //!< unsigned 32-bit integer format - F32_T, //!< 32-bit floating point format - F64_T, //!< 64-bit floating point format - STR_T, //!< zero-terminated ASCII string format - MEM_T, //!< up to 255-bytes memory block format - SIG_T, //!< event signal format - OBJ_T, //!< object pointer format - FUN_T, //!< function pointer format - I64_T, //!< signed 64-bit integer format - U64_T //!< unsigned 64-bit integer format -}; - - - - - - union TCast { - T_IN in; - T_OUT out; -} u = { in }; -return u.out; - - - - noexcept - - - - - priv_.buf = sto; -priv_.end = static_cast<QSCtr>(stoSize); -priv_.head = 0U; -priv_.tail = 0U; -priv_.used = 0U; -priv_.seq = 0U; -priv_.chksum = 0U; -priv_.critNest = 0U; - -glbFilter_(-static_cast<enum_t>(QS_ALL_RECORDS));// all global filters OFF -locFilter_(static_cast<enum_t>(QS_ALL_IDS)); // all local filters ON -priv_.locFilter_AP = nullptr; // deprecated "AP-filter" - -// produce an empty record to "flush" the QS trace buffer -beginRec_(QS_REC_NUM_(QS_EMPTY)); -endRec_(); - -// produce the reset record to inform QSPY of a new session -target_info_pre_(0xFFU); - -// hold off flushing after successful initialization (see QS_INIT()) - - - - noexcept - // NOTE: Must be called IN critical section. -// Also requires system-level memory access (QF_MEM_SYS()). - -std::uint16_t ret; -if (priv_.used == 0U) { - ret = QS_EOD; // set End-Of-Data -} -else { - std::uint8_t const * const buf = priv_.buf; // put in a temporary - QSCtr tail = priv_.tail; // put in a temporary (register) - ret = static_cast<std::uint16_t>(buf[tail]); // set the byte to return - ++tail; // advance the tail - if (tail == priv_.end) { // tail wrap around? - tail = 0U; - } - priv_.tail = tail; // update the tail - priv_.used = (priv_.used - 1U); // one less byte used -} -return ret; // return the byte or EOD - - - - noexcept - - - // NOTE: Must be called IN critical section. -// Also requires system-level memory access (QF_MEM_SYS()). - -QSCtr const used = priv_.used; // put in a temporary (register) -std::uint8_t *buf; - -// any bytes used in the ring buffer? -if (used != 0U) { - QSCtr tail = priv_.tail; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - QSCtr n = static_cast<QSCtr>(end - tail); - if (n > used) { - n = used; - } - if (n > static_cast<QSCtr>(*pNbytes)) { - n = static_cast<QSCtr>(*pNbytes); - } - *pNbytes = static_cast<std::uint16_t>(n); // n-bytes available - buf = priv_.buf; - buf = &buf[tail]; // the bytes are at the tail - - priv_.used = static_cast<QSCtr>(used - n); - tail += n; - if (tail == end) { - tail = 0U; - } - priv_.tail = tail; -} -else { // no bytes available - *pNbytes = 0U; // no bytes available right now - buf = nullptr; // no bytes available right now -} -return buf; - - - - - - - - - - - - - - - - - - - - //! Kinds of objects used QS-RX - : std::uint8_t { - SM_OBJ, //!< state machine object - AO_OBJ, //!< active object - MP_OBJ, //!< event pool object - EQ_OBJ, //!< raw queue object - TE_OBJ, //!< time event object - AP_OBJ, //!< generic Application-specific object - MAX_OBJ -}; - - - - //! Object combinations for QS-RX - : std::uint8_t { - SM_AO_OBJ = MAX_OBJ //!< combination of SM and AO -}; - - - - noexcept - - - - - rxPriv_.buf = &sto[0]; -rxPriv_.end = static_cast<QSCtr>(stoSize); -rxPriv_.head = 0U; -rxPriv_.tail = 0U; - -rxPriv_.currObj[QS::SM_OBJ] = nullptr; -rxPriv_.currObj[QS::AO_OBJ] = nullptr; -rxPriv_.currObj[QS::MP_OBJ] = nullptr; -rxPriv_.currObj[QS::EQ_OBJ] = nullptr; -rxPriv_.currObj[QS::TE_OBJ] = nullptr; -rxPriv_.currObj[QS::AP_OBJ] = nullptr; - -tran_(WAIT4_SEQ); -l_rx.esc = 0U; -l_rx.seq = 0U; -l_rx.chksum = 0U; - -beginRec_(static_cast<std::uint_fast8_t>(QS_OBJ_DICT)); - QS_OBJ_PRE_(&rxPriv_); - QS_STR_PRE_("QS_RX"); -endRec_(); -// no QS_REC_DONE(), because QS is not running yet - -#ifdef Q_UTEST -tstPriv_.tpNum = 0U; -tstPriv_.testTime = 0U; -#endif // Q_UTEST - - - - noexcept - - - // NOTE: does not need critical section -// But requires system-level memory access (QF_MEM_SYS()). - -QSCtr head = rxPriv_.head + 1U; -if (head == rxPriv_.end) { - head = 0U; -} -if (head != rxPriv_.tail) { // buffer NOT full? - rxPriv_.buf[rxPriv_.head] = b; - rxPriv_.head = head; - return true; // byte placed in the buffer -} -else { - return false; // byte NOT placed in the buffer -} - - - - // NOTE: Must be called IN critical section. -// Also requires system-level memory access (QF_MEM_SYS()). - -QSCtr tail = rxPriv_.tail; -while (rxPriv_.head != tail) { // QS-RX buffer NOT empty? - std::uint8_t b = rxPriv_.buf[tail]; - - ++tail; - if (tail == rxPriv_.end) { - tail = 0U; - } - rxPriv_.tail = tail; // update the tail to a *valid* index - - if (l_rx.esc != 0U) { // escaped byte arrived? - l_rx.esc = 0U; - b ^= QS_ESC_XOR; - - l_rx.chksum += b; - rxParseData_(b); - } - else if (b == QS_ESC) { - l_rx.esc = 1U; - } - else if (b == QS_FRAME) { - // get ready for the next frame - b = l_rx.state; // save the current state in b - l_rx.esc = 0U; - tran_(WAIT4_SEQ); - - if (l_rx.chksum == QS_GOOD_CHKSUM) { - l_rx.chksum = 0U; - rxHandleGoodFrame_(b); - } - else { // bad checksum - l_rx.chksum = 0U; - rxReportError_(0x41U); - rxHandleBadFrame_(b); - } - } - else { - l_rx.chksum += b; - rxParseData_(b); - } -} - - - - noexcept - // NOTE: Must be called IN critical section. -// Also requires system-level memory access (QF_MEM_SYS()). - -QSCtr const head = rxPriv_.head; -std::uint16_t nFree; -if (head == rxPriv_.tail) { // buffer empty? - nFree = static_cast<std::uint16_t>(rxPriv_.end - 1U); -} -else if (head < rxPriv_.tail) { - nFree = static_cast<std::uint16_t>(rxPriv_.tail - head - 1U); -} -else { - nFree = static_cast<std::uint16_t>(rxPriv_.end + rxPriv_.tail - - head - 1U); -} -return nFree; - - - - - - - - - - - - - - - - - - - - - - { - QSFun addr; - std::uint32_t data; - std::uint8_t idx; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Clear the internal QF variables, so that the framework can start -// correctly even if the startup code fails to clear the uninitialized -// data (as is required by the C++ Standard). -bzero_(&QF::priv_, sizeof(QF::priv_)); -bzero_(&QS::tstPriv_, sizeof(QS::tstPriv_)); -bzero_(&QActive::registry_[0], sizeof(QActive::registry_)); - -#ifndef Q_UNSAFE -QS::tstPriv_.readySet.update_(&QS::tstPriv_.readySet_dis); -#endif - - - - QS::onReset(); - - - - QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); - -// function dictionaries for the standard API -QS_FUN_DICTIONARY(&QActive::post_); -QS_FUN_DICTIONARY(&QActive::postLIFO); -QS_FUN_DICTIONARY(&QS::processTestEvts_); - -// produce the QS_QF_RUN trace record -QS_BEGIN_PRE_(QS_QF_RUN, 0U) -QS_END_PRE_() - -QS_MEM_APP(); -QS_CRIT_EXIT(); - -QS::processTestEvts_(); // process all events posted so far -QS::onTestLoop(); // run the unit test -QS::onCleanup(); // application cleanup -return 0; // return no error - - - - - - - - - - - - - - - - - - - Q_UNUSED_PAR(stkSto); -Q_UNUSED_PAR(stkSize); - -m_prio = static_cast<std::uint8_t>(prioSpec & 0xFFU); // QF-priol -m_pthre = static_cast<std::uint8_t>(prioSpec >> 8U); // preemption-thre. -register_(); // make QF aware of this AO - -m_eQueue.init(qSto, qLen); // initialize QEQueue of this AO - -this->init(par, m_prio); // take the top-most initial tran. (virtual) - - - - unsubscribeAll(); // unsubscribe from all events -unregister_(); // remove this object from QF - - - - - - - - - - - QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); - -QTimeEvt *prev = &QTimeEvt::timeEvtHead_[tickRate]; - -QS_BEGIN_PRE_(QS_QF_TICK, 0U) - prev->m_ctr = (prev->m_ctr + 1U); - QS_TEC_PRE_(prev->m_ctr); // tick ctr - QS_U8_PRE_(tickRate); // tick rate -QS_END_PRE_() - -// is current Time Event object provided? -QTimeEvt *t = static_cast<QTimeEvt *>(QS::rxPriv_.currObj[QS::TE_OBJ]); -if (t != nullptr) { - - // the time event must be armed - Q_ASSERT_INCRIT(810, t->m_ctr != 0U); - - QActive * const act = static_cast<QActive *>(t->m_act); - - // the recipient AO must be provided - Q_ASSERT_INCRIT(820, act != nullptr); - - // periodic time evt? - if (t->m_interval != 0U) { - t->m_ctr = t->m_interval; // rearm the time event - } - else { // one-shot time event: automatically disarm - t->m_ctr = 0U; // auto-disarm - // mark time event 't' as NOT linked - t->refCtr_ = static_cast<std::uint8_t>(t->refCtr_ - & static_cast<std::uint8_t>(~TE_IS_LINKED)); - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_AUTO_DISARM, act->m_prio) - QS_OBJ_PRE_(t); // this time event object - QS_OBJ_PRE_(act); // the target AO - QS_U8_PRE_(tickRate); // tick rate - QS_END_PRE_() - } - - QS_BEGIN_PRE_(QS_QF_TIMEEVT_POST, act->m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(t); // the time event object - QS_SIG_PRE_(t->sig); // signal of this time event - QS_OBJ_PRE_(act); // the target AO - QS_U8_PRE_(tickRate); // tick rate - QS_END_PRE_() - QS_MEM_APP(); - QS_CRIT_EXIT(); // exit critical section before posting - - // asserts if queue overflows - static_cast<void>(act->POST(t, sender)); - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); -} - -// update the linked list of time events -for (;;) { - t = prev->m_next; // advance down the time evt. list - - // end of the list? - if (t == nullptr) { - - // any new time events armed since the last run of tick()? - if (QTimeEvt::timeEvtHead_[tickRate].m_act != nullptr) { - - // sanity check - Q_ASSERT_INCRIT(830, prev != nullptr); - prev->m_next = QTimeEvt::timeEvtHead_[tickRate].toTimeEvt(); - QTimeEvt::timeEvtHead_[tickRate].m_act = nullptr; - t = prev->m_next; // switch to the new list - } - else { - break; // all currently armed time evts. processed - } - } - - // time event scheduled for removal? - if (t->m_ctr == 0U) { - prev->m_next = t->m_next; - // mark time event 't' as NOT linked - t->refCtr_ = static_cast<std::uint8_t>(t->refCtr_ - & static_cast<std::uint8_t>(~TE_IS_LINKED)); - // do NOT advance the prev pointer - QS_MEM_APP(); - QS_CRIT_EXIT(); // exit crit. section to reduce latency - } - else { - prev = t; // advance to this time event - QS_MEM_APP(); - QS_CRIT_EXIT(); // exit crit. section to reduce latency - } - QS_CRIT_ENTRY(); // re-enter crit. section to continue - QS_MEM_SYS(); -} - -QS_MEM_APP(); -QS_CRIT_EXIT(); - - - - - - - : QAsm() - - - - override - - - - - Q_UNUSED_PAR(e); - -#ifdef Q_SPY -if ((QS::priv_.flags & 0x01U) == 0U) { - QS::priv_.flags |= 0x01U; - QS_FUN_DICTIONARY(&QP::QHsm::top); -} -#else -Q_UNUSED_PAR(qs_id); -#endif - -QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_STATE_INIT, qs_id) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.fun); // the source state - QS_FUN_PRE_(m_temp.fun); // the target of the initial tran. -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - - - - override - - - - - QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_DISPATCH, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.fun); // the current state -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - - - - - - - - - : QActive(nullptr) - - - - override - - - - - Q_UNUSED_PAR(e); -Q_UNUSED_PAR(qs_id); - -#ifdef Q_SPY -if ((QS::priv_.flags & 0x01U) == 0U) { - QS::priv_.flags |= 0x01U; - QS_FUN_DICTIONARY(&QP::QHsm::top); -} -#endif - -QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_STATE_INIT, m_prio) - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.fun); // the source state - QS_FUN_PRE_(m_temp.fun); // the target of the initial tran. -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - - - - override - - - - - QS_CRIT_STAT -QS_CRIT_ENTRY(); -QS_MEM_SYS(); -QS_BEGIN_PRE_(QS_QEP_DISPATCH, qs_id) - QS_TIME_PRE_(); // time stamp - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this state machine object - QS_FUN_PRE_(m_state.fun); // the current state -QS_END_PRE_() -QS_MEM_APP(); -QS_CRIT_EXIT(); - - - - noexcept - - - - - - - QS_TEST_PROBE_DEF(&QActive::post_) - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// test-probe#1 for faking queue overflow -bool status = true; -QS_TEST_PROBE_ID(1, - status = false; - if (margin == QF::NO_MARGIN) { - // fake assertion Mod=qf_actq,Loc=110 - Q_onError("qf_actq", 110); - } -) - -// is it a mutable event? -if (e->getPoolId_() != 0U) { - QEvt_refCtr_inc_(e); -} - -std::uint_fast8_t const rec = - (status ? static_cast<std::uint8_t>(QS_QF_ACTIVE_POST) - : static_cast<std::uint8_t>(QS_QF_ACTIVE_POST_ATTEMPT)); -QS_BEGIN_PRE_(rec, m_prio) - QS_TIME_PRE_(); // timestamp - QS_OBJ_PRE_(sender); // the sender object - QS_SIG_PRE_(e->sig); // the signal of the event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(0U); // # free entries - QS_EQC_PRE_(margin); // margin requested -QS_END_PRE_() - -// callback to examine the posted event under the same conditions -// as producing the #QS_QF_ACTIVE_POST trace record, which are: -// the local filter for this AO ('m_prio') is set -if (QS_LOC_CHECK_(m_prio)) { - QS::onTestPost(sender, this, e, status); -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -// recycle the event immediately, because it was not really posted -#if (QF_MAX_EPOOL > 0U) -QF::gc(e); -#endif - -return status; - - - - noexcept - - - QS_TEST_PROBE_DEF(&QActive::postLIFO) - -QF_CRIT_STAT -QF_CRIT_ENTRY(); -QF_MEM_SYS(); - -// test-probe#1 for faking queue overflow -QS_TEST_PROBE_ID(1, - // fake assertion Mod=qf_actq,Loc=210 - Q_onError("qf_actq", 210); -) - -// is it a mutable event? -if (e->getPoolId_() != 0U) { - QEvt_refCtr_inc_(e); -} - -QS_BEGIN_PRE_(QS_QF_ACTIVE_POST_LIFO, m_prio) - QS_TIME_PRE_(); // timestamp - QS_SIG_PRE_(e->sig); // the signal of this event - QS_OBJ_PRE_(this); // this active object - QS_2U8_PRE_(e->getPoolId_(), e->refCtr_); // poolId & refCtr - QS_EQC_PRE_(0U); // # free entries - QS_EQC_PRE_(0U); // min # free entries -QS_END_PRE_() - -// callback to examine the posted event under the same conditions -// as producing the #QS_QF_ACTIVE_POST trace record, which are: -// the local filter for this AO ('m_prio') is set -if (QS_LOC_CHECK_(m_prio)) { - QS::onTestPost(nullptr, this, e, true); -} -QF_MEM_APP(); -QF_CRIT_EXIT(); - -// recycle the event immediately, because it was not really posted -#if (QF_MAX_EPOOL > 0U) -QF::gc(e); -#endif - - - - - - - - - - - (QP::QS::onStartup(arg_)) - - - - (QP::QS::onCleanup()) - - - - (QP::QS::doOutput()) - - - - (QP::QS::doInput()) - - - - - - \ - (QP::QS::glbFilter_(static_cast<std::int_fast16_t>(rec_))) - - - - - - \ - (QP::QS::locFilter_(static_cast<std::int_fast16_t>(qs_id_))) - - - - - - - - \ -if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \ - QS_CRIT_STAT \ - QS_CRIT_ENTRY(); \ - QS_MEM_SYS(); \ - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(rec_)); \ - QS_TIME_PRE_(); { - - - - } \ - QP::QS::endRec_(); \ - QS_MEM_APP(); \ - QS_CRIT_EXIT(); \ -} - - - - (QP::QS::onFlush()) - - - - - - - - \ -if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \ - QP::QS::beginRec_(rec_); \ - QS_TIME_PRE_(); { - - - - } \ - QP::QS::endRec_(); \ -} - - - - - - \ -((static_cast<std::uint_fast8_t>(QP::QS::filt_.glb[ \ - static_cast<std::uint_fast8_t>(rec_) >> 3U]) \ - & (static_cast<std::uint_fast8_t>(1U) \ - << (static_cast<std::uint_fast8_t>(rec_) & 7U))) != 0U) - - - - - - \ -((static_cast<std::uint_fast8_t>(QP::QS::filt_.loc \ - [static_cast<std::uint_fast8_t>(qs_id_) >> 3U]) \ - & (static_cast<std::uint_fast8_t>(1U) \ - << (static_cast<std::uint_fast8_t>(qs_id_) & 7U))) != 0U) - - - - (static_cast<void>(0)) - - - - - - - - \ -(QP::QS::u8_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>(((width_) << 4U) & 0x7U)) \ - | static_cast<std::uint8_t>(QP::QS::I8_ENUM_T)), (data_))) - - - - - - - - \ -(QP::QS::u8_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::U8_T)), (data_))) - - - - - - - - \ -(QP::QS::u16_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::I16_T)), (data_))) - - - - - - - - \ -(QP::QS::u16_fmt_(static_cast<std::uint8_t>((((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::U16_T)), (data_))) - - - - - - - - \ -(QP::QS::u32_fmt_( \ - static_cast<std::uint8_t>((static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::I32_T)), (data_))) - - - - - - - - \ -(QP::QS::u32_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::U32_T)), (data_))) - - - - - - - - \ -(QP::QS::u64_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::I64_T)), (data_))) - - - - - - - - \ -(QP::QS::u64_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::U64_T)), (data_))) - - - - - - - - \ -(QP::QS::f32_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::F32_T)), (data_))) - - - - - - - - \ -(QP::QS::f64_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::F64_T)), (data_))) - - - - - - (QP::QS::str_fmt_(str_)) - - - - - - - - (QP::QS::mem_fmt_((mem_), (size_))) - - - - - - - - \ - (QP::QS::u8_fmt_(static_cast<std::uint8_t>(0x80U | ((group_) << 4U)) \ - | static_cast<std::uint8_t>(QP::QS::I8_ENUM_T),\ - static_cast<std::uint8_t>(value_))) - - - - (QP::QS::u16_raw_(QP::QS::onGetTime())) - - - - (QP::QS::u32_raw_(QP::QS::onGetTime())) - - - - - - (QP::QS::u16_fmt_(QP::QS::OBJ_T, \ - reinterpret_cast<std::uint16_t>(obj_))) - - - - - - (QP::QS::u32_fmt_(QP::QS::OBJ_T, \ - reinterpret_cast<std::uint32_t>(obj_))) - - - - - - (QP::QS::u64_fmt_(QP::QS::OBJ_T, \ - reinterpret_cast<std::uint64_t>(obj_))) - - - - - - (QP::QS::u16_fmt_(QP::QS::FUN_T, \ - reinterpret_cast<std::uint16_t>(fun_))) - - - - - - (QP::QS::u32_fmt_(QP::QS::FUN_T, \ - reinterpret_cast<std::uint32_t>(fun_))) - - - - - - (QP::QS::u64_fmt_(QP::QS::FUN_T, \ - reinterpret_cast<std::uint64_t>(fun_))) - - - - - - - - \ - QP::QS::u8_fmt_(QP::QS::SIG_T, static_cast<std::uint8_t>(sig_)); \ - QP::QS::obj_raw_(obj_) - - - - - - - - \ - QP::QS::u16_fmt_(QP::QS::SIG_T, static_cast<std::uint16_t>(sig_)); \ - QP::QS::obj_raw_(obj_) - - - - - - - - \ - QP::QS::u32_fmt_(QP::QS::SIG_T, static_cast<std::uint32_t>(sig_)); \ - QP::QS::obj_raw_(obj_) - - - - - - - - \ - (QP::QS::sig_dict_pre_((sig_), (obj_), #sig_)) - - - - - - \ - (QP::QS::obj_dict_pre_((obj_), #obj_)) - - - - - - - - \ - (QP::QS::obj_arr_dict_pre_((obj_), (idx_), #obj_)) - - - - - - \ - (QP::QS::fun_dict_pre_( \ - QP::QS::force_cast<void (*)()>(fun_), #fun_)) - - - - - - \ - (QP::QS::usr_dict_pre_((rec_), #rec_)) - - - - - - - - \ - (QP::QS::enum_dict_pre_((value_), (group_), #value_)) - - - - (QP::QS::crit_entry_pre_()) - - - - (QP::QS::crit_exit_pre_()) - - - - - - - - \ - (QP::QS::isr_entry_pre_((isrnest_), (prio_))) - - - - - - - - \ - (QP::QS::isr_exit_pre_((isrnest_), (prio_))) - - - - - - (code_) - - - - - - - - - - \ - (QP::QS::assertion_pre_((module_), (id_), (delay_))) - - - - (static_cast<std::uint16_t>(0xFFFFU)) - - - - (static_cast<std::uint8_t>(7U)) - - - - (static_cast<std::uint8_t>(0x0FU)) - - - - QF_CRIT_STAT - - - - QF_CRIT_ENTRY() - - - - QF_CRIT_EXIT() - - - - QF_MEM_SYS() - - - - QF_MEM_APP() - - - - - - - #ifndef QP_HPP_ -#define QP_HPP_ - -//============================================================================ -#define QP_VERSION 733U -#define QP_VERSION_STR "7.3.3" - -//! Encrypted current QP release (7.3.3) and date (2024-01-31) -#define QP_RELEASE 0x70DEE7F2U - -//============================================================================ -//! @cond INTERNAL - -#ifndef Q_SIGNAL_SIZE -#define Q_SIGNAL_SIZE 2U -#endif // ndef Q_SIGNAL_SIZE - -#ifndef QF_MAX_ACTIVE -#define QF_MAX_ACTIVE 32U -#endif - -#if (QF_MAX_ACTIVE > 64U) -#error QF_MAX_ACTIVE exceeds the maximum of 64U; -#endif - -#ifndef QF_MAX_TICK_RATE -#define QF_MAX_TICK_RATE 1U -#endif - -#if (QF_MAX_TICK_RATE > 15U) -#error QF_MAX_TICK_RATE exceeds the maximum of 15U; -#endif - -#ifndef QF_MAX_EPOOL -#define QF_MAX_EPOOL 3U -#endif - -#if (QF_MAX_EPOOL > 15U) -#error QF_MAX_EPOOL exceeds the maximum of 15U; -#endif - -#ifndef QF_TIMEEVT_CTR_SIZE -#define QF_TIMEEVT_CTR_SIZE 4U -#endif - -#if (QF_TIMEEVT_CTR_SIZE > 4U) -#error QF_TIMEEVT_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U; -#endif - -#ifndef QF_EVENT_SIZ_SIZE -#define QF_EVENT_SIZ_SIZE 2U -#endif - -#if (QF_EVENT_SIZ_SIZE > 4U) -#error QF_EVENT_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U; -#endif - -//! @endcond -//============================================================================ -#ifdef QEVT_DYN_CTOR -#include <new> // for placement new -#include <cstdarg> // for va_list -#endif // QEVT_DYN_CTOR - -$declare ${glob-types} - -$declare ${QEP} - -$declare ${QEP-macros} - -$declare ${QF::types} - -$declare ${QF::QActive} - -$declare ${QF::QMActive} - -$declare ${QF::QTimeEvt} - -$declare ${QF::QTicker} - -$declare ${QF::QF-base} - -$declare ${QF::QF-dyn} - -extern "C" { -$declare ${QF-extern-C} -} // extern "C" - -$declare ${QF-macros} - -#endif // QP_HPP_ - - - - #ifndef QP_PKG_HPP_ -#define QP_PKG_HPP_ - -$declare ${QF::QF-pkg} - -#define QF_CONST_CAST_(type_, ptr_) const_cast<type_>(ptr_) -#define QF_PTR_RANGE_(x_, min_, max_) (((min_) <= (x_)) && ((x_) <= (max_))) -#define Q_UINTPTR_CAST_(ptr_) (reinterpret_cast<std::uintptr_t>(ptr_)) -#define Q_ACTION_CAST(act_) (reinterpret_cast<QP::QActionHandler>(act_)) - -namespace QP { - -// Bitmasks are for the QTimeEvt::refCtr_ attribute (inherited from QEvt). -// In QTimeEvt this attribute is NOT used for reference counting. -constexpr std::uint8_t TE_IS_LINKED = 1U << 7U; // flag -constexpr std::uint8_t TE_WAS_DISARMED = 1U << 6U; // flag -constexpr std::uint8_t TE_TICK_RATE = 0x0FU; // bitmask - -inline void QEvt_refCtr_inc_(QEvt const * const e) noexcept { - (QF_CONST_CAST_(QEvt*, e))->refCtr_ = e->refCtr_ + 1U; -} - -inline void QEvt_refCtr_dec_(QEvt const * const e) noexcept { - (QF_CONST_CAST_(QEvt*, e))->refCtr_ = e->refCtr_ - 1U; -} - -} // namespace QP - -#endif // QP_PKG_HPP_ - - - - #ifndef QEQUEUE_HPP_ -#define QEQUEUE_HPP_ - -#ifndef QF_EQUEUE_CTR_SIZE - #define QF_EQUEUE_CTR_SIZE 1U -#endif - -namespace QP { - -#if (QF_EQUEUE_CTR_SIZE == 1U) - using QEQueueCtr = std::uint8_t; -#elif (QF_EQUEUE_CTR_SIZE == 2U) - using QEQueueCtr = std::uint16_t; -#elif (QF_EQUEUE_CTR_SIZE == 4U) - using QEQueueCtr = std::uint32_t; -#else - #error "QF_EQUEUE_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U" -#endif - -class QEvt; // forward declaration - -} // namespace QP - -$declare ${QF::QEQueue} - -#endif // QEQUEUE_HPP_ - - - - #ifndef QMPOOL_HPP_ -#define QMPOOL_HPP_ - -#ifndef QF_MPOOL_SIZ_SIZE - #define QF_MPOOL_SIZ_SIZE 2U -#endif -#ifndef QF_MPOOL_CTR_SIZE - #define QF_MPOOL_CTR_SIZE 2U -#endif - -namespace QP { - -#if (QF_MPOOL_SIZ_SIZE == 1U) - using QMPoolSize = std::uint8_t; -#elif (QF_MPOOL_SIZ_SIZE == 2U) - using QMPoolSize = std::uint16_t; -#elif (QF_MPOOL_SIZ_SIZE == 4U) - using QMPoolSize = std::uint32_t; -#else - #error "QF_MPOOL_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U" -#endif - -#if (QF_MPOOL_CTR_SIZE == 1U) - using QMPoolCtr = std::uint8_t; -#elif (QF_MPOOL_CTR_SIZE == 2U) - using QMPoolCtr = std::uint16_t; -#elif (QF_MPOOL_CTR_SIZE == 4U) - using QMPoolCtr = std::uint32_t; -#else - #error "QF_MPOOL_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U" -#endif - -} // namespace QP - -#define QF_MPOOL_EL(evType_) struct { \ - QP::QFreeBlock sto_[((sizeof(evType_) - 1U) \ - / sizeof(QP::QFreeBlock)) + 1U]; } -$declare ${QF::QFreeBlock} - -$declare ${QF::QMPool} - -#endif // QMPOOL_HPP_ - - - - #ifndef QV_HPP_ -#define QV_HPP_ - -$declare ${QV::QV-base} - -//============================================================================ -// interface used only for internal implementation, but not in applications -#ifdef QP_IMPL - -$declare ${QV-impl} - -$declare ${QF_EPOOL-impl} - -#endif // QP_IMPL - -#endif // QV_HPP_ - - - - #ifndef QK_HPP_ -#define QK_HPP_ - -$declare ${QK::QSchedStatus} - -$declare ${QK::QK-base} - -extern "C" { -$declare ${QK-extern-C} -} // extern "C" - -//============================================================================ -// interface used only for internal implementation, but not in applications -#ifdef QP_IMPL - -$declare ${QK-impl} - -$declare ${QF_EPOOL-impl} - -#endif // QP_IMPL - -#endif // QK_HPP_ - - - - #ifndef QXK_HPP_ -#define QXK_HPP_ - -$declare ${QXK::QSchedStatus} - -$declare ${QXK::QXTHREAD_NO_TIMEOUT} - -$declare ${QXK::QXK-base} - -$declare ${QXK::QXThread} - -$declare ${QXK::QXSemaphore} - -$declare ${QXK::QXMutex} - -extern "C" { -$declare ${QXK-extern-C} -} // extern "C" - -//============================================================================ -// interface used only for internal implementation, but not in applications -#ifdef QP_IMPL - -$declare ${QXK-impl} - -$declare ${QF_EPOOL-impl} - -namespace QP { -namespace QXK { -enum TimeoutSigs : QSignal { - DELAY_SIG = 1U, - TIMEOUT_SIG -}; -} // namespace QXK -} // namespace QP - -#endif // QP_IMPL - -#endif // QXK_HPP_ - - - - #ifndef QS_HPP_ -#define QS_HPP_ - -#ifndef Q_SPY -#error "Q_SPY must be defined to include qs.hpp" -#endif - -//============================================================================ -//! @cond INTERNAL - -#ifndef QS_CTR_SIZE -#define QS_CTR_SIZE 2U -#endif - -#ifndef QS_TIME_SIZE -#define QS_TIME_SIZE 4U -#endif - -//! @endcond -//============================================================================ - -$declare ${QS::types} -$declare ${QS::filters} -$declare ${QS-macros} - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -struct Attr { - void const * locFilter_AP; //!< @deprecated - std::uint8_t * buf; - QSCtr end; - QSCtr volatile head; - QSCtr volatile tail; - QSCtr volatile used; - std::uint8_t volatile seq; - std::uint8_t volatile chksum; - std::uint8_t volatile critNest; - std::uint8_t flags; -}; - -extern Attr priv_; - -void glbFilter_(std::int_fast16_t const filter) noexcept; -void locFilter_(std::int_fast16_t const filter) noexcept; - -void beginRec_(std::uint_fast8_t const rec) noexcept; -void endRec_() noexcept; - -void u8_raw_(std::uint8_t const d) noexcept; -void u8u8_raw_( - std::uint8_t const d1, - std::uint8_t const d2) noexcept; -void u16_raw_(std::uint16_t d) noexcept; -void u32_raw_(std::uint32_t d) noexcept; -void u64_raw_(std::uint64_t d) noexcept; -void obj_raw_(void const * const obj) noexcept; -void str_raw_(char const * s) noexcept; - -void u8_fmt_( - std::uint8_t const format, - std::uint8_t const d) noexcept; -void u16_fmt_( - std::uint8_t format, - std::uint16_t d) noexcept; -void u32_fmt_( - std::uint8_t format, - std::uint32_t d) noexcept; -void u64_fmt_( - std::uint8_t format, - std::uint64_t d) noexcept; -void f32_fmt_( - std::uint8_t format, - float32_t f) noexcept; -void f64_fmt_( - std::uint8_t format, - float64_t d) noexcept; -void str_fmt_(char const * s) noexcept; -void mem_fmt_( - std::uint8_t const * blk, - std::uint8_t size) noexcept; - -void sig_dict_pre_( - QSignal const sig, - void const * const obj, - char const * const name) noexcept; -void obj_dict_pre_( - void const * const obj, - char const * const name) noexcept; -void obj_arr_dict_pre_( - void const * const obj, - std::uint_fast16_t const idx, - char const * const name) noexcept; -void fun_dict_pre_( - QSpyFunPtr fun, - char const * const name) noexcept; -void usr_dict_pre_( - enum_t const rec, - char const * const name) noexcept; -void enum_dict_pre_( - enum_t const value, - std::uint8_t const group, - char const * const name) noexcept; - -void assertion_pre_( - char const * const module, - int_t const id, - std::uint32_t const delay) noexcept; -void crit_entry_pre_() noexcept; -void crit_exit_pre_() noexcept; -void isr_entry_pre_( - std::uint8_t const isrnest, - std::uint8_t const prio) noexcept; -void isr_exit_pre_( - std::uint8_t const isrnest, - std::uint8_t const prio) noexcept; - -void target_info_pre_(std::uint8_t const isReset); - -} // namespace QS -} // namespace QP - -//! @endcond -//============================================================================ - -$declare ${QS::QS-TX} - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -struct RxAttr { - void * currObj[8]; - std::uint8_t * buf; - QSCtr end; - QSCtr volatile head; - QSCtr volatile tail; -#ifdef Q_UTEST - bool inTestLoop; -#endif -} ; - -extern RxAttr rxPriv_; - -} // namespace QS -} // namespace QP - -//! @endcond -//============================================================================ - -$declare ${QS::QS-RX} - -//============================================================================ -#ifdef Q_UTEST - -$declare ${QS::QUTest} - -#define QUTEST_ON_POST 124 - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -struct TestAttr { - TProbe tpBuf[16]; - std::uint8_t tpNum; - QSTimeCtr testTime; - QPSet readySet; - QPSet readySet_dis; - std::uint_fast8_t intLock; -}; - -extern TestAttr tstPriv_; - -void test_pause_(); -std::uint32_t getTestProbe_(QSpyFunPtr const api) noexcept; - -} // namespace QS -} // namespace QP - -//! @endcond -//============================================================================ - -// QP-stub for QUTest -// NOTE: The QP-stub is needed for unit testing QP applications, -// but might NOT be needed for testing QP itself. -#if (Q_UTEST != 0) - -$declare ${QS::QUTest-stub::QHsmDummy} -$declare ${QS::QUTest-stub::QActiveDummy} - -#endif // Q_UTEST != 0 - -#define QS_TEST_PROBE_DEF(fun_) \ - std::uint32_t const qs_tp_ = \ - QP::QS::getTestProbe_(QP::QS::force_cast<void (*)()>(fun_)); - -#define QS_TEST_PROBE(code_) \ - if (qs_tp_ != 0U) { code_ } - -#define QS_TEST_PROBE_ID(id_, code_) \ - if (qs_tp_ == static_cast<std::uint32_t>(id_)) { code_ } - -#define QS_TEST_PAUSE() (QP::QS::test_pause_()) - -#else // Q_UTEST not defined - -// dummy definitions when not building for QUTEST -#define QS_TEST_PROBE_DEF(fun_) -#define QS_TEST_PROBE(code_) -#define QS_TEST_PROBE_ID(id_, code_) -#define QS_TEST_PAUSE() (static_cast<void>(0)) - -#endif // Q_UTEST - -#endif // QS_HPP_ - - - - #ifndef QS_DUMMY_HPP_ -#define QS_DUMMY_HPP_ - -#ifdef Q_SPY -#error "Q_SPY must NOT be defined to include qs_dummy.hpp" -#endif - -#define QS_INIT(arg_) (true) -#define QS_EXIT() static_cast<void>(0) -#define QS_DUMP() static_cast<void>(0) -#define QS_GLB_FILTER(rec_) static_cast<void>(0) -#define QS_LOC_FILTER(qs_id_) static_cast<void>(0) - -#define QS_GET_BYTE(pByte_) (0xFFFFU) -#define QS_GET_BLOCK(pSize_) (nullptr) - -#define QS_BEGIN_ID(rec_, qs_id_) if (false) { -#define QS_END() } -#define QS_BEGIN_INCRIT(rec_, qs_id_) if (false) { -#define QS_END_INCRIT() } - -#define QS_I8(width_, data_) static_cast<void>(0) -#define QS_U8(width_, data_) static_cast<void>(0) -#define QS_I16(width_, data_) static_cast<void>(0) -#define QS_U16(width_, data_) static_cast<void>(0) -#define QS_I32(width_, data_) static_cast<void>(0) -#define QS_U32(width_, data_) static_cast<void>(0) -#define QS_F32(width_, data_) static_cast<void>(0) -#define QS_F64(width_, data_) static_cast<void>(0) -#define QS_I64(width_, data_) static_cast<void>(0) -#define QS_U64(width_, data_) static_cast<void>(0) -#define QS_ENUM(group_, value_) static_cast<void>(0) -#define QS_STR(str_) static_cast<void>(0) -#define QS_MEM(mem_, size_) static_cast<void>(0) -#define QS_SIG(sig_, obj_) static_cast<void>(0) -#define QS_OBJ(obj_) static_cast<void>(0) -#define QS_FUN(fun_) static_cast<void>(0) - -#define QS_SIG_DICTIONARY(sig_, obj_) static_cast<void>(0) -#define QS_OBJ_DICTIONARY(obj_) static_cast<void>(0) -#define QS_OBJ_ARR_DICTIONARY(obj_, idx_) static_cast<void>(0) -#define QS_FUN_DICTIONARY(fun_) static_cast<void>(0) -#define QS_USR_DICTIONARY(rec_) static_cast<void>(0) -#define QS_ENUM_DICTIONARY(value_, group_) static_cast<void>(0) -#define QS_ASSERTION(module_, loc_, delay_) static_cast<void>(0) -#define QS_FLUSH() static_cast<void>(0) - -#define QS_TEST_PROBE_DEF(fun_) -#define QS_TEST_PROBE(code_) -#define QS_TEST_PROBE_ID(id_, code_) -#define QS_TEST_PAUSE() static_cast<void>(0) - -#define QS_OUTPUT() static_cast<void>(0) -#define QS_RX_INPUT() static_cast<void>(0) -#define QS_ONLY(code_) static_cast<void>(0) - -//============================================================================ -// interface used only for internal implementation, but not in applications -#ifdef QP_IMPL - // predefined QS trace records - #define QS_BEGIN_PRE_(rec_, qs_id_) if (false) { - #define QS_END_PRE_() } - #define QS_BEGIN_PRE_(rec_, qs_id_) if (false) { - #define QS_END_PRE_() } - #define QS_U8_PRE_(data_) static_cast<void>(0) - #define QS_2U8_PRE_(data1_, data2_) static_cast<void>(0) - #define QS_U16_PRE_(data_) static_cast<void>(0) - #define QS_U32_PRE_(data_) static_cast<void>(0) - #define QS_TIME_PRE_() static_cast<void>(0) - #define QS_SIG_PRE_(sig_) static_cast<void>(0) - #define QS_EVS_PRE_(size_) static_cast<void>(0) - #define QS_OBJ_PRE_(obj_) static_cast<void>(0) - #define QS_FUN_PRE_(fun_) static_cast<void>(0) - #define QS_EQC_PRE_(ctr_) static_cast<void>(0) - #define QS_MPC_PRE_(ctr_) static_cast<void>(0) - #define QS_MPS_PRE_(size_) static_cast<void>(0) - #define QS_TEC_PRE_(ctr_) static_cast<void>(0) - - #define QS_CRIT_STAT - #define QS_CRIT_ENTRY() static_cast<void>(0) - #define QS_CRIT_EXIT() static_cast<void>(0) - - #define QS_MEM_SYS() static_cast<void>(0) - #define QS_MEM_APP() static_cast<void>(0) - - #define QS_TR_CRIT_ENTRY() static_cast<void>(0) - #define QS_TR_CRIT_EXIT() static_cast<void>(0) - #define QS_TR_ISR_ENTRY(isrnest_, prio_) static_cast<void>(0) - #define QS_Tr_ISR_EXIT(isrnest_, prio_) static_cast<void>(0) -#endif // QP_IMPL - -#endif // QS_DUMMY_HPP_ - - - - #ifndef QS_PKG_HPP_ -#define QS_PKG_HPP_ - -//============================================================================ -//! @cond INTERNAL - -namespace QP { - -//! QS received record types (RX channel) -enum QSpyRxRecords : std::uint8_t { - QS_RX_INFO, //!< query Target info (ver, config, tstamp) - QS_RX_COMMAND, //!< execute a user-defined command in the Target - QS_RX_RESET, //!< reset the Target - QS_RX_TICK, //!< call system clock tick in the Target - QS_RX_PEEK, //!< peek Target memory - QS_RX_POKE, //!< poke Target memory - QS_RX_FILL, //!< fill Target memory - QS_RX_TEST_SETUP, //!< test setup - QS_RX_TEST_TEARDOWN, //!< test teardown - QS_RX_TEST_PROBE, //!< set a Test-Probe in the Target - QS_RX_GLB_FILTER, //!< set global filters in the Target - QS_RX_LOC_FILTER, //!< set local filters in the Target - QS_RX_AO_FILTER, //!< set local AO filter in the Target - QS_RX_CURR_OBJ, //!< set the "current-object" in the Target - QS_RX_TEST_CONTINUE, //!< continue a test after QS_TEST_PAUSE() - QS_RX_QUERY_CURR, //!< query the "current object" in the Target - QS_RX_EVENT //!< inject an event to the Target -}; - -constexpr std::uint8_t QS_FRAME {0x7EU}; -constexpr std::uint8_t QS_ESC {0x7DU}; -constexpr std::uint8_t QS_ESC_XOR {0x20U}; -constexpr std::uint8_t QS_GOOD_CHKSUM {0xFFU}; - -} // namespace QP - -//---------------------------------------------------------------------------- -#define QS_BEGIN_PRE_(rec_, qs_id_) \ - if (QS_GLB_CHECK_(rec_) && QS_LOC_CHECK_(qs_id_)) { \ - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(rec_)); -#define QS_END_PRE_() QP::QS::endRec_(); } - -#define QS_U8_PRE_(data_) \ - (QP::QS::u8_raw_(static_cast<std::uint8_t>(data_))) -#define QS_2U8_PRE_(data1_, data2_) \ - (QP::QS::u8u8_raw_(static_cast<std::uint8_t>(data1_), \ - static_cast<std::uint8_t>(data2_))) -#define QS_U16_PRE_(data_) \ - (QP::QS::u16_raw_(static_cast<std::uint16_t>(data_))) -#define QS_U32_PRE_(data_) \ - (QP::QS::u32_raw_(static_cast<std::uint32_t>(data_))) -#define QS_STR_PRE_(msg_) (QP::QS::str_raw_(msg_)) -#define QS_OBJ_PRE_(obj_) (QP::QS::obj_raw_(obj_)) - -#if (!defined Q_SIGNAL_SIZE || (Q_SIGNAL_SIZE == 1U)) - #define QS_SIG_PRE_(sig_) \ - (QP::QS::u8_raw_(static_cast<std::uint8_t>(sig_))) -#elif (Q_SIGNAL_SIZE == 2U) - #define QS_SIG_PRE_(sig_) \ - (QP::QS::u16_raw_(static_cast<std::uint16_t>(sig_))) -#elif (Q_SIGNAL_SIZE == 4U) - #define QS_SIG_PRE_(sig_) \ - (QP::QS::u32_raw_(static_cast<std::uint32_t>(sig_))) -#endif - -#if (!defined QS_FUN_PTR_SIZE || (QS_FUN_PTR_SIZE == 2U)) - #define QS_FUN_PRE_(fun_) \ - (QP::QS::u16_raw_(reinterpret_cast<std::uint16_t>(fun_))) -#elif (QS_FUN_PTR_SIZE == 4U) - #define QS_FUN_PRE_(fun_) \ - (QP::QS::u32_raw_(reinterpret_cast<std::uint32_t>(fun_))) -#elif (QS_FUN_PTR_SIZE == 8U) - #define QS_FUN_PRE_(fun_) \ - (QP::QS::u64_raw_(reinterpret_cast<std::uint64_t>(fun_))) -#else - #define QS_FUN_PRE_(fun_) \ - (QP::QS::u32_raw_(reinterpret_cast<std::uint32_t>(fun_))) -#endif - -//---------------------------------------------------------------------------- -#if (!defined QF_EQUEUE_CTR_SIZE || (QF_EQUEUE_CTR_SIZE == 1U)) - #define QS_EQC_PRE_(ctr_) \ - QP::QS::u8_raw_(static_cast<std::uint8_t>(ctr_)) -#elif (QF_EQUEUE_CTR_SIZE == 2U) - #define QS_EQC_PRE_(ctr_) \ - QP::QS::u16_raw_(static_cast<std::uint16_t>(ctr_)) -#elif (QF_EQUEUE_CTR_SIZE == 4U) - #define QS_EQC_PRE_(ctr_) \ - QP::QS::u32_raw_(static_cast<std::uint32_t>(ctr_)) -#else - #error "QF_EQUEUE_CTR_SIZE not defined" -#endif - -#if (!defined QF_EVENT_SIZ_SIZE || (QF_EVENT_SIZ_SIZE == 1U)) - #define QS_EVS_PRE_(size_) \ - QP::QS::u8_raw_(static_cast<std::uint8_t>(size_)) -#elif (QF_EVENT_SIZ_SIZE == 2U) - #define QS_EVS_PRE_(size_) \ - QP::QS::u16_raw_(static_cast<std::uint16_t>(size_)) -#elif (QF_EVENT_SIZ_SIZE == 4U) - #define QS_EVS_PRE_(size_) \ - QP::QS::u32_raw_(static_cast<std::uint32_t>(size_)) -#endif - -#if (!defined QF_MPOOL_SIZ_SIZE || (QF_MPOOL_SIZ_SIZE == 1U)) - #define QS_MPS_PRE_(size_) \ - QP::QS::u8_raw_(static_cast<std::uint8_t>(size_)) -#elif (QF_MPOOL_SIZ_SIZE == 2U) - #define QS_MPS_PRE_(size_) \ - QP::QS::u16_raw_(static_cast<std::uint16_t>(size_)) -#elif (QF_MPOOL_SIZ_SIZE == 4U) - #define QS_MPS_PRE_(size_) \ - QP::QS::u32_raw_(static_cast<std::uint32_t>(size_)) -#endif - -#if (!defined QF_MPOOL_CTR_SIZE || (QF_MPOOL_CTR_SIZE == 1U)) - #define QS_MPC_PRE_(ctr_) \ - QP::QS::u8_raw_(static_cast<std::uint8_t>(ctr_)) -#elif (QF_MPOOL_CTR_SIZE == 2U) - #define QS_MPC_PRE_(ctr_) \ - QP::QS::u16_raw_(static_cast<std::uint16_t>(ctr_)) -#elif (QF_MPOOL_CTR_SIZE == 4U) - #define QS_MPC_PRE_(ctr_) \ - QP::QS::u32_raw_(static_cast<std::uint32_t>(ctr_)) -#endif - -#if (!defined QF_TIMEEVT_CTR_SIZE || (QF_TIMEEVT_CTR_SIZE == 1U)) - #define QS_TEC_PRE_(ctr_) \ - QP::QS::u8_raw_(static_cast<std::uint8_t>(ctr_)) -#elif (QF_TIMEEVT_CTR_SIZE == 2U) - #define QS_TEC_PRE_(ctr_) \ - QP::QS::u16_raw_(static_cast<std::uint16_t>(ctr_)) -#elif (QF_TIMEEVT_CTR_SIZE == 4U) - #define QS_TEC_PRE_(ctr_) \ - QP::QS::u32_raw_(static_cast<std::uint32_t>(ctr_)) -#endif - -#define QS_REC_NUM_(enum_) (static_cast<std::uint_fast8_t>(enum_)) - -//---------------------------------------------------------------------------- -#define QS_INSERT_BYTE_(b_) \ - buf[head] = (b_); \ - ++head; \ - if (head == end) { \ - head = 0U; \ - } - -#define QS_INSERT_ESC_BYTE_(b_) \ - chksum = static_cast<std::uint8_t>(chksum + (b_)); \ - if (((b_) != QS_FRAME) && ((b_) != QS_ESC)) { \ - QS_INSERT_BYTE_(b_) \ - } \ - else { \ - QS_INSERT_BYTE_(QS_ESC) \ - QS_INSERT_BYTE_(static_cast<std::uint8_t>((b_) ^ QS_ESC_XOR)) \ - priv_.used = priv_.used + 1U; \ - } - -//---------------------------------------------------------------------------- -#if (defined Q_UTEST) && (Q_UTEST != 0) -namespace QP { -namespace QS { - -void processTestEvts_(); - -} // namespace QS -} // namespace QP -#endif // Q_UTEST != 0 - -//! @endcond -//============================================================================ - -#endif // QS_PKG_HPP_ - - - - #ifndef QSTAMP_HPP_ -#define QSTAMP_HPP_ - -namespace QP { -extern char const BUILD_DATE[12]; -extern char const BUILD_TIME[9]; -} // namespace QP - -#endif // QSTAMP_HPP_ - - - - #ifndef QPCPP_HPP_ -#define QPCPP_HPP_ - -//============================================================================ -#include "qp_port.hpp" // QP port from the port directory -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // software tracing enabled? - #include "qs_port.hpp" // QS/C++ port from the port directory -#else - #include "qs_dummy.hpp" // QS/C++ dummy (inactive) interface -#endif - -//============================================================================ -#ifndef QP_API_VERSION - -#define QP_API_VERSION 0 - -#endif // QP_API_VERSION - -//============================================================================ -// QP/C++ API compatibility layer... - -#if (QP_API_VERSION < 730) - -//! @deprecated plain 'char' is no longer forbidden in MISRA/AUTOSAR-C++ -using char_t = char; - -//! @deprecated assertion failure handler -//! Use Q_onError() instead. -#define Q_onAssert(module_, id_) Q_onError(module_, id_) - -//! @deprecated #Q_NASSERT preprocessor switch to disable QP assertions -#ifdef Q_NASSERT - - // #Q_UNSAFE now replaces the functionality of Q_NASSERT - #define Q_UNSAFE - - //! @deprecated general purpose assertion with user-specified ID - //! number that **always** evaluates the `expr_` expression. - #define Q_ALLEGE_ID(id_, expr_) ((void)(expr_)) - -#else // QP FuSa Subsystem enabled - - //! @deprecated general purpose assertion with user-specified ID - //! number that **always** evaluates the `expr_` expression. - //! @note - //! The use of this macro is no longer recommended. - #define Q_ALLEGE_ID(id_, expr_) if (!(expr_)) { \ - QF_CRIT_STAT \ - QF_CRIT_ENTRY(); \ - Q_onError(&Q_this_module_[0], (id_)); \ - QF_CRIT_EXIT(); \ - } else ((void)0) - -#endif - -//! @deprecated general purpose assertion without ID number -//! that **always** evaluates the `expr_` expression. -//! Instead of ID number, this macro is based on the standard -//! `__LINE__` macro. -//! -//! @note The use of this macro is no longer recommended. -#define Q_ALLEGE(expr_) Q_ALLEGE_ID(__LINE__, (expr_)) - -//! Static (compile-time) assertion. -//! -//! @deprecated -//! Use Q_ASSERT_STATIC() or better yet `static_assert()` instead. -//! -#define Q_ASSERT_COMPILE(expr_) Q_ASSERT_STATIC(expr_) - -//! @deprecated use QP::QF::NO_MARGIN instead -#define QF_NO_MARGIN QP::QF::NO_MARGIN - -//============================================================================ -#if (QP_API_VERSION < 691) - -//! @deprecated enable the QS global filter -#define QS_FILTER_ON(rec_) QS_GLB_FILTER((rec_)) - -//! @deprecated disable the QS global filter -#define QS_FILTER_OFF(rec_) QS_GLB_FILTER(-(rec_)) - -//! @deprecated enable the QS local filter for SM (state machine) object -#define QS_FILTER_SM_OBJ(obj_) (static_cast<void>(0)) - -//! @deprecated enable the QS local filter for AO (active objects) -#define QS_FILTER_AO_OBJ(obj_) (static_cast<void>(0)) - -//! @deprecated enable the QS local filter for MP (memory pool) object -#define QS_FILTER_MP_OBJ(obj_) (static_cast<void>(0)) - -//! @deprecated enable the QS local filter for EQ (event queue) object -#define QS_FILTER_EQ_OBJ(obj_) (static_cast<void>(0)) - -//! @deprecated enable the QS local filter for TE (time event) object -#define QS_FILTER_TE_OBJ(obj_) (static_cast<void>(0)) - -#ifdef Q_SPY - -//! @deprecated local Filter for a generic application object `obj_`. -#define QS_FILTER_AP_OBJ(obj_) \ - (QP::QS::filt_.loc_AP = (obj_)) - -//! @deprecated begin of a user QS record, instead use QS_BEGIN_ID() -#define QS_BEGIN(rec_, obj_) \ - if (QS_GLB_FILTER_(rec_) && \ - ((QP::QS::filt_.loc[QP::QS::AP_OBJ] == nullptr) \ - || (QP::QS::filt_.loc_AP == (obj_)))) \ - { \ - QS_CRIT_STAT \ - QS_CRIT_ENTRY(); \ - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(rec_)); \ - QS_TIME_PRE_(); - -//! @deprecated output hex-formatted std::uint32_t to the QS record -#define QS_U32_HEX(width_, data_) \ - (QP::QS::u32_fmt_(static_cast<std::uint8_t>( \ - (static_cast<std::uint8_t>((width_) << 4)) | QS_HEX_FMT), (data_))) - -#else - -#define QS_FILTER_AP_OBJ(obj_) (static_cast<void>(0)) -#define QS_BEGIN(rec_, obj_) if (false) { -#define QS_U32_HEX(width_, data_) (Q_UNUSED_PAR(0)) - -#endif // def Q_SPY - -//============================================================================ -#if (QP_API_VERSION < 680) - -//! @deprecated -//! Macro to specify a tran. in the "me->" impl-strategy. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! you call tran(Q_STATE_CAST(target_)). -#define Q_TRAN(target_) (me->tran(Q_STATE_CAST(target_))) - -//! @deprecated -//! Macro to specify a tran-to-history in the "me->" impl-strategy. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! you call tran_hist(Q_STATE_CAST(hist_)). -#define Q_TRAN_HIST(hist_) (me->tran_hist((hist_))) - -//! @deprecated -//! Macro to specify the superstate in the "me->" impl-strategy. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! you call super(state_)). -#define Q_SUPER(state_) (me->super(Q_STATE_CAST(state_))) - -//! @deprecated -//! Macro to call in a QM state entry-handler. Applicable only to QMSMs. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_entry(Q_STATE_CAST(state_)). -#define QM_ENTRY(state_) (me->qm_entry((state_))) - -//! @deprecated -//! Macro to call in a QM state exit-handler. Applicable only to QMSMs. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_exit(Q_STATE_CAST(state_)). -#define QM_EXIT(state_) (me->qm_exit((state_))) - -//! @deprecated -//! Macro to call in a QM submachine exit-handler. Applicable only to QMSMs. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_sm_exit(Q_STATE_CAST(state_)). -#define QM_SM_EXIT(state_) (me->qm_sm_exit((state_))) - -//! @deprecated -//! Macro to call in a QM state-handler when it executes a tran. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_tran((tatbl_)). -#define QM_TRAN(tatbl_) (me->qm_tran((tatbl_))) - -//! @deprecated -//! Macro to call in a QM state-handler when it executes an initial tran. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_tran_init((tatbl_)). -#define QM_TRAN_INIT(tatbl_) (me->qm_tran_init((tatbl_))) - -//! @deprecated -//! Macro to call in a QM state-handler when it executes a tran-to-history. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_tran_hist((history_), (tatbl_)). -#define QM_TRAN_HIST(history_, tatbl_) \ - (me->qm_tran_hist((history_), (tatbl_))) - -//! @deprecated -//! Macro to call in a QM state-handler when it executes an initial tran. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_tran_ep((tatbl_)). -#define QM_TRAN_EP(tatbl_) (me->qm_tran_ep((tatbl_))) - -//! @deprecated -//! Macro to call in a QM state-handler when it executes a tran-to-exit-point. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_tran_xp((xp_), (tatbl_)). -#define QM_TRAN_XP(xp_, tatbl_) (me->qm_tran_xp((xp_), (tatbl_))) - -//! @deprecated -//! Designates the superstate of a given state in a subclass of QP::QMsm. -//! Instead use the new impl-strategy without the "me->" pointer, where -//! the QM-generated code calls qm_super_sub((state_)). -#define QM_SUPER_SUB(state_) (me->qm_super_sub((state_))) - -#endif // QP_API_VERSION < 680 -#endif // QP_API_VERSION < 691 -#endif // QP_API_VERSION < 700 - -#endif // QPCPP_HPP_ - - - - - - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -//============================================================================ -//! @cond INTERNAL - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qep_hsm") - -// immutable events corresponding to the reserved signals. -static QP::QEvt const l_reservedEvt_[4] { - QP::QEvt(static_cast<QP::QSignal>(QP::QHsm::Q_EMPTY_SIG)), - QP::QEvt(static_cast<QP::QSignal>(QP::QHsm::Q_ENTRY_SIG)), - QP::QEvt(static_cast<QP::QSignal>(QP::QHsm::Q_EXIT_SIG)), - QP::QEvt(static_cast<QP::QSignal>(QP::QHsm::Q_INIT_SIG)) -}; - -} // unnamed namespace - -// helper macro to handle reserved event in an QHsm -#define QHSM_RESERVED_EVT_(state_, sig_) \ - ((*(state_))(this, &l_reservedEvt_[(sig_)])) - -// helper macro to trace state entry -#define QS_STATE_ENTRY_(state_, qs_id_) \ - QS_CRIT_ENTRY(); \ - QS_MEM_SYS(); \ - QS_BEGIN_PRE_(QS_QEP_STATE_ENTRY, (qs_id_)) \ - QS_OBJ_PRE_(this); \ - QS_FUN_PRE_(state_); \ - QS_END_PRE_() \ - QS_MEM_APP(); \ - QS_CRIT_EXIT() - -// helper macro to trace state exit -#define QS_STATE_EXIT_(state_, qs_id_) \ - QS_CRIT_ENTRY(); \ - QS_MEM_SYS(); \ - QS_BEGIN_PRE_(QS_QEP_STATE_EXIT, (qs_id_)) \ - QS_OBJ_PRE_(this); \ - QS_FUN_PRE_(state_); \ - QS_END_PRE_() \ - QS_MEM_APP(); \ - QS_CRIT_EXIT() - -//! @endcond -//============================================================================ - -$define ${QEP::versionStr[]} - -$define ${QEP::QHsm} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -//============================================================================ -//! @cond INTERNAL - -// unnamed namespace for local definitions with internal linkage -namespace { - -Q_DEFINE_THIS_MODULE("qep_msm") - -// top-state object for QMsm-style state machines -QP::QMState const l_msm_top_s = { - nullptr, - nullptr, - nullptr, - nullptr, - nullptr -}; - -static constexpr std::int_fast8_t MAX_ENTRY_DEPTH_ {4}; - -} // unnamed namespace - -//! @endcond -//============================================================================ - -$define ${QEP::QMsm} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_MODULE("qf_act") -} // unnamed namespace - -$define ${QF::QActive::registry_[QF_MAX_ACTIVE + 1U]} - -$define ${QF::QF-pkg} - -$define ${QF::types::QF_LOG2} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -//============================================================================ -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_actq") -} // unnamed namespace - -$define ${QF::QActive::post_} - -$define ${QF::QActive::postLIFO} - -$define ${QF::QActive::get_} - -$define ${QF::QTicker} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_defer") -} // unnamed namespace - -$define ${QF::QActive::defer} - -$define ${QF::QActive::recall} - -$define ${QF::QActive::flushDeferred} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -#if (QF_MAX_EPOOL > 0U) // mutable events configured? - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_dyn") -} // unnamed namespace - -$define ${QF::QF-dyn} - -#endif // (QF_MAX_EPOOL > 0U) mutable events configured - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_mem") -} // unnamed namespace - -$define ${QF::QMPool} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_qact") -} // unnamed namespace - -$define ${QF::QActive::QActive} - -$define ${QF::QActive::register_} - -$define ${QF::QActive::unregister_} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -//Q_DEFINE_THIS_MODULE("qf_qmact") -} // unnamed namespace - -$define ${QF::QMActive} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_qeq") -} // unnamed namespace - -$define ${QF::QEQueue} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_ps") -} // unnamed namespace - -$define ${QF::QActive::subscrList_} - -$define ${QF::QActive::maxPubSignal_} - -$define ${QF::QActive::psInit} - -$define ${QF::QActive::publish_} - -$define ${QF::QActive::subscribe} - -$define ${QF::QActive::unsubscribe} - -$define ${QF::QActive::unsubscribeAll} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qf_time") -} // unnamed namespace - -$define ${QF::QTimeEvt} - - - - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QV_HPP_ - #error "Source file included in a project NOT based on the QV kernel" -#endif // QV_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qv") -} // unnamed namespace - -$define ${QV::QV-base} - -$define ${QV::QF-cust} - -$define ${QV::QActive} - - - - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QK_HPP_ - #error "Source file included in a project NOT based on the QK kernel" -#endif // QK_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qk") -} // unnamed namespace - -$define ${QK::QK-base} - -extern "C" { -$define ${QK-extern-C} -} // extern "C" - -$define ${QK::QF-cust} - -$define ${QK::QActive} - - - - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QXK_HPP_ - #error "Source file included in a project NOT based on the QXK kernel" -#endif // QXK_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qxk") -} // unnamed namespace - -$define ${QXK::QXK-base} - -extern "C" { -$define ${QXK-extern-C} -} // extern "C" - -$define ${QXK::QF-cust} - -$define ${QXK::QActive} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QXK_HPP_ - #error "Source file included in a project NOT based on the QXK kernel" -#endif // QXK_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qxk_mutex") -} // unnamed namespace - -$define ${QXK::QXMutex} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QXK_HPP_ - #error "Source file included in a project NOT based on the QXK kernel" -#endif // QXK_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qxk_sema") -} // unnamed namespace - -$define ${QXK::QXSemaphore} - - - - #define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#ifdef Q_SPY // QS software tracing enabled? - #include "qs_port.hpp" // QS port - #include "qs_pkg.hpp" // QS facilities for pre-defined trace records -#else - #include "qs_dummy.hpp" // disable the QS software tracing -#endif // Q_SPY - -// protection against including this source file in a wrong project -#ifndef QXK_HPP_ - #error "Source file included in a project NOT based on the QXK kernel" -#endif // QXK_HPP_ - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qxk_xthr") -} // unnamed namespace - -$define ${QXK::QXThread} - - - - - - - #define QP_IMPL // this is QP implementation -#include "qs_port.hpp" // QS port -#include "qs_pkg.hpp" // QS package-scope internal interface -#include "qstamp.hpp" // QP time-stamp -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qs") -} // unnamed namespace - -$define ${QS::QS-TX} - -#ifndef QF_MEM_ISOLATE -$define ${QS::filters} -#endif - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -//............................................................................ -Attr priv_; - -//............................................................................ -void glbFilter_(std::int_fast16_t const filter) noexcept { - bool const isRemove = (filter < 0); - std::uint16_t const rec = isRemove - ? static_cast<std::uint16_t>(-filter) - : static_cast<std::uint16_t>(filter); - switch (rec) { - case QS_ALL_RECORDS: { - std::uint8_t const tmp = (isRemove ? 0x00U : 0xFFU); - std::uint_fast8_t i; - // set all global filters (partially unrolled loop) - for (i = 0U; i < Q_DIM(filt_.glb); i += 4U) { - filt_.glb[i ] = tmp; - filt_.glb[i + 1U] = tmp; - filt_.glb[i + 2U] = tmp; - filt_.glb[i + 3U] = tmp; - } - if (isRemove) { - // leave the "not maskable" filters enabled, - // see qs.h, Miscellaneous QS records (not maskable) - // - filt_.glb[0] = 0x01U; - filt_.glb[6] = 0x40U; - filt_.glb[7] = 0xFCU; - filt_.glb[8] = 0x7FU; - } - else { - // never turn the last 3 records on (0x7D, 0x7E, 0x7F) - filt_.glb[15] = 0x1FU; - } - break; - } - case QS_SM_RECORDS: - if (isRemove) { - filt_.glb[0] &= static_cast<std::uint8_t>(~0xFEU & 0xFFU); - filt_.glb[1] &= static_cast<std::uint8_t>(~0x03U & 0xFFU); - filt_.glb[6] &= static_cast<std::uint8_t>(~0x80U & 0xFFU); - filt_.glb[7] &= static_cast<std::uint8_t>(~0x03U & 0xFFU); - } - else { - filt_.glb[0] |= 0xFEU; - filt_.glb[1] |= 0x03U; - filt_.glb[6] |= 0x80U; - filt_.glb[7] |= 0x03U; - } - break; - case QS_AO_RECORDS: - if (isRemove) { - filt_.glb[1] &= static_cast<std::uint8_t>(~0xFCU & 0xFFU); - filt_.glb[2] &= static_cast<std::uint8_t>(~0x07U & 0xFFU); - filt_.glb[5] &= static_cast<std::uint8_t>(~0x20U & 0xFFU); - } - else { - filt_.glb[1] |= 0xFCU; - filt_.glb[2] |= 0x07U; - filt_.glb[5] |= 0x20U; - } - break; - case QS_EQ_RECORDS: - if (isRemove) { - filt_.glb[2] &= static_cast<std::uint8_t>(~0x78U & 0xFFU); - filt_.glb[5] &= static_cast<std::uint8_t>(~0x40U & 0xFFU); - } - else { - filt_.glb[2] |= 0x78U; - filt_.glb[5] |= 0x40U; - } - break; - case QS_MP_RECORDS: - if (isRemove) { - filt_.glb[3] &= static_cast<std::uint8_t>(~0x03U & 0xFFU); - filt_.glb[5] &= static_cast<std::uint8_t>(~0x80U & 0xFFU); - } - else { - filt_.glb[3] |= 0x03U; - filt_.glb[5] |= 0x80U; - } - break; - case QS_QF_RECORDS: - if (isRemove) { - filt_.glb[2] &= static_cast<std::uint8_t>(~0x80U & 0xFFU); - filt_.glb[3] &= static_cast<std::uint8_t>(~0xFCU & 0xFFU); - filt_.glb[4] &= static_cast<std::uint8_t>(~0xC0U & 0xFFU); - filt_.glb[5] &= static_cast<std::uint8_t>(~0x1FU & 0xFFU); - } - else { - filt_.glb[2] |= 0x80U; - filt_.glb[3] |= 0xFCU; - filt_.glb[4] |= 0xC0U; - filt_.glb[5] |= 0x1FU; - } - break; - case QS_TE_RECORDS: - if (isRemove) { - filt_.glb[4] &= static_cast<std::uint8_t>(~0x3FU & 0xFFU); - } - else { - filt_.glb[4] |= 0x3FU; - } - break; - case QS_SC_RECORDS: - if (isRemove) { - filt_.glb[6] &= static_cast<std::uint8_t>(~0x3FU & 0xFFU); - } - else { - filt_.glb[6] |= 0x3FU; - } - break; - case QS_SEM_RECORDS: - if (isRemove) { - filt_.glb[8] &= static_cast<std::uint8_t>(~0x80U & 0xFFU); - filt_.glb[9] &= static_cast<std::uint8_t>(~0x07U & 0xFFU); - } - else { - filt_.glb[8] |= 0x80U; - filt_.glb[9] |= 0x07U; - } - break; - case QS_MTX_RECORDS: - if (isRemove) { - filt_.glb[9] &= static_cast<std::uint8_t>(~0xF8U & 0xFFU); - filt_.glb[10] &= static_cast<std::uint8_t>(~0x01U & 0xFFU); - } - else { - filt_.glb[9] |= 0xF8U; - filt_.glb[10] |= 0x01U; - } - break; - case QS_U0_RECORDS: - if (isRemove) { - filt_.glb[12] &= static_cast<std::uint8_t>(~0xF0U & 0xFFU); - filt_.glb[13] &= static_cast<std::uint8_t>(~0x01U & 0xFFU); - } - else { - filt_.glb[12] |= 0xF0U; - filt_.glb[13] |= 0x01U; - } - break; - case QS_U1_RECORDS: - if (isRemove) { - filt_.glb[13] &= static_cast<std::uint8_t>(~0x3EU & 0xFFU); - } - else { - filt_.glb[13] |= 0x3EU; - } - break; - case QS_U2_RECORDS: - if (isRemove) { - filt_.glb[13] &= static_cast<std::uint8_t>(~0xC0U & 0xFFU); - filt_.glb[14] &= static_cast<std::uint8_t>(~0x07U & 0xFFU); - } - else { - filt_.glb[13] |= 0xC0U; - filt_.glb[14] |= 0x07U; - } - break; - case QS_U3_RECORDS: - if (isRemove) { - filt_.glb[14] &= static_cast<std::uint8_t>(~0xF8U & 0xFFU); - } - else { - filt_.glb[14] |= 0xF8U; - } - break; - case QS_U4_RECORDS: - if (isRemove) { - filt_.glb[15] &= static_cast<std::uint8_t>(~0x1FU & 0xFFU); - } - else { - filt_.glb[15] |= 0x1FU; - } - break; - case QS_UA_RECORDS: - if (isRemove) { - filt_.glb[12] &= static_cast<std::uint8_t>(~0xF0U & 0xFFU); - filt_.glb[13] = 0U; - filt_.glb[14] = 0U; - filt_.glb[15] &= static_cast<std::uint8_t>(~0x1FU & 0xFFU); - } - else { - filt_.glb[12] |= 0xF0U; - filt_.glb[13] |= 0xFFU; - filt_.glb[14] |= 0xFFU; - filt_.glb[15] |= 0x1FU; - } - break; - default: { - QS_CRIT_STAT - QS_CRIT_ENTRY(); - // QS rec number must be below 0x7D, so no need for escaping - Q_ASSERT_INCRIT(210, rec < 0x7DU); - QS_CRIT_EXIT(); - - if (isRemove) { - filt_.glb[rec >> 3U] - &= static_cast<std::uint8_t>(~(1U << (rec & 7U)) & 0xFFU); - } - else { - filt_.glb[rec >> 3U] - |= static_cast<std::uint8_t>(1U << (rec & 7U)); - // never turn the last 3 records on (0x7D, 0x7E, 0x7F) - filt_.glb[15] &= 0x1FU; - } - break; - } - } -} - -//............................................................................ -void locFilter_(std::int_fast16_t const filter) noexcept { - bool const isRemove = (filter < 0); - std::uint16_t const qs_id = isRemove - ? static_cast<std::uint16_t>(-filter) - : static_cast<std::uint16_t>(filter); - std::uint8_t const tmp = (isRemove ? 0x00U : 0xFFU); - std::uint_fast8_t i; - switch (qs_id) { - case QS_ALL_IDS: - // set all local filters (partially unrolled loop) - for (i = 0U; i < Q_DIM(filt_.loc); i += 4U) { - filt_.loc[i ] = tmp; - filt_.loc[i + 1U] = tmp; - filt_.loc[i + 2U] = tmp; - filt_.loc[i + 3U] = tmp; - } - break; - case QS_AO_IDS: - for (i = 0U; i < 8U; i += 4U) { - filt_.loc[i ] = tmp; - filt_.loc[i + 1U] = tmp; - filt_.loc[i + 2U] = tmp; - filt_.loc[i + 3U] = tmp; - } - break; - case QS_EP_IDS: - i = 8U; - filt_.loc[i ] = tmp; - filt_.loc[i + 1U] = tmp; - break; - case QS_AP_IDS: - i = 12U; - filt_.loc[i ] = tmp; - filt_.loc[i + 1U] = tmp; - filt_.loc[i + 2U] = tmp; - filt_.loc[i + 3U] = tmp; - break; - default: { - QS_CRIT_STAT - QS_CRIT_ENTRY(); - // qs_id must be in range - Q_ASSERT_INCRIT(310, qs_id < 0x7FU); - QS_CRIT_EXIT(); - if (isRemove) { - filt_.loc[qs_id >> 3U] &= - static_cast<std::uint8_t>( - ~(1U << (qs_id & 7U)) & 0xFFU); - } - else { - filt_.loc[qs_id >> 3U] - |= (1U << (qs_id & 7U)); - } - break; - } - } - filt_.loc[0] |= 0x01U; // leave QS_ID == 0 always on -} - -//............................................................................ -void beginRec_(std::uint_fast8_t const rec) noexcept { - std::uint8_t const b = priv_.seq + 1U; - std::uint8_t chksum = 0U; // reset the checksum - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.seq = b; // store the incremented sequence num - priv_.used = (priv_.used + 2U); // 2 bytes about to be added - - QS_INSERT_ESC_BYTE_(b) - - chksum += static_cast<std::uint8_t>(rec); - QS_INSERT_BYTE_(static_cast<std::uint8_t>(rec)) // no need for escaping - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void endRec_() noexcept { - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; - QSCtr const end = priv_.end; - std::uint8_t b = priv_.chksum; - b ^= 0xFFU; // invert the bits in the checksum - - priv_.used = (priv_.used + 2U); // 2 bytes about to be added - - if ((b != QS_FRAME) && (b != QS_ESC)) { - QS_INSERT_BYTE_(b) - } - else { - QS_INSERT_BYTE_(QS_ESC) - QS_INSERT_BYTE_(b ^ QS_ESC_XOR) - priv_.used = (priv_.used + 1U); // account for the ESC byte - } - - QS_INSERT_BYTE_(QS_FRAME) // do not escape this QS_FRAME - - priv_.head = head; // save the head - if (priv_.used > end) { // overrun over the old data? - priv_.used = end; // the whole buffer is used - priv_.tail = head; // shift the tail to the old data - } -} - -//............................................................................ -void u8_raw_(std::uint8_t const d) noexcept { - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 1U); // 1 byte about to be added - QS_INSERT_ESC_BYTE_(d) - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void u8u8_raw_( - std::uint8_t const d1, - std::uint8_t const d2) noexcept -{ - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 2U); // 2 bytes about to be added - QS_INSERT_ESC_BYTE_(d1) - QS_INSERT_ESC_BYTE_(d2) - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void u16_raw_(std::uint16_t d) noexcept { - std::uint8_t b = static_cast<std::uint8_t>(d); - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 2U); // 2 bytes about to be added - - QS_INSERT_ESC_BYTE_(b) - - d >>= 8U; - b = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(b) - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void u32_raw_(std::uint32_t d) noexcept { - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 4U); // 4 bytes about to be added - for (std::uint_fast8_t i = 4U; i != 0U; --i) { - std::uint8_t const b = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(b) - d >>= 8U; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void obj_raw_(void const * const obj) noexcept { - #if (QS_OBJ_PTR_SIZE == 1U) - u8_raw_(reinterpret_cast<std::uint8_t>(obj)); - #elif (QS_OBJ_PTR_SIZE == 2U) - u16_raw_(reinterpret_cast<std::uint16_t>(obj)); - #elif (QS_OBJ_PTR_SIZE == 4U) - u32_raw_(reinterpret_cast<std::uint32_t>(obj)); - #elif (QS_OBJ_PTR_SIZE == 8U) - u64_raw_(reinterpret_cast<std::uint64_t>(obj)); - #else - u32_raw_(reinterpret_cast<std::uint32_t>(obj)); - #endif -} - -//............................................................................ -void str_raw_(char const * s) noexcept { - std::uint8_t b = static_cast<std::uint8_t>(*s); - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - QSCtr used = priv_.used; // put in a temporary (register) - - while (b != 0U) { - chksum += b; // update checksum - QS_INSERT_BYTE_(b) // ASCII characters don't need escaping - ++s; - b = static_cast<std::uint8_t>(*s); - ++used; - } - QS_INSERT_BYTE_(0U) // zero-terminate the string - ++used; - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum - priv_.used = used; // save # of used buffer space -} - -//............................................................................ -void u8_fmt_( - std::uint8_t const format, - std::uint8_t const d) noexcept -{ - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t *const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 2U); // 2 bytes about to be added - - QS_INSERT_ESC_BYTE_(format) - QS_INSERT_ESC_BYTE_(d) - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void u16_fmt_( - std::uint8_t format, - std::uint16_t d) noexcept -{ - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 3U); // 3 bytes about to be added - - QS_INSERT_ESC_BYTE_(format) - - format = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(format) - - d >>= 8U; - format = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(format) - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void u32_fmt_( - std::uint8_t format, - std::uint32_t d) noexcept -{ - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + 5U); // 5 bytes about to be added - QS_INSERT_ESC_BYTE_(format) // insert the format byte - - for (std::uint_fast8_t i = 4U; i != 0U; --i) { - format = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(format) - d >>= 8U; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void str_fmt_(char const * s) noexcept { - std::uint8_t b = static_cast<std::uint8_t>(*s); - std::uint8_t chksum = static_cast<std::uint8_t>( - priv_.chksum + static_cast<std::uint8_t>(STR_T)); - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - QSCtr used = priv_.used; // put in a temporary (register) - - used += 2U; // the format byte and the terminating-0 - - QS_INSERT_BYTE_(static_cast<std::uint8_t>(STR_T)) - while (b != 0U) { - // ASCII characters don't need escaping - chksum += b; // update checksum - QS_INSERT_BYTE_(b) - ++s; - b = static_cast<std::uint8_t>(*s); - ++used; - } - QS_INSERT_BYTE_(0U) // zero-terminate the string - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum - priv_.used = used; // save # of used buffer space -} - -//............................................................................ -void mem_fmt_( - std::uint8_t const * blk, - std::uint8_t size) noexcept -{ - std::uint8_t b = static_cast<std::uint8_t>(MEM_T); - std::uint8_t chksum = priv_.chksum + b; - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - priv_.used = (priv_.used + size + 2U); // size+2 bytes to be added - - QS_INSERT_BYTE_(b) - QS_INSERT_ESC_BYTE_(size) - - // output the 'size' number of bytes - for (; size != 0U; --size) { - b = *blk; - QS_INSERT_ESC_BYTE_(b) - ++blk; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//............................................................................ -void sig_dict_pre_( - QSignal const sig, - void const * const obj, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_SIG_DICT)); - QS_SIG_PRE_(sig); - QS_OBJ_PRE_(obj); - QS_STR_PRE_((*name == '&') ? &name[1] : name); - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void obj_dict_pre_( - void const * const obj, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_OBJ_DICT)); - QS_OBJ_PRE_(obj); - QS_STR_PRE_((*name == '&') ? &name[1] : name); - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void obj_arr_dict_pre_( - void const * const obj, - std::uint_fast16_t const idx, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - Q_REQUIRE_INCRIT(400, idx < 1000U); - QS_CRIT_EXIT(); - - // format idx into a char buffer as "xxx\0" - std::uint8_t idx_str[4]; - std::uint_fast16_t tmp = idx; - std::uint8_t i; - idx_str[3] = 0U; // zero-terminate - idx_str[2] = static_cast<std::uint8_t>( - static_cast<std::uint8_t>('0') + (tmp % 10U)); - tmp /= 10U; - idx_str[1] = static_cast<std::uint8_t>( - static_cast<std::uint8_t>('0') + (tmp % 10U)); - if (idx_str[1] == static_cast<std::uint8_t>('0')) { - i = 2U; - } - else { - tmp /= 10U; - idx_str[0] = static_cast<std::uint8_t>( - static_cast<std::uint8_t>('0') + (tmp % 10U)); - if (idx_str[0] == static_cast<std::uint8_t>('0')) { - i = 1U; - } - else { - i = 0U; - } - } - - std::uint8_t j = ((*name == '&') ? 1U : 0U); - - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_OBJ_DICT)); - QS_OBJ_PRE_(obj); - for (; name[j] != '\0'; ++j) { - QS_U8_PRE_(name[j]); - if (name[j] == '[') { - ++j; - break; - } - } - for (; idx_str[i] != 0U; ++i) { - QS_U8_PRE_(idx_str[i]); - } - // skip chars until ']' - for (; name[j] != '\0'; ++j) { - if (name[j] == ']') { - break; - } - } - for (; name[j] != '\0'; ++j) { - QS_U8_PRE_(name[j]); - } - QS_U8_PRE_(0U); // zero-terminate - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void fun_dict_pre_( - QSpyFunPtr fun, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_FUN_DICT)); - QS_FUN_PRE_(fun); - QS_STR_PRE_((*name == '&') ? &name[1] : name); - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void usr_dict_pre_( - enum_t const rec, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_USR_DICT)); - QS_U8_PRE_(rec); - QS_STR_PRE_(name); - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void enum_dict_pre_( - enum_t const value, - std::uint8_t const group, - char const * const name) noexcept -{ - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - - beginRec_(static_cast<std::uint_fast8_t>(QS_ENUM_DICT)); - QS_2U8_PRE_(static_cast<std::uint8_t>(value), group); - QS_STR_PRE_(name); - endRec_(); - - QS_MEM_APP(); - QS_CRIT_EXIT(); - onFlush(); -} - -//............................................................................ -void assertion_pre_( - char const * const module, - int_t const id, - std::uint32_t const delay) noexcept -{ - // NOTE: called in a critical section - - beginRec_(static_cast<std::uint_fast8_t>(QS_ASSERT_FAIL)); - QS_TIME_PRE_(); - QS_U16_PRE_(id); - QS_STR_PRE_((module != nullptr) ? module : "?"); - endRec_(); - onFlush(); - - // busy-wait until all QS data makes it over to the host - for (std::uint32_t volatile ctr = delay; ctr > 0U; ) { - ctr = (ctr - 1U); - } - QS::onCleanup(); -} - -//............................................................................ -void crit_entry_pre_() noexcept { - beginRec_(static_cast<std::uint_fast8_t>(QS_QF_CRIT_ENTRY)); - QS_TIME_PRE_(); - priv_.critNest = (priv_.critNest + 1U); - QS_U8_PRE_(priv_.critNest); - endRec_(); -} - -//............................................................................ -void crit_exit_pre_() noexcept { - beginRec_(static_cast<std::uint_fast8_t>(QS_QF_CRIT_EXIT)); - QS_TIME_PRE_(); - QS_U8_PRE_(QS::priv_.critNest); - priv_.critNest = (priv_.critNest - 1U); - endRec_(); -} - -//............................................................................ -void isr_entry_pre_( - std::uint8_t const isrnest, - std::uint8_t const prio) noexcept -{ - beginRec_(static_cast<std::uint_fast8_t>(QS_QF_ISR_ENTRY)); - QS_TIME_PRE_(); - QS_U8_PRE_(isrnest); - QS_U8_PRE_(prio); - endRec_(); -} - -//............................................................................ -void isr_exit_pre_( - std::uint8_t const isrnest, - std::uint8_t const prio) noexcept -{ - beginRec_(static_cast<std::uint_fast8_t>(QS_QF_ISR_EXIT)); - QS_TIME_PRE_(); - QS_U8_PRE_(isrnest); - QS_U8_PRE_(prio); - endRec_(); -} - -//............................................................................ -void target_info_pre_(std::uint8_t const isReset) { - // NOTE: called in a critical section - - static constexpr std::uint8_t ZERO = static_cast<std::uint8_t>('0'); - static std::uint8_t const * const TIME = - reinterpret_cast<std::uint8_t const *>(&BUILD_TIME[0]); - static std::uint8_t const * const DATE = - reinterpret_cast<std::uint8_t const *>(&BUILD_DATE[0]); - - beginRec_(static_cast<std::uint_fast8_t>(QS_TARGET_INFO)); - u8_raw_(isReset); - - static union { - std::uint16_t u16; - std::uint8_t u8[2]; - } endian_test; - endian_test.u16 = 0x0102U; - // big endian ? add the 0x8000U flag - QS_U16_PRE_(((endian_test.u8[0] == 0x01U) - ? (0x8000U | QP_VERSION) - : QP_VERSION)); // target endianness + version number - - // send the object sizes... - u8_raw_(Q_SIGNAL_SIZE - | static_cast<std::uint8_t>(QF_EVENT_SIZ_SIZE << 4U)); - -#ifdef QF_EQUEUE_CTR_SIZE - u8_raw_(QF_EQUEUE_CTR_SIZE - | static_cast<std::uint8_t>(QF_TIMEEVT_CTR_SIZE << 4U)); -#else - QS::u8_raw_(static_cast<std::uint8_t>(QF_TIMEEVT_CTR_SIZE << 4U)); -#endif // ifdef QF_EQUEUE_CTR_SIZE - -#ifdef QF_MPOOL_CTR_SIZE - QS::u8_raw_(QF_MPOOL_SIZ_SIZE - | static_cast<std::uint8_t>(QF_MPOOL_CTR_SIZE << 4U)); -#else - QS::u8_raw_(0U); -#endif // ifdef QF_MPOOL_CTR_SIZE - - QS::u8_raw_(QS_OBJ_PTR_SIZE | (QS_FUN_PTR_SIZE << 4U)); - QS::u8_raw_(QS_TIME_SIZE); - - // send the limits... - QS::u8_raw_(QF_MAX_ACTIVE); - QS::u8_raw_(QF_MAX_EPOOL | (QF_MAX_TICK_RATE << 4U)); - - // send the build time in three bytes (sec, min, hour)... - QS::u8_raw_((10U * (TIME[6] - ZERO)) + (TIME[7] - ZERO)); - QS::u8_raw_((10U * (TIME[3] - ZERO)) + (TIME[4] - ZERO)); - if (BUILD_TIME[0] == static_cast<std::uint8_t>(' ')) { - QS::u8_raw_(TIME[1] - ZERO); - } - else { - QS::u8_raw_((10U * (TIME[0] - ZERO)) + (TIME[1] - ZERO)); - } - - // send the build date in three bytes (day, month, year) ... - if (BUILD_DATE[4] == static_cast<std::uint8_t>(' ')) { - QS::u8_raw_(DATE[5] - ZERO); - } - else { - QS::u8_raw_((10U * (DATE[4] - ZERO)) + (DATE[5] - ZERO)); - } - // convert the 3-letter month to a number 1-12 ... - std::uint8_t b; - switch (DATE[0] + DATE[1] + DATE[2]) { - case 'J' + 'a' +'n': - b = 1U; - break; - case 'F' + 'e' + 'b': - b = 2U; - break; - case 'M' + 'a' +'r': - b = 3U; - break; - case 'A' + 'p' + 'r': - b = 4U; - break; - case 'M' + 'a' + 'y': - b = 5U; - break; - case 'J' + 'u' + 'n': - b = 6U; - break; - case 'J' + 'u' + 'l': - b = 7U; - break; - case 'A' + 'u' + 'g': - b = 8U; - break; - case 'S' + 'e' + 'p': - b = 9U; - break; - case 'O' + 'c' + 't': - b = 10U; - break; - case 'N' + 'o' + 'v': - b = 11U; - break; - case 'D' + 'e' + 'c': - b = 12U; - break; - default: - b = 0U; - break; - } - QS::u8_raw_(b); // store the month - QS::u8_raw_((10U * (DATE[9] - ZERO)) + (DATE[10] - ZERO)); - QS::endRec_(); -} - -} // namespace QS -} // namespace QP - -//! @endcond - - - - #define QP_IMPL // this is QF/QK implementation -#include "qs_port.hpp" // QS port -#include "qs_pkg.hpp" // QS package-scope internal interface - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -//${QS::QS-tx-64bit::u64_raw_} ............................................... -void u64_raw_(std::uint64_t d) noexcept { - std::uint8_t chksum = priv_.chksum; - std::uint8_t * const buf = priv_.buf; - QSCtr head = priv_.head; - QSCtr const end = priv_.end; - - priv_.used = (priv_.used + 8U); // 8 bytes are about to be added - for (std::int_fast8_t i = 8U; i != 0U; --i) { - std::uint8_t const b = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(b) - d >>= 8U; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//${QS::QS-tx-64bit::u64_fmt_} ............................................... -void u64_fmt_( - std::uint8_t format, - std::uint64_t d) noexcept -{ - std::uint8_t chksum = priv_.chksum; - std::uint8_t * const buf = priv_.buf; - QSCtr head = priv_.head; - QSCtr const end = priv_.end; - - priv_.used = (priv_.used + 9U); // 9 bytes are about to be added - QS_INSERT_ESC_BYTE_(format) // insert the format byte - - for (std::int_fast8_t i = 8U; i != 0U; --i) { - format = static_cast<std::uint8_t>(d); - QS_INSERT_ESC_BYTE_(format) - d >>= 8U; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -} // namespace QS -} // namespace QP - -//! @endcond - - - - #define QP_IMPL // this is QF/QK implementation -#include "qs_port.hpp" // QS port -#include "qs_pkg.hpp" // QS package-scope internal interface - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -//${QS::QS-tx-fp::f32_fmt_} .................................................. -void f32_fmt_( - std::uint8_t format, - float32_t f) noexcept -{ - union F32Rep { - float32_t f; - std::uint32_t u; - } fu32; // the internal binary representation - std::uint8_t chksum = priv_.chksum; // put in a temporary (register) - std::uint8_t * const buf = priv_.buf; // put in a temporary (register) - QSCtr head = priv_.head; // put in a temporary (register) - QSCtr const end = priv_.end; // put in a temporary (register) - - fu32.f = f; // assign the binary representation - - priv_.used = (priv_.used + 5U); // 5 bytes about to be added - QS_INSERT_ESC_BYTE_(format) // insert the format byte - - for (std::uint_fast8_t i = 4U; i != 0U; --i) { - format = static_cast<std::uint8_t>(fu32.u); - QS_INSERT_ESC_BYTE_(format) - fu32.u >>= 8U; - } - - priv_.head = head; // save the head - priv_.chksum = chksum; // save the checksum -} - -//${QS::QS-tx-fp::f64_fmt_} .................................................. -void f64_fmt_( - std::uint8_t format, - float64_t d) noexcept -{ - union F64Rep { - float64_t d; - std::uint32_t u[2]; - } fu64; // the internal binary representation - std::uint8_t chksum = priv_.chksum; - std::uint8_t * const buf = priv_.buf; - QSCtr head = priv_.head; - QSCtr const end = priv_.end; - std::uint32_t i; - // static constant untion to detect endianness of the machine - static union U32Rep { - std::uint32_t u32; - std::uint8_t u8; - } const endian = { 1U }; - - fu64.d = d; // assign the binary representation - - // is this a big-endian machine? - if (endian.u8 == 0U) { - // swap fu64.u[0] <-> fu64.u[1]... - i = fu64.u[0]; - fu64.u[0] = fu64.u[1]; - fu64.u[1] = i; - } - - priv_.used = (priv_.used + 9U); // 9 bytes about to be added - QS_INSERT_ESC_BYTE_(format) // insert the format byte - - // output 4 bytes from fu64.u[0]... - for (i = 4U; i != 0U; --i) { - QS_INSERT_ESC_BYTE_(static_cast<std::uint8_t>(fu64.u[0])) - fu64.u[0] >>= 8U; - } - - // output 4 bytes from fu64.u[1]... - for (i = 4U; i != 0U; --i) { - QS_INSERT_ESC_BYTE_(static_cast<std::uint8_t>(fu64.u[1])) - fu64.u[1] >>= 8U; - } - - priv_.head = head; // update the head - priv_.chksum = chksum; // update the checksum -} - -} // namespace QS -} // namespace QP - -//! @endcond - - - - #define QP_IMPL // this is QP implementation -#include "qs_port.hpp" // QS port -#include "qs_pkg.hpp" // QS package-scope internal interface -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem - -//============================================================================ -//! @cond INTERNAL - -namespace { // unnamed local namespace - -Q_DEFINE_THIS_MODULE("qs_rx") - -//............................................................................ -#if (QS_OBJ_PTR_SIZE == 2U) - using QSObj = std::uint16_t; -#elif (QS_OBJ_PTR_SIZE == 4U) - using QSObj = std::uint32_t; -#elif (QS_OBJ_PTR_SIZE == 8U) - using QSObj = std::uint64_t; -#endif - -struct CmdVar { - std::uint32_t param1; - std::uint32_t param2; - std::uint32_t param3; - std::uint8_t idx; - std::uint8_t cmdId; -}; - -struct TickVar { - std::uint_fast8_t rate; -}; - -struct PeekVar { - std::uint16_t offs; - std::uint8_t size; - std::uint8_t num; - std::uint8_t idx; -}; - -struct PokeVar { - std::uint32_t data; - std::uint16_t offs; - std::uint8_t size; - std::uint8_t num; - std::uint8_t idx; - std::uint8_t fill; -}; - -struct FltVar { - std::uint8_t data[16]; - std::uint8_t idx; - std::uint8_t recId; // global/local -}; - -struct ObjVar { - QSObj addr; - std::uint8_t idx; - std::uint8_t kind; // see qs.hpp, enum QSpyObjKind - std::uint8_t recId; -}; - -struct EvtVar { - QP::QEvt *e; - std::uint8_t *p; - QP::QSignal sig; - std::uint16_t len; - std::uint8_t prio; - std::uint8_t idx; -}; - -// extended-state variables for the current QS-RX state -static struct ExtState { - union Variant { - CmdVar cmd; - TickVar tick; - PeekVar peek; - PokeVar poke; - FltVar flt; - ObjVar obj; - EvtVar evt; -#ifdef Q_UTEST - QP::QS::TProbe tp; -#endif // Q_UTEST - } var; - std::uint8_t state; - std::uint8_t esc; - std::uint8_t seq; - std::uint8_t chksum; -} l_rx; - -enum RxStateEnum : std::uint8_t { - ERROR_STATE, - WAIT4_SEQ, - WAIT4_REC, - WAIT4_INFO_FRAME, - WAIT4_CMD_ID, - WAIT4_CMD_PARAM1, - WAIT4_CMD_PARAM2, - WAIT4_CMD_PARAM3, - WAIT4_CMD_FRAME, - WAIT4_RESET_FRAME, - WAIT4_TICK_RATE, - WAIT4_TICK_FRAME, - WAIT4_PEEK_OFFS, - WAIT4_PEEK_SIZE, - WAIT4_PEEK_NUM, - WAIT4_PEEK_FRAME, - WAIT4_POKE_OFFS, - WAIT4_POKE_SIZE, - WAIT4_POKE_NUM, - WAIT4_POKE_DATA, - WAIT4_POKE_FRAME, - WAIT4_FILL_DATA, - WAIT4_FILL_FRAME, - WAIT4_FILTER_LEN, - WAIT4_FILTER_DATA, - WAIT4_FILTER_FRAME, - WAIT4_OBJ_KIND, - WAIT4_OBJ_ADDR, - WAIT4_OBJ_FRAME, - WAIT4_QUERY_KIND, - WAIT4_QUERY_FRAME, - WAIT4_EVT_PRIO, - WAIT4_EVT_SIG, - WAIT4_EVT_LEN, - WAIT4_EVT_PAR, - WAIT4_EVT_FRAME - -#ifdef Q_UTEST - , - WAIT4_TEST_SETUP_FRAME, - WAIT4_TEST_TEARDOWN_FRAME, - WAIT4_TEST_PROBE_DATA, - WAIT4_TEST_PROBE_ADDR, - WAIT4_TEST_PROBE_FRAME, - WAIT4_TEST_CONTINUE_FRAME -#endif // Q_UTEST -}; - -// internal helper functions... -static void rxParseData_(std::uint8_t const b) noexcept; -static void rxHandleGoodFrame_(std::uint8_t const state); -static void rxHandleBadFrame_(std::uint8_t const state) noexcept; -static void rxReportAck_(enum QP::QSpyRxRecords const recId) noexcept; -static void rxReportError_(std::uint8_t const code) noexcept; -static void rxReportDone_(enum QP::QSpyRxRecords const recId) noexcept; -static void queryCurrObj_(std::uint8_t obj_kind) noexcept; -static void rxPoke_() noexcept; - -// Internal QS-RX function to take a tran. in the QS-RX FSM -static inline void tran_(RxStateEnum const target) noexcept { - l_rx.state = static_cast<std::uint8_t>(target); -} - -} // unnamed namespace - -namespace QP { -namespace QS { -RxAttr rxPriv_; -} // namespace QS -} // namespace QP - -//! @endcond -//============================================================================ - -$define ${QS::QS-RX} - -//============================================================================ -//! @cond INTERNAL -namespace { // unnamed local namespace - -//............................................................................ -static void rxParseData_(std::uint8_t const b) noexcept { - switch (l_rx.state) { - case WAIT4_SEQ: { - ++l_rx.seq; - if (l_rx.seq != b) { // not the expected sequence? - rxReportError_(0x42U); - l_rx.seq = b; // update the sequence - } - tran_(WAIT4_REC); - break; - } - case WAIT4_REC: { - switch (b) { - case QP::QS_RX_INFO: - tran_(WAIT4_INFO_FRAME); - break; - case QP::QS_RX_COMMAND: - tran_(WAIT4_CMD_ID); - break; - case QP::QS_RX_RESET: - tran_(WAIT4_RESET_FRAME); - break; - case QP::QS_RX_TICK: - tran_(WAIT4_TICK_RATE); - break; - case QP::QS_RX_PEEK: - if (QP::QS::rxPriv_.currObj[QP::QS::AP_OBJ] != nullptr) { - l_rx.var.peek.offs = 0U; - l_rx.var.peek.idx = 0U; - tran_(WAIT4_PEEK_OFFS); - } - else { - rxReportError_( - static_cast<std::uint8_t>(QP::QS_RX_PEEK)); - tran_(ERROR_STATE); - } - break; - case QP::QS_RX_POKE: - case QP::QS_RX_FILL: - l_rx.var.poke.fill = - (b == static_cast<std::uint8_t>(QP::QS_RX_FILL)) - ? 1U - : 0U; - if (QP::QS::rxPriv_.currObj[QP::QS::AP_OBJ] != nullptr) { - l_rx.var.poke.offs = 0U; - l_rx.var.poke.idx = 0U; - tran_(WAIT4_POKE_OFFS); - } - else { - rxReportError_( - (l_rx.var.poke.fill != 0U) - ? static_cast<std::uint8_t>(QP::QS_RX_FILL) - : static_cast<std::uint8_t>(QP::QS_RX_POKE)); - tran_(ERROR_STATE); - } - break; - case QP::QS_RX_GLB_FILTER: // intentionally fall-through - case QP::QS_RX_LOC_FILTER: - l_rx.var.flt.recId = b; - tran_(WAIT4_FILTER_LEN); - break; - case QP::QS_RX_AO_FILTER: // intentionally fall-through - case QP::QS_RX_CURR_OBJ: - l_rx.var.obj.recId = b; - tran_(WAIT4_OBJ_KIND); - break; - case QP::QS_RX_QUERY_CURR: - l_rx.var.obj.recId = - static_cast<std::uint8_t>(QP::QS_RX_QUERY_CURR); - tran_(WAIT4_QUERY_KIND); - break; - case QP::QS_RX_EVENT: - tran_(WAIT4_EVT_PRIO); - break; - -#ifdef Q_UTEST - case QP::QS_RX_TEST_SETUP: - tran_(WAIT4_TEST_SETUP_FRAME); - break; - case QP::QS_RX_TEST_TEARDOWN: - tran_(WAIT4_TEST_TEARDOWN_FRAME); - break; - case QP::QS_RX_TEST_CONTINUE: - tran_(WAIT4_TEST_CONTINUE_FRAME); - break; - case QP::QS_RX_TEST_PROBE: - if (QP::QS::tstPriv_.tpNum - < static_cast<std::uint8_t>( - (sizeof(QP::QS::tstPriv_.tpBuf) - / sizeof(QP::QS::tstPriv_.tpBuf[0])))) - { - l_rx.var.tp.data = 0U; - l_rx.var.tp.idx = 0U; - tran_(WAIT4_TEST_PROBE_DATA); - } - else { // the # Test-Probes exceeded - rxReportError_( - static_cast<std::uint8_t>(QP::QS_RX_TEST_PROBE)); - tran_(ERROR_STATE); - } - break; -#endif // Q_UTEST - - default: - rxReportError_(0x43U); - tran_(ERROR_STATE); - break; - } - break; - } - case WAIT4_INFO_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_CMD_ID: { - l_rx.var.cmd.cmdId = b; - l_rx.var.cmd.idx = 0U; - l_rx.var.cmd.param1 = 0U; - l_rx.var.cmd.param2 = 0U; - l_rx.var.cmd.param3 = 0U; - tran_(WAIT4_CMD_PARAM1); - break; - } - case WAIT4_CMD_PARAM1: { - l_rx.var.cmd.param1 |= - (static_cast<std::uint32_t>(b) << l_rx.var.cmd.idx); - l_rx.var.cmd.idx += 8U; - if (l_rx.var.cmd.idx == (8U*4U)) { - l_rx.var.cmd.idx = 0U; - tran_(WAIT4_CMD_PARAM2); - } - break; - } - case WAIT4_CMD_PARAM2: { - l_rx.var.cmd.param2 |= - static_cast<std::uint32_t>(b) << l_rx.var.cmd.idx; - l_rx.var.cmd.idx += 8U; - if (l_rx.var.cmd.idx == (8U*4U)) { - l_rx.var.cmd.idx = 0U; - tran_(WAIT4_CMD_PARAM3); - } - break; - } - case WAIT4_CMD_PARAM3: { - l_rx.var.cmd.param3 |= - static_cast<std::uint32_t>(b) << l_rx.var.cmd.idx; - l_rx.var.cmd.idx += 8U; - if (l_rx.var.cmd.idx == (8U*4U)) { - l_rx.var.cmd.idx = 0U; - tran_(WAIT4_CMD_FRAME); - } - break; - } - case WAIT4_CMD_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_RESET_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_TICK_RATE: { - l_rx.var.tick.rate = static_cast<std::uint_fast8_t>(b); - tran_(WAIT4_TICK_FRAME); - break; - } - case WAIT4_TICK_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_PEEK_OFFS: { - if (l_rx.var.peek.idx == 0U) { - l_rx.var.peek.offs = static_cast<std::uint16_t>(b); - l_rx.var.peek.idx += 8U; - } - else { - l_rx.var.peek.offs |= static_cast<std::uint16_t>( - static_cast<std::uint16_t>(b) << 8U); - tran_(WAIT4_PEEK_SIZE); - } - break; - } - case WAIT4_PEEK_SIZE: { - if ((b == 1U) || (b == 2U) || (b == 4U)) { - l_rx.var.peek.size = b; - tran_(WAIT4_PEEK_NUM); - } - else { - rxReportError_(static_cast<std::uint8_t>(QP::QS_RX_PEEK)); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_PEEK_NUM: { - l_rx.var.peek.num = b; - tran_(WAIT4_PEEK_FRAME); - break; - } - case WAIT4_PEEK_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_POKE_OFFS: { - if (l_rx.var.poke.idx == 0U) { - l_rx.var.poke.offs = static_cast<std::uint16_t>(b); - l_rx.var.poke.idx = 1U; - } - else { - l_rx.var.poke.offs |= static_cast<std::uint16_t>( - static_cast<std::uint16_t>(b) << 8U); - tran_(WAIT4_POKE_SIZE); - } - break; - } - case WAIT4_POKE_SIZE: { - if ((b == 1U) || (b == 2U) || (b == 4U)) { - l_rx.var.poke.size = b; - tran_(WAIT4_POKE_NUM); - } - else { - rxReportError_((l_rx.var.poke.fill != 0U) - ? static_cast<std::uint8_t>(QP::QS_RX_FILL) - : static_cast<std::uint8_t>(QP::QS_RX_POKE)); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_POKE_NUM: { - if (b > 0U) { - l_rx.var.poke.num = b; - l_rx.var.poke.data = 0U; - l_rx.var.poke.idx = 0U; - tran_((l_rx.var.poke.fill != 0U) - ? WAIT4_FILL_DATA - : WAIT4_POKE_DATA); - } - else { - rxReportError_((l_rx.var.poke.fill != 0U) - ? static_cast<std::uint8_t>(QP::QS_RX_FILL) - : static_cast<std::uint8_t>(QP::QS_RX_POKE)); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_FILL_DATA: { - l_rx.var.poke.data |= - static_cast<std::uint32_t>(b) << l_rx.var.poke.idx; - l_rx.var.poke.idx += 8U; - if ((l_rx.var.poke.idx >> 3U) == l_rx.var.poke.size) { - tran_(WAIT4_FILL_FRAME); - } - break; - } - case WAIT4_POKE_DATA: { - l_rx.var.poke.data |= - static_cast<std::uint32_t>(b) << l_rx.var.poke.idx; - l_rx.var.poke.idx += 8U; - if ((l_rx.var.poke.idx >> 3U) == l_rx.var.poke.size) { - rxPoke_(); - --l_rx.var.poke.num; - if (l_rx.var.poke.num == 0U) { - tran_(WAIT4_POKE_FRAME); - } - } - break; - } - case WAIT4_FILL_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_POKE_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_FILTER_LEN: { - if (b == static_cast<std::uint8_t>(sizeof(l_rx.var.flt.data))) { - l_rx.var.flt.idx = 0U; - tran_(WAIT4_FILTER_DATA); - } - else { - rxReportError_(l_rx.var.flt.recId); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_FILTER_DATA: { - l_rx.var.flt.data[l_rx.var.flt.idx] = b; - ++l_rx.var.flt.idx; - if (l_rx.var.flt.idx == sizeof(l_rx.var.flt.data)) { - tran_(WAIT4_FILTER_FRAME); - } - break; - } - case WAIT4_FILTER_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_OBJ_KIND: { - if (b <= static_cast<std::uint8_t>(QP::QS::SM_AO_OBJ)) { - l_rx.var.obj.kind = b; - l_rx.var.obj.addr = 0U; - l_rx.var.obj.idx = 0U; - tran_(WAIT4_OBJ_ADDR); - } - else { - rxReportError_(l_rx.var.obj.recId); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_OBJ_ADDR: { - l_rx.var.obj.addr |= - static_cast<QSObj>(b) << l_rx.var.obj.idx; - l_rx.var.obj.idx += 8U; - if (l_rx.var.obj.idx - == (8U * static_cast<unsigned>(QS_OBJ_PTR_SIZE))) - { - tran_(WAIT4_OBJ_FRAME); - } - break; - } - case WAIT4_OBJ_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_QUERY_KIND: { - if (b < static_cast<std::uint8_t>(QP::QS::MAX_OBJ)) { - l_rx.var.obj.kind = b; - tran_(WAIT4_QUERY_FRAME); - } - else { - rxReportError_(l_rx.var.obj.recId); - tran_(ERROR_STATE); - } - break; - } - case WAIT4_QUERY_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_EVT_PRIO: { - l_rx.var.evt.prio = b; - l_rx.var.evt.sig = 0U; - l_rx.var.evt.idx = 0U; - tran_(WAIT4_EVT_SIG); - break; - } - case WAIT4_EVT_SIG: { - l_rx.var.evt.sig |= static_cast<QP::QSignal>( - static_cast<std::uint32_t>(b) << l_rx.var.evt.idx); - l_rx.var.evt.idx += 8U; - if (l_rx.var.evt.idx - == (8U *static_cast<unsigned>(Q_SIGNAL_SIZE))) - { - l_rx.var.evt.len = 0U; - l_rx.var.evt.idx = 0U; - tran_(WAIT4_EVT_LEN); - } - break; - } - case WAIT4_EVT_LEN: { - l_rx.var.evt.len |= static_cast<std::uint16_t>( - static_cast<unsigned>(b) << l_rx.var.evt.idx); - l_rx.var.evt.idx += 8U; - if (l_rx.var.evt.idx == (8U * 2U)) { - if ((l_rx.var.evt.len + sizeof(QP::QEvt)) - <= static_cast<std::uint16_t>( - QP::QF::poolGetMaxBlockSize())) - { - // report Ack before generating any other QS records - rxReportAck_(QP::QS_RX_EVENT); - - l_rx.var.evt.e = QP::QF::newX_( - (static_cast<std::uint_fast16_t>(l_rx.var.evt.len) - + sizeof(QP::QEvt)), - 0U, // margin - static_cast<enum_t>(l_rx.var.evt.sig)); - // event allocated? - if (l_rx.var.evt.e != nullptr) { - l_rx.var.evt.p = - reinterpret_cast<std::uint8_t *>(l_rx.var.evt.e); - l_rx.var.evt.p = &l_rx.var.evt.p[sizeof(QP::QEvt)]; - if (l_rx.var.evt.len > 0U) { - tran_(WAIT4_EVT_PAR); - } - else { - tran_(WAIT4_EVT_FRAME); - } - } - else { - rxReportError_( - static_cast<std::uint8_t>(QP::QS_RX_EVENT)); - tran_(ERROR_STATE); - } - } - else { - rxReportError_( - static_cast<std::uint8_t>(QP::QS_RX_EVENT)); - tran_(ERROR_STATE); - } - } - break; - } - case WAIT4_EVT_PAR: { // event parameters - *l_rx.var.evt.p = b; - ++l_rx.var.evt.p; - --l_rx.var.evt.len; - if (l_rx.var.evt.len == 0U) { - tran_(WAIT4_EVT_FRAME); - } - break; - } - case WAIT4_EVT_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - -#ifdef Q_UTEST - case WAIT4_TEST_SETUP_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_TEST_TEARDOWN_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_TEST_CONTINUE_FRAME: { - // keep ignoring the data until a frame is collected - break; - } - case WAIT4_TEST_PROBE_DATA: { - l_rx.var.tp.data |= - (static_cast<QP::QSFun>(b) << l_rx.var.tp.idx); - l_rx.var.tp.idx += 8U; - if (l_rx.var.tp.idx == (8U * sizeof(std::uint32_t))) { - l_rx.var.tp.addr = 0U; - l_rx.var.tp.idx = 0U; - tran_(WAIT4_TEST_PROBE_ADDR); - } - break; - } - case WAIT4_TEST_PROBE_ADDR: { - l_rx.var.tp.addr |= - (static_cast<std::uint32_t>(b) << l_rx.var.tp.idx); - l_rx.var.tp.idx += 8U; - if (l_rx.var.tp.idx - == (8U * static_cast<unsigned>(QS_FUN_PTR_SIZE))) - { - tran_(WAIT4_TEST_PROBE_FRAME); - } - break; - } - case WAIT4_TEST_PROBE_FRAME: { - // keep ignoring the data until a frame is collected - break; - } -#endif // Q_UTEST - - case ERROR_STATE: { - // keep ignoring the data until a good frame is collected - break; - } - default: { // unexpected or unimplemented state - rxReportError_(0x45U); - tran_(ERROR_STATE); - break; - } - } -} - -//............................................................................ -void rxHandleGoodFrame_(std::uint8_t const state) { - std::uint8_t i; - std::uint8_t *ptr; - - switch (state) { - case WAIT4_INFO_FRAME: { - // no need to report Ack or Done - QP::QS::target_info_pre_(0U); // send only Target info - break; - } - case WAIT4_RESET_FRAME: { - // no need to report Ack or Done, because Target resets - QP::QS::onReset(); // reset the Target - break; - } - case WAIT4_CMD_PARAM1: // intentionally fall-through - case WAIT4_CMD_PARAM2: // intentionally fall-through - case WAIT4_CMD_PARAM3: // intentionally fall-through - case WAIT4_CMD_FRAME: { - rxReportAck_(QP::QS_RX_COMMAND); - QP::QS::onCommand(l_rx.var.cmd.cmdId, l_rx.var.cmd.param1, - l_rx.var.cmd.param2, l_rx.var.cmd.param3); -#ifdef Q_UTEST - #if Q_UTEST != 0 - QP::QS::processTestEvts_(); // process all events produced - #endif // Q_UTEST != 0 -#endif // Q_UTEST - rxReportDone_(QP::QS_RX_COMMAND); - break; - } - case WAIT4_TICK_FRAME: { - rxReportAck_(QP::QS_RX_TICK); -#ifdef Q_UTEST - QP::QTimeEvt::tick1_( - static_cast<std::uint_fast8_t>(l_rx.var.tick.rate), - &QP::QS::rxPriv_); - #if Q_UTEST != 0 - QP::QS::processTestEvts_(); // process all events produced - #endif // Q_UTEST != 0 -#else - QP::QTimeEvt::tick( - static_cast<std::uint_fast8_t>(l_rx.var.tick.rate), - &QP::QS::rxPriv_); -#endif // Q_UTEST - rxReportDone_(QP::QS_RX_TICK); - break; - } - case WAIT4_PEEK_FRAME: { - // no need to report Ack or Done - QP::QS::beginRec_(static_cast<std::uint_fast8_t>( - QP::QS_PEEK_DATA)); - ptr = static_cast<std::uint8_t*>( - QP::QS::rxPriv_.currObj[QP::QS::AP_OBJ]); - ptr = &ptr[l_rx.var.peek.offs]; - QS_TIME_PRE_(); // timestamp - QS_U16_PRE_(l_rx.var.peek.offs); // data offset - QS_U8_PRE_(l_rx.var.peek.size); // data size - QS_U8_PRE_(l_rx.var.peek.num); // number of data items - for (i = 0U; i < l_rx.var.peek.num; ++i) { - switch (l_rx.var.peek.size) { - case 1: - QS_U8_PRE_(ptr[i]); - break; - case 2: - QS_U16_PRE_( - reinterpret_cast<std::uint16_t*>(ptr)[i]); - break; - case 4: - QS_U32_PRE_( - reinterpret_cast<std::uint32_t*>(ptr)[i]); - break; - default: - // intentionally empty - break; - } - } - QP::QS::endRec_(); - - QS_REC_DONE(); // user callback (if defined) - break; - } - case WAIT4_POKE_DATA: { - // received less than expected poke data items - rxReportError_(static_cast<std::uint8_t>(QP::QS_RX_POKE)); - break; - } - case WAIT4_POKE_FRAME: { - rxReportAck_(QP::QS_RX_POKE); - // no need to report done - break; - } - case WAIT4_FILL_FRAME: { - rxReportAck_(QP::QS_RX_FILL); - ptr = static_cast<std::uint8_t *>( - QP::QS::rxPriv_.currObj[QP::QS::AP_OBJ]); - ptr = &ptr[l_rx.var.poke.offs]; - for (i = 0U; i < l_rx.var.poke.num; ++i) { - switch (l_rx.var.poke.size) { - case 1: - ptr[i] = - static_cast<std::uint8_t>(l_rx.var.poke.data); - break; - case 2: - reinterpret_cast<std::uint16_t *>(ptr)[i] = - static_cast<std::uint16_t>(l_rx.var.poke.data); - break; - case 4: - reinterpret_cast<std::uint32_t *>(ptr)[i] = - l_rx.var.poke.data; - break; - default: - // intentionally empty - break; - } - } - break; - } - case WAIT4_FILTER_FRAME: { - rxReportAck_(static_cast<enum QP::QSpyRxRecords>( - l_rx.var.flt.recId)); - - // apply the received filters - if (l_rx.var.flt.recId - == static_cast<std::uint8_t>(QP::QS_RX_GLB_FILTER)) - { - for (i = 0U; - i < static_cast<std::uint8_t>(sizeof(QP::QS::filt_.glb)); - ++i) - { - QP::QS::filt_.glb[i] = l_rx.var.flt.data[i]; - } - // leave the "not maskable" filters enabled, - // see qs.hpp, Miscellaneous QS records (not maskable) - QP::QS::filt_.glb[0] |= 0x01U; - QP::QS::filt_.glb[7] |= 0xFCU; - QP::QS::filt_.glb[8] |= 0x7FU; - - // never enable the last 3 records (0x7D, 0x7E, 0x7F) - QP::QS::filt_.glb[15] &= 0x1FU; - } - else if (l_rx.var.flt.recId - == static_cast<std::uint8_t>(QP::QS_RX_LOC_FILTER)) - { - for (i = 0U; i < Q_DIM(QP::QS::filt_.loc); ++i) { - QP::QS::filt_.loc[i] = l_rx.var.flt.data[i]; - } - // leave QS_ID == 0 always on - QP::QS::filt_.loc[0] |= 0x01U; - } - else { - rxReportError_(l_rx.var.flt.recId); - } - // no need to report Done - break; - } - case WAIT4_OBJ_FRAME: { - i = l_rx.var.obj.kind; - if (i < static_cast<std::uint8_t>(QP::QS::MAX_OBJ)) { - if (l_rx.var.obj.recId - == static_cast<std::uint8_t>(QP::QS_RX_CURR_OBJ)) - { - QP::QS::rxPriv_.currObj[i] = - reinterpret_cast<void *>(l_rx.var.obj.addr); - rxReportAck_(QP::QS_RX_CURR_OBJ); - } - else if (l_rx.var.obj.recId - == static_cast<std::uint8_t>(QP::QS_RX_AO_FILTER)) - { - if (l_rx.var.obj.addr != 0U) { - std::int_fast16_t const filter = - static_cast<std::int_fast16_t>( - reinterpret_cast<QP::QActive *>( - l_rx.var.obj.addr)->getPrio()); - QP::QS::locFilter_((i == 0) - ? filter - :-filter); - rxReportAck_(QP::QS_RX_AO_FILTER); - } - else { - rxReportError_(static_cast<enum_t>( - QP::QS_RX_AO_FILTER)); - } - } - else { - rxReportError_(l_rx.var.obj.recId); - } - } - // both SM and AO - else if (i == static_cast<std::uint8_t>(QP::QS::SM_AO_OBJ)) { - if (l_rx.var.obj.recId - == static_cast<std::uint8_t>(QP::QS_RX_CURR_OBJ)) - { - QP::QS::rxPriv_.currObj[QP::QS::SM_OBJ] - = reinterpret_cast<void *>(l_rx.var.obj.addr); - QP::QS::rxPriv_.currObj[QP::QS::AO_OBJ] - = reinterpret_cast<void *>(l_rx.var.obj.addr); - } - rxReportAck_( - static_cast<enum QP::QSpyRxRecords>(l_rx.var.obj.recId)); - } - else { - rxReportError_(l_rx.var.obj.recId); - } - break; - } - case WAIT4_QUERY_FRAME: { - queryCurrObj_(l_rx.var.obj.kind); - break; - } - case WAIT4_EVT_FRAME: { - // NOTE: Ack was already reported in the WAIT4_EVT_LEN state -#ifdef Q_UTEST - QP::QS::onTestEvt(l_rx.var.evt.e); // "massage" the event -#endif // Q_UTEST - // use 'i' as status, 0 == success,no-recycle - i = 0U; - - if (l_rx.var.evt.prio == 0U) { // publish - QP::QActive::publish_(l_rx.var.evt.e, &QP::QS::rxPriv_, 0U); - } - else if (l_rx.var.evt.prio < QF_MAX_ACTIVE) { - if (!QP::QActive::registry_[l_rx.var.evt.prio]->POST_X( - l_rx.var.evt.e, - 0U, // margin - &QP::QS::rxPriv_)) - { - // failed QACTIVE_POST() recycles the event - i = 0x80U; // failure, no recycle - } - } - else if (l_rx.var.evt.prio == 255U) { - // dispatch to the current SM object - if (QP::QS::rxPriv_.currObj[QP::QS::SM_OBJ] != nullptr) { - // increment the ref-ctr to simulate the situation - // when the event is just retrieved from a queue. - // This is expected for the following QF::gc() call. - QP::QEvt_refCtr_inc_(l_rx.var.evt.e); - - static_cast<QP::QAsm *>( - QP::QS::rxPriv_.currObj[QP::QS::SM_OBJ]) - ->dispatch(l_rx.var.evt.e, 0U); - i = 0x01U; // success, recycle - } - else { - i = 0x81U; // failure, recycle - } - } - else if (l_rx.var.evt.prio == 254U) { - // init the current SM object" - if (QP::QS::rxPriv_.currObj[QP::QS::SM_OBJ] != nullptr) { - // increment the ref-ctr to simulate the situation - // when the event is just retrieved from a queue. - // This is expected for the following QF::gc() call. - QP::QEvt_refCtr_inc_(l_rx.var.evt.e); - - static_cast<QP::QAsm *>( - QP::QS::rxPriv_.currObj[QP::QS::SM_OBJ]) - ->init(l_rx.var.evt.e, 0U); - i = 0x01U; // success, recycle - } - else { - i = 0x81U; // failure, recycle - } - } - else if (l_rx.var.evt.prio == 253U) { - // post to the current AO - if (QP::QS::rxPriv_.currObj[QP::QS::AO_OBJ] != nullptr) { - if (!static_cast<QP::QActive *>( - QP::QS::rxPriv_.currObj[QP::QS::AO_OBJ])->POST_X( - l_rx.var.evt.e, - 0U, // margin - &QP::QS::rxPriv_)) - { - // failed QACTIVE_POST() recycles the event - i = 0x80U; // failure, no recycle - } - } - else { - i = 0x81U; // failure, recycle - } - } - else { - i = 0x81U; // failure, recycle - } - -#if (QF_MAX_EPOOL > 0U) - // recycle needed? - if ((i & 1U) != 0U) { - QP::QF::gc(l_rx.var.evt.e); - } -#endif - // failure? - if ((i & 0x80U) != 0U) { - rxReportError_(static_cast<std::uint8_t>(QP::QS_RX_EVENT)); - } - else { -#ifdef Q_UTEST - #if Q_UTEST != 0 - QP::QS::processTestEvts_(); // process all events produced - #endif // Q_UTEST != 0 -#endif // Q_UTEST - rxReportDone_(QP::QS_RX_EVENT); - } - break; - } - -#ifdef Q_UTEST - case WAIT4_TEST_SETUP_FRAME: { - rxReportAck_(QP::QS_RX_TEST_SETUP); - QP::QS::tstPriv_.tpNum = 0U; // clear Test-Probes - QP::QS::tstPriv_.testTime = 0U; //clear time tick - // don't clear current objects - QP::QS::onTestSetup(); // application-specific test setup - // no need to report Done - break; - } - case WAIT4_TEST_TEARDOWN_FRAME: { - rxReportAck_(QP::QS_RX_TEST_TEARDOWN); - QP::QS::onTestTeardown(); // application-specific test teardown - // no need to report Done - break; - } - case WAIT4_TEST_CONTINUE_FRAME: { - rxReportAck_(QP::QS_RX_TEST_CONTINUE); - QP::QS::rxPriv_.inTestLoop = false; // exit the QUTest loop - // no need to report Done - break; - } - case WAIT4_TEST_PROBE_FRAME: { - rxReportAck_(QP::QS_RX_TEST_PROBE); - Q_ASSERT_INCRIT(815, - QP::QS::tstPriv_.tpNum - < (sizeof(QP::QS::tstPriv_.tpBuf) - / sizeof(QP::QS::tstPriv_.tpBuf[0]))); - QP::QS::tstPriv_.tpBuf[QP::QS::tstPriv_.tpNum] = l_rx.var.tp; - ++QP::QS::tstPriv_.tpNum; - // no need to report Done - break; - } -#endif // Q_UTEST - - case ERROR_STATE: { - // keep ignoring all bytes until new frame - break; - } - default: { - rxReportError_(0x47U); - break; - } - } -} - -//............................................................................ -static void rxHandleBadFrame_(std::uint8_t const state) noexcept { - rxReportError_(0x50U); // error for all bad frames - switch (state) { - case WAIT4_EVT_FRAME: { - Q_ASSERT_INCRIT(910, l_rx.var.evt.e != nullptr); -#if (QF_MAX_EPOOL > 0U) - QP::QF::gc(l_rx.var.evt.e); // don't leak an allocated event -#endif - break; - } - default: { - // intentionally empty - break; - } - } -} - -//............................................................................ -static void rxReportAck_(enum QP::QSpyRxRecords const recId) noexcept { - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(QP::QS_RX_STATUS)); - QS_U8_PRE_(recId); // record ID - QP::QS::endRec_(); - QS_REC_DONE(); // user callback (if defined) -} - -//............................................................................ -static void rxReportError_(std::uint8_t const code) noexcept { - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(QP::QS_RX_STATUS)); - QS_U8_PRE_(0x80U | code); // error code - QP::QS::endRec_(); - QS_REC_DONE(); // user callback (if defined) -} - -//............................................................................ -static void rxReportDone_(enum QP::QSpyRxRecords const recId) noexcept { - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(QP::QS_TARGET_DONE)); - QS_TIME_PRE_(); // timestamp - QS_U8_PRE_(recId); // record ID - QP::QS::endRec_(); - QS_REC_DONE(); // user callback (if defined) -} - -//............................................................................ -static void queryCurrObj_(std::uint8_t obj_kind) noexcept { - Q_REQUIRE_INCRIT(200, obj_kind < Q_DIM(QP::QS::rxPriv_.currObj)); - - if (QP::QS::rxPriv_.currObj[obj_kind] != nullptr) { - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(QP::QS_QUERY_DATA)); - QS_TIME_PRE_(); // timestamp - QS_U8_PRE_(obj_kind); // object kind - QS_OBJ_PRE_(QP::QS::rxPriv_.currObj[obj_kind]); // object pointer - switch (obj_kind) { - case QP::QS::SM_OBJ: // intentionally fall through - case QP::QS::AO_OBJ: - QS_FUN_PRE_(reinterpret_cast<QP::QHsm *>( - QP::QS::rxPriv_.currObj[obj_kind])->getStateHandler()); - break; - case QP::QS::MP_OBJ: - QS_MPC_PRE_(reinterpret_cast<QP::QMPool *>( - QP::QS::rxPriv_.currObj[obj_kind])->getNFree()); - QS_MPC_PRE_(reinterpret_cast<QP::QMPool *>( - QP::QS::rxPriv_.currObj[obj_kind])->getNMin()); - break; - case QP::QS::EQ_OBJ: - QS_EQC_PRE_(reinterpret_cast<QP::QEQueue *>( - QP::QS::rxPriv_.currObj[obj_kind])->getNFree()); - QS_EQC_PRE_(reinterpret_cast<QP::QEQueue *>( - QP::QS::rxPriv_.currObj[obj_kind])->getNMin()); - break; - case QP::QS::TE_OBJ: - QS_OBJ_PRE_(reinterpret_cast<QP::QTimeEvt *>( - QP::QS::rxPriv_.currObj[obj_kind])->getAct()); - QS_TEC_PRE_(reinterpret_cast<QP::QTimeEvt *>( - QP::QS::rxPriv_.currObj[obj_kind])->getCtr()); - QS_TEC_PRE_(reinterpret_cast<QP::QTimeEvt *>( - QP::QS::rxPriv_.currObj[obj_kind])->getInterval()); - QS_SIG_PRE_(reinterpret_cast<QP::QTimeEvt *>( - QP::QS::rxPriv_.currObj[obj_kind])->sig); - QS_U8_PRE_ (reinterpret_cast<QP::QTimeEvt *>( - QP::QS::rxPriv_.currObj[obj_kind])->refCtr_); - break; - default: - // intentionally empty - break; - } - QP::QS::endRec_(); - QS_REC_DONE(); // user callback (if defined) - } - else { - rxReportError_(static_cast<std::uint8_t>(QP::QS_RX_AO_FILTER)); - } -} - -//............................................................................ -static void rxPoke_() noexcept { - std::uint8_t * ptr = - static_cast<std::uint8_t *>(QP::QS::rxPriv_.currObj[QP::QS::AP_OBJ]); - ptr = &ptr[l_rx.var.poke.offs]; - switch (l_rx.var.poke.size) { - case 1: - *ptr = static_cast<std::uint8_t>(l_rx.var.poke.data); - break; - case 2: - *reinterpret_cast<std::uint16_t *>(ptr) - = static_cast<std::uint16_t>(l_rx.var.poke.data); - break; - case 4: - *reinterpret_cast<std::uint32_t *>(ptr) = l_rx.var.poke.data; - break; - default: - Q_ERROR_ID(900); - break; - } - - l_rx.var.poke.data = 0U; - l_rx.var.poke.idx = 0U; - l_rx.var.poke.offs += static_cast<std::uint16_t>(l_rx.var.poke.size); -} - -} // unnamed namespace - -//! @endcond - - - - // only build when Q_UTEST is defined -#ifdef Q_UTEST - -#define QP_IMPL // this is QP implementation -#include "qp_port.hpp" // QP port -#include "qp_pkg.hpp" // QP package-scope interface -#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem -#include "qs_port.hpp" // QS port -#include "qs_pkg.hpp" // QS package-scope internal interface - -$define ${QS::QUTest} - -//============================================================================ -//! @cond INTERNAL - -namespace QP { -namespace QS { - -TestAttr tstPriv_; - -//............................................................................ -void test_pause_() { - beginRec_(static_cast<std::uint_fast8_t>(QS_TEST_PAUSED)); - endRec_(); - onTestLoop(); -} - -//............................................................................ -std::uint32_t getTestProbe_(QSpyFunPtr const api) noexcept { - std::uint32_t data = 0U; - for (std::uint8_t i = 0U; i < tstPriv_.tpNum; ++i) { - if (tstPriv_.tpBuf[i].addr == reinterpret_cast<QSFun>(api)) { - data = tstPriv_.tpBuf[i].data; - - QS_CRIT_STAT - QS_CRIT_ENTRY(); - QS_MEM_SYS(); - QS::beginRec_(static_cast<std::uint_fast8_t>(QS_TEST_PROBE_GET)); - QS_TIME_PRE_(); // timestamp - QS_FUN_PRE_(api); // the calling API - QS_U32_PRE_(data); // the Test-Probe data - QS::endRec_(); - - QS_REC_DONE(); // user callback (if defined) - - --tstPriv_.tpNum; // one less Test-Probe - // move all remaining entries in the buffer up by one - for (std::uint8_t j = i; j < tstPriv_.tpNum; ++j) { - tstPriv_.tpBuf[j] = tstPriv_.tpBuf[j + 1U]; - } - QS_MEM_APP(); - QS_CRIT_EXIT(); - break; // we are done (Test-Probe retrieved) - } - } - return data; -} - -//............................................................................ -QSTimeCtr onGetTime() { - return (++tstPriv_.testTime); -} - -} // namespace QS -} // namespace QP - -//............................................................................ -extern "C" { - -Q_NORETURN Q_onError( - char const * const module, - int_t const id) -{ - // NOTE: called in a critical section - - QP::QS::beginRec_(static_cast<std::uint_fast8_t>(QP::QS_ASSERT_FAIL)); - QS_TIME_PRE_(); - QS_U16_PRE_(id); - QS_STR_PRE_((module != nullptr) ? module : "?"); - QP::QS::endRec_(); - QP::QS::onFlush(); // flush the assertion record to the host - - QP::QS::onCleanup(); // cleanup after the failure - QP::QS::onReset(); // reset the target to prevent it from continuing - for (;;) { // onReset() should not return, but to ensure no-return... - } -} - -} // extern "C" - -//! @endcond -//============================================================================ - -// QP-stub for QUTest -// NOTE: The QP-stub is needed for unit testing QP applications, but might -// NOT be needed for testing QP itself. In that case, the build process -// can define Q_UTEST=0 to exclude the QP-stub from the build. -#if Q_UTEST != 0 - -// unnamed namespace for local definitions with internal linkage -namespace { -Q_DEFINE_THIS_MODULE("qutest") -} // unnamed namespace - -namespace QP { -namespace QS { - -void processTestEvts_() { - QS_TEST_PROBE_DEF(&QS::processTestEvts_) - - // return immediately (do nothing) for Test Probe != 0 - QS_TEST_PROBE(return;) - - while (tstPriv_.readySet.notEmpty()) { - std::uint_fast8_t const p = tstPriv_.readySet.findMax(); - QActive * const a = QActive::registry_[p]; - - QEvt const * const e = a->get_(); - a->dispatch(e, a->getPrio()); - #if (QF_MAX_EPOOL > 0U) - QF::gc(e); - #endif - if (a->getEQueue().isEmpty()) { // empty queue? - tstPriv_.readySet.remove(p); -#ifndef Q_UNSAFE - tstPriv_.readySet.update_(&tstPriv_.readySet_dis); -#endif - } - } -} - -} // namespace QS -} // namespace QP - -$define ${QS::QUTest-stub} - -#endif // Q_UTEST != 0 - -#endif // def Q_UTEST - - - - #include "qstamp.hpp" - -namespace QP { -char const BUILD_DATE[12] = __DATE__; -char const BUILD_TIME[9] = __TIME__; -} // namespace QP - - - - diff --git a/src/qs/qs_rx.cpp b/src/qs/qs_rx.cpp index 7689823c7..c6a1c7798 100644 --- a/src/qs/qs_rx.cpp +++ b/src/qs/qs_rx.cpp @@ -300,6 +300,23 @@ void rxParse() { } } +//${QS::QS-RX::setCurrObj} ................................................... +void setCurrObj( + std::uint8_t const obj_kind, + void * const obj_ptr) +{ + QS_CRIT_STAT + QS_CRIT_ENTRY(); + Q_REQUIRE_INCRIT(300, obj_kind < Q_DIM(rxPriv_.currObj)); + + QS_MEM_SYS(); + + rxPriv_.currObj[obj_kind] = obj_ptr; + + QS_MEM_APP(); + QS_CRIT_EXIT(); +} + //${QS::QS-RX::rxGetNfree} ................................................... std::uint16_t rxGetNfree() noexcept { // NOTE: Must be called IN critical section.
  • 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

    -

    404 - file not found

    -

    We are sorry, the page you are trying to access is not available. Please hit the Back button of your bowser to return to the previous context. We appologize for the inconvenience. Please report the error to info@quantum-leaps.com. -

    -

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

    5IoT*WP_S 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 V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-h743zi/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-h743zi/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-h743zi/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-h743zi/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -

    zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 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 diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.bat b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.bat deleted file mode 100644 index 8bdb9ce53..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.bat +++ /dev/null @@ -1,8 +0,0 @@ -@setlocal - -if "%QTOOLS%"=="" ( - set QTOOLS=C:\qp\qtools -) -python3 %QTOOLS%\qview\qview.py dpp1.py - -@endlocal diff --git a/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.lnk b/examples/arm-cm/dpp_nucleo-c031c6_mpu/qview/qview-dpp1.lnk deleted file mode 100644 index caf9b3459bb337b02124a63a05a595a2ac175cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 zcmd^B?{AY;6n?r*wn-VC%mo&7oyiPFEJI+#8BF64nmBChfGy??*{_m~%(kP;R*WCs z;1@73jlaGqb1dL6Vu*=ih(Q}oOiVD2B~-$lN~Z7wYrex2^49;Sbn-d(OT0 z+;g6L?m72I+W@#~O2~nf;n?v-Nd>%YzrVJ5#jW#c*QJl1>)bMvcH!H=ROh>CmuJLf zG#&03iNE5iL4D|2aN7G<%YbL{rwTmU)O2DEHng@_|7+!20c;EYQ&&lx;aF@i0X&t(68c#9puzH8 z5zLu9iqrV+k5`E`j2OQ`&=j@Uo5yS*X6Vpxe=NEQ{yb(~;h#S;VUnChppa}WR!$LlCM`TSAFF+oJ4-q6u zKpkl>X)Q^~QN5X@vWK*qqzHU{xjf}z-7ygDi;X70{0zk{CvsMHu~wmb*uYtQuy$ay=RmW;TQT+R)CPutqSzwT%|FeFnvgKGtz&%IRO?inx&{{>Dnq zI#(KEvKWL!jZ`Yd8nDgBA*Z7T)?_smmoMvZzf<~K>xu5`4L|-KdbpbMWr~PiGaV=iR*$boQB)&HYWE zqi7cM!bwApsazy!olSF%pU>{B^PHY5={h!ka)v3h(hva;p6mrh@80WoM$2+;j-0}er4pAE)+msYNAhSU)=uj z@pxb=;P;){mOLixeklY<{>x>*^lXprI{8xa*}(VvUz1#=i^OD3bgIKLH27E|9_bxE vs3)4G>Z>=F&tBN)w;Q%T|HIk!zxKWLUfa1RZ&Z)>j-N~4+I;hF - - - 1.0 - -

    zEXxwhPXIsw2^;hwg2K^Gi-6S;M2<4hTrZ)5 z2_`sE!via5IM`uA)WQS-8~8!T9}K_yc(sv74h9%=Oc6#AUK6m!4&&g^kN`GPkb)CJ z=%9n)L~MY92zGQ}hndyZ3p?y3$PNVrd>o#^4zWBS0Pi&(mO=`#06;?j@y3hLLJMky znr8GRA7cQY@iNAAi!%_u!O^{p#T|>;0`h%1rXF|do?N-7gG=f7zE*io9KiY zNI-%N#32r8NP`*57zcmIaR@fh2o|?TuI+KocOJX}48YhI8~`Ez2Xp~K9!7wIA;({CqAqSuQ1Qxc5g)MBsigg^DJDyZY-u*xT&b+}i9gqMpy5oa1pg|9Y z`3WF=5}QC60Sz+9Jq?{xJm>sDI@`HP|2bg=FmS*J=ZOP($}4O#nYB z7rFkZ&=n~3qX{6ELTi8n064UlG_WR5@~1tF2GpG80;8MU^ihSb6NEKz!8Jh{&s(UY z9qzECMJ?HvgnkfCw*=%n-eJLYIF%hZxI#O`8896Nj4LA`p#VV}&;S^0(xY6tWdgj~ V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/img/eating.gif b/examples/arm-cm/dpp_nucleo-c031c6/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 zcmWmB|3k}p0|4;%=iBz#R{PS{`d*(^m$b^FBD$=a8j+AhVI|jm>9JgtsQc_oYpAnu zkKB1!U8hBuZy9&oXVWE#rzmp1E$8TPEV^`$FFnum%j+L_rOr;77MGU+=76UFj6dd# z-{*WP{Pg&u`|Y-p4<9~Mmk18;=4>t$e!RmfE!l8T#~T`YcJ?4|>=yUd&7ONdmVSER zyLOpiz{(#l8rNyd_ZgOMFP*b`Y2>CgDSvbbTp09XWz_!t2UjgmeckQ$=+UDenwp+< zF`W6su`$H>^YB##1-o|DUbyh%{d;%1PqFUY?(eavvgYt_T)$>E=6o1ge0A})SARY~ zab(x%fa~9X|NZoL$EAkCyr}H<_I8Wq*y~=m>!*Y@(yy;}oH?{Vy*2gNuWe{nn)n-C zczML;S)N2|>#1K_1Z7E^PwiXz_U+pTcGqF&tKV{eZ`iNSm^1I{k#(b^W40FTz{Eq= zbIotQ9`5Yuvzs@oQWMA0-dVGMI=mfl-rwKv7=FF^=B=XZb;6Gyx1Bs* zY;Bly^{cBb6)oqjtNXhDHQdj8H#&Un_{J0Ftp7Y*KlW;@vm>kb2qv1JWedENNUz$1zJgZDOCXnSXem1fj> z<+VTDlQreF@KVJ`ljYY5_KQo>Ckp)}dGgwJE%U(GFrrs9rnyk(FT6okvkmVrbb@9b z@+Cj`1K^+eR(q!(zW=0`^Oo>a-(yQHqo*ae*n#iP517tvpk;kSf3G5u`lt%sKaU+= zd>Qt*gl+Pb*La4bMfSFZ{c8uVbDq6vJMVjN?f@EX9eS4ZTZl%Ya533QJ}QD;TMSK5 z%;9;?tLjds)1C|-xavysW?`P;5C!9e z#0I$z+5zq&>G{P+)pk|RjtyQc6)fn>AioevZdTC~&1#Z~M@!Hp4W#Lc*B8-iQ{0W; z7N>aZ>@-~_A~Q`=%>97M&JU5DH1KdjN3q>+5KKfQDc1`H?O{~w>2hUNV5sREEqx{x zmFiRUK|-hdg}$kxhXG4|06kaX7L1)?u5pyG1| zCB|<9R@SQkm_bm<0jb?4G}JHN`voo!C3PUEMk2;!f+!4&+E&+zcq#w_7_tLYc^Y9N z$KB^V@xlvy>b9fvf>YeTVZCePIzbSpp8Fogw#@Sd(UNjDYs6?F}UsS@Wagz zh~d5C0asU5Ps3p^n(ZKs52$2Ta?{}D3)Q*|%q`d`ISu4QFY2~YnJC8M(t2))wm9-A zIC?Db-Th19qFKm7L)?huSac6?O(dL*py^HbFZ1Q~u1;JqLZos8E-x{5KG9=m6}vYg zzPM2#MNoFx)GE4}dv4Mwq3njYM4w7^uVaND1$D^qw6;Zrgn}c2>*7Q)2UL)cuz<8x zUD;~1Vck>LlYhKij8IU7uhu)LJX2ldBF_~|g>mztOXJicPa=gyo0b?L!a}9gd(>%z zeYQD=6VNff>N4i(DS=#@zubjpI@?}|0X0r7TQ$pk;Uc0p4k(cG!`aYFFxRch=~S?$dj%CEZK#@1);}Un#Ih4pJNhIzAORmix-x1_}k)nQyd>->S_vg~X zZ}w)CK{U4X-?D54{X(2Q(TC7{|F7Bj9eW}#pBs0Emj|)9$zIk1+(QzrdsP4l6kXlH zbE9#iteyGtJjw`{Dqr4J)7T_hq~5(5^ZUZ>fMRk|JO!&up1DtPY8E||HoA`E8hZH` z2Elp=3iw`+L=zb6`IOB|>+SFgr(ULWXrmX01Xiik`g9(1wgu2MT$J6kCU3N4PFOUB zAR`1#W)=Rdl3c}4Hh9nJXd&wN%H06px6^HpO|3TGqA z$lz}Zl&pU#4+E0~M|m8T4e>XsX;WTfQ>{hgf@9MLkLF9OPP>p5=W}qDDG;2D(}d}I zgWZ&S;2?wgy2?VIuyAlir3EUZ)gi3xVx9S?=a`Ow7l)Rz9>`_%As^sxn3gcFQ7j}$ zRHT5QY|7@Mn2d*II~G=&p_;GWYRqB$6E!aSjn~MPNfPQ{%Do)P+Bhhk%wu0WilEOe zGZ3YW8&d`yIG1bi4t2C$>pMi}l0+1}0m@Eq_YNbOv|$C*K_t38cj)IVxxmi%g#B=} z#v?SMQ*Tl8TMb>}aw+_|e+sN2FixgIWhkS5yutH1>qpMLlH>n2Qlf2hOJZ=$(nTCK z%qh6NH|Wenc;Wc5=byDF;vr`0G`G6IDhJ9Vt)WIbRe?p!5`!Un%_>3|V%2^y*`yP3jrq$KrHP88ZvOewl#QuqInu zdnGCAha~qvqaB`RBKal`Kg}9)CD{Rogo-duwvC~vz*QI1rcZcxF1AhDl49xFRVhg-4B0$xwVuh2OnGa zDfJm3P63A~P^AqYez*0h$>*d4ojnZVEDC}AOBW|#THxi5$mB08t9qaVQ}H<@?C%D1 z6o{W>eQb0ZQRgvJ8qk|MfskljGN2F@970~Iyb_2t|FzAah9f8A3!Gq9BS`7tdJI)E zl^`gE=V9agv4jkv3a2&)h3r8*2`oX0ixn`DQMTt!ab%BdG94CkVHXNrJz7!F<1dKH zigzLnP6Q#J&+5T>vtTn?r1gBd>s)Qa)XZu@hjY}<>Fw* Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/img/hungry.gif b/examples/arm-cm/dpp_nucleo-c031c6/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/img/thinking.gif b/examples/arm-cm/dpp_nucleo-c031c6/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 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 diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.bat b/examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.bat deleted file mode 100644 index 8bdb9ce53..000000000 --- a/examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.bat +++ /dev/null @@ -1,8 +0,0 @@ -@setlocal - -if "%QTOOLS%"=="" ( - set QTOOLS=C:\qp\qtools -) -python3 %QTOOLS%\qview\qview.py dpp1.py - -@endlocal diff --git a/examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.lnk b/examples/arm-cm/dpp_nucleo-c031c6/qview/qview-dpp1.lnk deleted file mode 100644 index caf9b3459bb337b02124a63a05a595a2ac175cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 zcmd^B?{AY;6n?r*wn-VC%mo&7oyiPFEJI+#8BF64nmBChfGy??*{_m~%(kP;R*WCs z;1@73jlaGqb1dL6Vu*=ih(Q}oOiVD2B~-$lN~Z7wYrex2^49;Sbn-d(OT0 z+;g6L?m72I+W@#~O2~nf;n?v-Nd>%YzrVJ5#jW#c*QJl1>)bMvcH!H=ROh>CmuJLf zG#&03iNE5iL4D|2aN7G<%YbL{rwTmU)O2DEHng@_|7+!20c;EYQ&&lx;aF@i0X&t(68c#9puzH8 z5zLu9iqrV+k5`E`j2OQ`&=j@Uo5yS*X6Vpxe=NEQ{yb(~;h#S;VUnChppa}WR!$LlCM`TSAFF+oJ4-q6u zKpkl>X)Q^~QN5X@vWK*qqzHU{xjf}z-7ygDi;X70{0zk{CvsMHu~wmb*uYtQuy$ay=RmW;TQT+R)CPutqSzwT%|FeFnvgKGtz&%IRO?inx&{{>Dnq zI#(KEvKWL!jZ`Yd8nDgBA*Z7T)?_smmoMvZzf<~K>xu5`4L|-KdbpbMWr~PiGaV=iR*$boQB)&HYWE zqi7cM!bwApsazy!olSF%pU>{B^PHY5={h!ka)v3h(hva;p6mrh@80WoM$2+;j-0}er4pAE)+msYNAhSU)=uj z@pxb=;P;){mOLixeklY<{>x>*^lXprI{8xa*}(VvUz1#=i^OD3bgIKLH27E|9_bxE vs3)4G>Z>=F&tBN)w;Q%T|HIk!zxKWLUfa1RZ&Z)>j-N~4+I;hF - - - 1.0 - -

    5IoT*WP_S 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 V&II&@rP>3iJO1f{O>{I606W4fO_=}y diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/eating.gif b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/eating.gif deleted file mode 100644 index 632b9d23acd8604b0219c7ebe2836c3c1f2fa825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 Fe*y4k@DKn1 diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/hungry.gif b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/hungry.gif deleted file mode 100644 index dc144db97a2ee0413f63de2148988e112139134e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmW-e`&&{61Axzg0~`?Xh={1DfK2gH;WaF3fb&+?(5yK#!_Cx|+i+8}+xHzVq6s>x zEiKKk+;VEArlmdE4x(kHWtTN;)$kHxpWBCRty*sE+1?-C_YZiJQW8aRxpH6)U;_ZB zBVY<A*0orR8LO{jTH3kN^1NBTIMCqsO*u z*RGd+o_Oli*8>9sJsteBXFKtr`)}Ov?r~H5wF|-B z=e{c`H9WRG{maG~=m`01HXtTC#_4nd|H6F@{oC+={Ld4B3&_n8u2B4-I~DV`ed;2^&n2BZ>%ZGoU>Hi@)Ip> zg9(X}YC0(e&ep^o_Qyr-6G*m{a5Nn6XlJ9iUvV{$fD^DENhTww(`o=VXUB$>k!3C+mUAHfHQ$a*(QDkFsRzQ?{M`=U4uErG+Vx5!e7XAG( zf+ptm0mXIJ=Pj;M<;v+qfm;1ft3L`J4vwo@2S)*EO!BNUhy84ieGj=F(Z z`DnCwN+mhOV0NAEz~V_SWvuml#h~pPy#^O8#k=d~`D$u>Jr)n$_0)QiUb=pU`G~br zolAV`!i~(eVyS``DK5q{U95l~!B< z?oeJ(<2(x8Elwid-erN{LIs*1=8k|2gVJi&O%w(u(4(ODEU<5~>FSXJnh+!IHkeQ_ z9pRwlE#(JcmMnFlF4m1TuE|9>(x9VS`bYT&GF*aZSN9<1;)S$e9fGYYLE$Z_SblS3 zQ-}(r2tbS;JW-qs@>!0p?>|J0kc+%jI0WPCAIzOz7mAqiA7o-E)rKxKwtc5OPXg96 z^1t=yee$fs|D$KkAQQ+iULofQ&02&B4?j)wY;4A5AYYpE5B05B2_Qa-Bncs?+-hbt zY>%RPI>?<`q^vdr^@@<_e>r!IrZBr@0Kcy7dJZbo^tVky186_})}RyqRA5TNpq-)8 z*6H4vbvUL-sU>)dl^WL;PoWM^L#-$~V#s706S)~|z)FrhEjIW$5amW*x2SZuGBDynMQ#p%pafabMH2(+!e@yVakVvHz2y#B}}WQ zh>(i00$j7iHw-+a4h2}~FrLY1p5OPR*fB_TQOM^wiV^uc2wZrZ{{vCWHY|@o6)2IK zXH3v)_BKmhLN8$`jok_0T|yUAs=T99Ip&KL%xlz=>A>)=uOtz1I|)Opt7vr2pjG1iYm+pL~QJCUkVV(&`yLsUjNvlSr@eJZh;S*sQwad#M@6}@> zL2_M)C}o;U6GAZ@Yt5L46p>V+46*bJy;8+214e9PAY9rqNN%f2mKmh9-2!RgS_d)0 zR_HALiVx9e0B9Yq8^Tu&y7|iqa$P!-Q*HrLUne3(7>=pf=D#(ripG|@9w}P0Ar2b z@OVd{(%HDEP^6-*uorMcCo0L`bOlWb@uW_P>=VY#a=)sRfxG3}=vc+>kIA>`7qwZ% zuTXF(2KwM`pL$&pw>DX%$^5-j8#&+VMpB?fUbz`zGD*U|K43|oQoR6JiFbV=JSVFP z$&*5{7>G~qT>CtYlWK@bdVoBfR&g@gh^Du+8(M;KlyDP?(T5T4UpodaGZDV`gnXzD z)I-^f#45bGGyv}>cOa`qBp>wSHC{?9&ReM|T6l-Jh*M&l6=up(42?@oa1WFCZqGM@ zl~&nyjbsp|PHL#xCSqv46km;46MC@!?&y*od4p<V>&l!$|*W#9S63Atbs)&js0pW_0|2(Erh{lQ0O^HdHLx(3;FQ2;Hv>qbf XpQlo&rO5Tpgr@ifb-xb}0apGEm|EE% diff --git a/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/thinking.gif b/examples/arm-cm/dpp_ek-tm4c123gxl/qview/img/thinking.gif deleted file mode 100644 index ec684ee5a378e80a351b0821edc6adc9fa1c4850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmWlY=~ol?0ziK=lgUPa0Rkkf2?8bYeb(8LOfKd2C5cq>l;yATEw^lJ}}RIx&OeuH!eOld|9>Rx9{@X-xk;&2TffI*iuqX z>RO*%-gBz7~ecI;o+*|fDFJ1A*Q*tRx2OAu?7X~Z*S!C} z;**yq*jfRuWeAOlC zV`I0+C!QJ(HgDgysce_#_05GRdoEn<7M1SUw)2aR&7I=wJ%Z7(2UE|dzt*hz-`u;Z zigk}4KYB45xN5C3cgvT$rp}t$%In>ghMGkWpIFCC+K8AnXN~1)d8JLpZsWo7J^Dk1 zrF-7Ic|G~FE^l*6d6j;4_U--g@kdWy#Y74c(h7%8lqJQwEewkrJV7oE^*Xs9Gc?pa zynlCY_D!R1`@6Zfrw?Kc`tldo^mqSLHGNBBv)KRu;#tOf0wDVb|2P3Gn|c>nSyipA zsjb^xE%c7dN=fKGo2+f z9bMfS89ciThD4ebf837<=(}ccOtn)$Y&JXwLn3>rBS{qfa{WP#Fpd`jAmq!bX9xs4 z1j=REerbYLaq8pI zKLKEzTv3KU$X(3Y>;NPiwgP7sE1kGE?%Y%x$p38gzz$@%s`Y3qNE%rqSq=QxO-Ajm zLwP=--;T<#Hcixtrd@)e6R)LuemIq$4&@LV+SoR?Ib~=5O41HJcp-R$dcdKtRwc;B z`k&s_LpjNy@Z;TVuJ0|>;3ayNO+sW#_OK*ICtAAFH=L-9YA8Lho`oGO3w@;6_#m@( ze5G!Sckq~X2FvYzHj={2NNkxnE#j=&O4qN;C$&<>(MgNq+rE9m1@Uj@H=Q4_Q$&Rc zxJl5JHdpsNJ)a_`3OIgNc6!eDmc1A2TIF@!eFP9ndtaq9#azU^0oK?8E4K(29%_1FHG62#$OxSvj~1mf;jjAE`Ef zi>GhYK|X9X07kBba$f880@$x$V-O^&<+2266%As3T8k04!wtqxj=jVw+6RAZQNRI1 z?JP)zVhRQj5x|R60v}=Iw-8JQH~*g2v$%zZ?cJ?^RdJXg8*oC-rr;2eKvA$#t%%q9 z^%6|qnU%&R3{Qy>cQ0mtQ0d~UI<+^8b(~@ZaH^m@PH-WBF7VTaS+%!?$B*cF=T1@zvZXDKQ{|i?4LXo$r~= zk<&cI)!_@LJRk;7X|5GU5(U3TF0z_=&rL30xFGzZZCU|k{QM#}ad?}VJ7ZyNsPHK% z(QenrShBQZF=KMhaC_ZYnC04|t~&@2WY=%5kJk_w@(W9KQ1X zT@VLjK*5Q{pVd{?AxNQeAYR}9JZo-er%x+8zc1Z`|4FD*{dj4>t+!D z^HKEEF`P9&u_U-x4ID(Pph6lQ8JS=^AGotzc4Sc4CDtD3QKL!>y7Ms*iJ>D3} zr#NYbrgWXU>RqyU&(qpu7dNX`_67p00-dSS-ZrB|c`Q-8H)KI{FTM1lNs5vYv zfIL!a{lYj-;(RP6p@_NA|B64-MTMN*jEHC27;)VF;wR;dkGs~ANuol6CJsdE=vZOm5y+#S?m^j)0hozZ@_I)ljS?$S=(L-MYMfL|b - - - 1.0 - -